MATLAB与Robotstudio建立socket通信_robotstudio与matlab通信-程序员宅基地

技术标签: matlab  

MATLAB与Robotstudio建立socket通信

内容概括

哈哈,本人人生中的第一篇博客,也算是向博客大佬们看齐的第一个步伐啦,话不多说,直奔主题,这篇写的是这两天做的MATLAB与RobotStudio建立socket通讯的一个实例,机器人可以发位置数据给MATLAB,MATLAB也可以发送想要到达的目标位置点给机器人让机器人动作,当然,这只是这两天做的一个初步的成果,有待改善和添加的功能还很多。。。

方法和思路

首先,我是看了这个博客大佬的写的MATLAB与Robotstudio建立socket通信这篇文章,根据这个小case写的,当然,该博主后期也写了很多很厉害的实例出来,奈何本人能力有限,先从基础的练起来(认真脸)!!!
有了小case之后,就理了下思路,查找那个博主的思路来源,是西班牙的一篇论文,名字和PDF版可以去那位博主的博客上去找(论文是西班牙语,是时候掏出翻译软件了!)。该论文讲述了MATLAB三种方法来实现该功能,分别是GUI、CLASS和Simulink,由于是探索阶段,本文准备用最简单最直观的MATLAB GUI的方法来实现。另外,论文中所说MATLAB需要两个工具包,一个是外国的Peter Corke大佬写的工具箱Robotics Toolbox,他的个人主页上可以免费下载(这个人写的书也是很厉害的,推荐学机器人的去康康),但是好像需要科学上网,另外一个工具箱是MATLAB里的Instrument Control Toolbox(一般都会有)。
准备工作做好之后,我的大致步骤是:
1.按照case,MATLAB和Robot Studio之间先建立基本的通讯,即能够互相简单的发一串字符串给对方。
2.简单粗略的学习一下MATLAB GUI的知识,推荐视频一把王者荣耀的时间,让你学会MATLAB GUI,哈哈,真的就学了一会,能用起来,但是界面做的并不美观,后期再深造一下吧哈哈。
3.实验在RobotStudio中获取当前机器人的位置,并发送过去。
4.实验在MATLAB中转换四元数,把位置数据和四元数统一成一个文件包发送给RobotStudio。
5.改进程序,使得通信能够互相协调。

实践成果

界面展示

话不多说,先放上基本的界面,由于初次写博客,动图还不知怎么加上去,反正基本的要求都能实现了,根据这张图可以自行想象一下动态过程~~
GUI界面
如图所示,在RobotStudio(作为Sever)中先运行写好的程序,再运行MATLAB(作为Client),输入IP地址和Port号点击Connect,会弹出运行成功的窗口,此时,机器人已经把它的位置发过来了,并展现在Position栏的文本框中,用户可以输入目标点信息(X、Y、Z位置信息和RX、RY、RZ工具姿态),点击SendTCP之后,发送给Robot,Robot就会MoveJ到相应的位置,当然,用户并不能随意输入,因为机器人很多的位置和姿态都是到达不了的,还有奇异值等问题,用户需要根据实际情况合理的输入目标点位置和姿态数据。在Robot到达你所指定的位置之后,会发送给界面它目前所在的位置,即Position一栏会更新位置信息,便于实时的监控机器人的位置信息。

代码展示

还是直接上代码来的利索,先说一下RS那边的代码吧,RS中一定要选择616-1 PC Interface(进行Socket通讯)和623-1 Multitasking(多任务执行)这两个选项,因为RS中通讯和机器人运动是同时进行的,所以要选择这个选项。先展示下机器人通讯的主要代码:

PROC Routine()
        SocketCreate temp_socket;
        SocketBind temp_socket,"127.0.0.1",1025;
        SocketListen temp_socket;
    
        ! Waiting for a connection request
        SocketAccept temp_socket,client_socket;
        ! Communication
        WHILE keep_listening DO
            !Calculate current position
            Current_Pose:=CRobT(\TaskRef:=robot_motionId\Tool:=tool0\WObj:=wobj0);
            send_string:=ValToStr(Current_Pose.trans);
            !Send current position to matlab
            SocketSend client_socket\Str:=send_string+"\0D\0A";
            !Receive the TCP data from matlab
            receive_status:=FALSE;
            SocketReceive client_socket\Str:=received_string;
            received:=received_string;
            receive_status:=TRUE;
            WaitTime 1;

        ENDWHILE    
        SocketClose client_socket;        
        SocketClose temp_socket;
    ENDPROC

RAPID程序好像不太支持Markdown,凑合看吧。。。
这里程序的这一行值得说一下 :

SocketSend client_socket\Str:=send_string+"\0D\0A";

一开始我是没有加这一部分的+"\0D\0A",这样就导致了MATLAB收一条信息要很久,而且会报出如下的警告:
警告
经过排查原因,是终止符的原因,查取ABB的随机光盘得知,RS里的终止符合一般的终止符不一样,并不是回车换行符/s/n,属于不可打印字符,即ASSCII码的特殊字符,如回车换行符为“\0D\0A”,因为MATLAB不认识这个终止符,导致很久都找不到结尾在哪里,并且出现警告,反正加上就好啦,飕飕的~~
接着是解析转换发送字符串的代码(没来得及写注释,先放着吧)。。

PROC encode_string()
        Strread:=received;
        LenString:=StrLen(Strread);

        StartBit1:=1;
        EndBit1:=StrFind(Strread,StartBit1,",");
        LenBit1:=EndBit1-StartBit1;

        StartBit2:=EndBit1+1;
        EndBit2:=StrFind(Strread,StartBit2,",");
        LenBit2:=EndBit2-StartBit2;

        StartBit3:=EndBit2+1;
        EndBit3:=StrFind(Strread,StartBit3,",");
        LenBit3:=EndBit3-StartBit3;

        StartBit4:=EndBit3+1;
        EndBit4:=StrFind(Strread,StartBit4,",");
        LenBit4:=EndBit4-StartBit4;

        StartBit5:=EndBit4+1;
        EndBit5:=StrFind(Strread,StartBit5,",");
        LenBit5:=EndBit5-StartBit5;

        StartBit6:=EndBit5+1;
        EndBit6:=StrFind(Strread,StartBit6,",");
        LenBit6:=EndBit6-StartBit6;

        StartBit7:=EndBit6+1;
        EndBit7:=StrFind(Strread,StartBit7,",");
        LenBit7:=EndBit7-StartBit7;

        StartBit8:=EndBit7+1;
        EndBit8:=StrFind(Strread,StartBit8,",");
        LenBit8:=EndBit8-StartBit8;

        data_type:=StrPart(Strread,StartBit1,LenBit1);
        XData:=StrPart(Strread,StartBit2,LenBit2);
        YData:=StrPart(Strread,StartBit3,LenBit3);
        ZData:=StrPart(Strread,StartBit4,LenBit4);
        q1Data:=StrPart(Strread,StartBit5,LenBit5);
        q2Data:=StrPart(Strread,StartBit6,LenBit6);
        q3Data:=StrPart(Strread,StartBit7,LenBit7);
        q4Data:=StrPart(Strread,StartBit8,LenBit8);

        DataTRUE:=StrToVal(XData,x);
        DataTRUE:=StrToVal(YData,y);
        DataTRUE:=StrToVal(ZData,z);
        DataTRUE:=StrToVal(q1Data,q1);
        DataTRUE:=StrToVal(q2Data,q2);
        DataTRUE:=StrToVal(q3Data,q3);
        DataTRUE:=StrToVal(q4Data,q4);

    ENDPROC

接着是机器人移动的代码:

PROC main()
        ! Wait the receive string
        WaitUntil receive_status;
        ! Received string convert into data
        encode_string;
        ! Give the data to the Target
        IF DataTRUE THEN
            Target_20.trans.x:=x;
            Target_20.trans.y:=y;
            Target_20.trans.z:=z;
            Target_20.rot.q1:=q1;
            Target_20.rot.q2:=q2;
            Target_20.rot.q3:=q3;
            Target_20.rot.q4:=q4;
            Data_Assignment:=TRUE;
        ELSE
            TPWrite "Problems with data conversion!";
        ENDIF
        WaitUntil Data_Assignment;
        ! Make the robot move to the desire position
        MoveJ Target_20,v1000,z20,tool0;
    ENDPROC

然后是MATLAB这边的代码,由于控件代码太长了但很简单,就只展示重要控件CallBack函数的代码:

%Connect按钮的Callback
function Connect_to_Robot(~,~)
global GUI
global IP
global Port
global client_socket
IP=get(GUI.IP_Address,'String');
Port=get(GUI.Port_Address,'String');
Port=str2double(Port);
%connect to the robot
client_socket = tcpip(IP,Port);
fopen(client_socket);
msgbox('Successful Connected!')
message= fgetl(client_socket);
message=splitlines(message);
position=message{1,1};
set(GUI.Position_All,'String',position);
guidata(GUI.IP_Address,IP);
guidata(GUI.Port_Address,Port);
end

%TCP Send按钮的Callback
function TCP_button(~,~)
global GUI
global X
global Y
global Z
global RX
global RY
global RZ
global client_socket
X=get(GUI.X,'string');
Y=get(GUI.Y,'string');
Z=get(GUI.Z,'string');
RX=get(GUI.RX,'string');
RX_num=str2double(RX);
RY=get(GUI.RY,'string');
RY_num=str2double(RY);
RZ=get(GUI.RZ,'string');
RZ_num=str2double(RZ);
%计算四元数
Q=Quaternion(rotx(RX_num*pi/180)*roty(RY_num*pi/180)*rotz(RZ_num*pi/180));
%计算的数值转换成字符串
q1= num2str(Q.s);
q2= num2str(Q.v(1));
q3= num2str(Q.v(2));
q4= num2str(Q.v(3));
%字符串整合在一起
Send1=['1',',',X,',',Y,',',Z,',',q1,',',q2,',',q3,',',q4,','];
%发送给robot
fwrite(client_socket,Send1);
pause(1.5);
%读取返回的位置数据
message= fgetl(client_socket);
message=splitlines(message);
position=message{1,1};
set(GUI.Position_All,'String',position);
end

总结

核心代码都已奉上了,当然不足之处也有很多,该文也只实现了很简单的一些功能,后期还需要改进和完善,像那位博主一样,在界面上加上关节值的滚动条来使机器人动作也是能实现的,但是实时性对我来说还是个难题。而且,再大胆想象一下,改进轨迹规划的算法如果能利用这个通讯,在MATLAB中改进算法后就可以在RS中看到轨迹规划的真实场景了,再往后展望,和机器视觉结合起来,自动避障也是一个好的idea,当然,还需要更扎实的编程基础和算法知识,路漫漫其修远兮,希望未来能够做出来~
对本文有什么疑问的小伙伴也欢迎和我交流啊,互相进步互相学习,留言可能不及时看到,邮箱[email protected]~~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shuoerzi/article/details/109160976

智能推荐

【新手科研指南5】深度学习代码怎么读-小白阶段性思路(以手写数字识别应用为例)_深度学习程序怎么读-程序员宅基地

文章浏览阅读6.2k次,点赞6次,收藏26次。我是一个深度学习代码小白,请你用中文写上注释,能让我能轻松理解下面这段代码。注意包含所有函数、调用和参数的注释。以同样的python代码块样式返回你写的代码给我。代码看累了,就看《动手学深度学习》文档:基于PyTorch框架,从底层函数实现基础功能,再到框架的高级功能。努力上路的小白一枚,麻烦路过的大佬指导一二,同时希望能和大家交流学习~争取更新学习这个文档的专栏,记录学习过程。量身定做了一套话术hhh,亲身测试还不错。这个感觉更浅一点儿,之后复习看吧。20天吃掉那只Pytorch。_深度学习程序怎么读

Java学习路线图,看这一篇就够了!-程序员宅基地

文章浏览阅读2.7w次,点赞126次,收藏1.2k次。耗废1024根秀发,Java学习路线图来了,整合了自己所学的所有技术整理出来的2022最新版Java学习路线图,适合于初、中级别的Java程序员。_java学习路线

PCL_Tutorial2-1.7-点云保存PNG_pcl::io:savepng-程序员宅基地

文章浏览阅读4.4k次。1.7-savingPNG介绍代码详情函数详解savePNGFile()源码savePNGFile()源码提示savePNGFile()推荐用法处理结果代码链接介绍PCL提供了将点云的值保存到PNG图像文件的可能性。这只能用有有序的云来完成,因为结果图像的行和列将与云中的行和列完全对应。例如,如果您从类似Kinect或Xtion的传感器中获取了点云,则可以使用它来检索与该云匹配的640x480 RGB图像。代码详情#include <pcl / io / pcd_io.h>#incl_pcl::io:savepng

知乎问答:程序员在咖啡店编程,喝什么咖啡容易吸引妹纸?-程序员宅基地

文章浏览阅读936次。吸引妹子的关键点不在于喝什么咖啡,主要在于竖立哪种男性人设。能把人设在几分钟内快速固定下来,也就不愁吸引对口的妹子了。我有几个备选方案,仅供参考。1. 运动型男生左手单手俯卧撑,右手在键盘上敲代码。你雄壮的腰腹肌肉群活灵活现,简直就是移动的春药。2.幽默男生花 20 块找一个托(最好是老同学 or 同事)坐你对面。每当你侃侃而谈,他便满面涨红、放声大笑、不能自已。他笑的越弱_咖啡厅写代码

【笔试面试】腾讯WXG 面委会面复盘总结 --一次深刻的教训_腾讯面委会面试是什么-程序员宅基地

文章浏览阅读1.2w次,点赞5次,收藏5次。今天 (应该是昨天了,昨晚太晚了没发出去)下午参加了腾讯WXG的面委会面试。前面在牛客上搜索了面委会相关的面经普遍反映面委会较难,因为都是微信的核心大佬,问的问题也会比较深。昨晚还蛮紧张的,晚上都没睡好。面试使用的是腾讯会议,时间到了面试官准时进入会议。照例是简单的自我介绍,然后是几个常见的基础问题:例如数据库索引,什么时候索引会失效、设计模式等。这部分比较普通,问的也不是很多,不再赘述。现在回想下,大部分还是简历上写的技能点。接下来面试官让打开项目的代码,对着代码讲解思路。我笔记本上没有这部分代码,所_腾讯面委会面试是什么

AI绘画自动生成器:艺术创作的新浪潮-程序员宅基地

文章浏览阅读382次,点赞3次,收藏4次。AI绘画自动生成器是一种利用人工智能技术,特别是深度学习算法,来自动创建视觉艺术作品的软件工具。这些工具通常基于神经网络模型,如生成对抗网络(GANs),通过学习大量的图像数据来生成新的图像。AI绘画自动生成器作为艺术与科技结合的产物,正在开启艺术创作的新篇章。它们不仅为艺术家和设计师提供了新的工具,也为普通用户提供了探索艺术的机会。随着技术的不断进步,我们可以预见,AI绘画自动生成器将在未来的创意产业中发挥越来越重要的作用。

随便推点

Flutter ListView ListView.build ListView.separated_flutter listview.separated和listview.builder-程序员宅基地

文章浏览阅读1.7k次。理解为ListView 的三种形式吧ListView 默认构造但是这种方式创建的列表存在一个问题:对于那些长列表或者需要较昂贵渲染开销的子组件,即使还没有出现在屏幕中但仍然会被ListView所创建,这将是一项较大的开销,使用不当可能引起性能问题甚至卡顿直接返回的是每一行的Widget,相当于ios的row。行高按Widget(cell)高设置ListView.build 就和io..._flutter listview.separated和listview.builder

2021 最新前端面试题及答案-程序员宅基地

文章浏览阅读1.4k次,点赞4次,收藏14次。废话不多说直接上干货1.js运行机制JavaScript单线程,任务需要排队执行同步任务进入主线程排队,异步任务进入事件队列排队等待被推入主线程执行定时器的延迟时间为0并不是立刻执行,只是代表相比于其他定时器更早的被执行以宏任务和微任务进一步理解js执行机制整段代码作为宏任务开始执行,执行过程中宏任务和微任务进入相应的队列中整段代码执行结束,看微任务队列中是否有任务等待执行,如果有则执行所有的微任务,直到微任务队列中的任务执行完毕,如果没有则继续执行新的宏任务执行新的宏任务,凡是在..._前端面试

linux基本概述-程序员宅基地

文章浏览阅读1k次。(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。_linux

JavaScript学习手册十三:HTML DOM——文档元素的操作(一)_javascript学习手册十三:html dom——文档元素的操作(一)-程序员宅基地

文章浏览阅读7.9k次,点赞26次,收藏66次。HTML DOM——文档元素的操作1、通过id获取文档元素任务描述相关知识什么是DOM文档元素节点树通过id获取文档元素代码文件2、通过类名获取文档元素任务描述相关知识通过类名获取文档元素代码文件3、通过标签名获取文档元素任务描述相关知识通过标签名获取文档元素获取标签内部的子元素代码文件4、html5中获取元素的方法一任务描述相关知识css选择器querySelector的用法代码文件5、html5中获取元素的方法二任务描述相关知识querySelectorAll的用法代码文件6、节点树上的操作任务描述相关_javascript学习手册十三:html dom——文档元素的操作(一)

《LeetCode刷题》172. 阶乘后的零(java篇)_java 给定一个整数n,返回n!结果尾数中零的数量-程序员宅基地

文章浏览阅读132次。《LeetCode学习》172. 阶乘后的零(java篇)_java 给定一个整数n,返回n!结果尾数中零的数量

php 公众号消息提醒,如何开启公众号消息提醒功能-程序员宅基地

文章浏览阅读426次。请注意,本文将要给大家分享的并不是开启公众号的安全操作风险提醒,而是当公众号粉丝给公众号发消息的时候,公众号的管理员和运营者如何能在手机上立即收到消息通知,以及在手机上回复粉丝消息。第一步:授权1、在微信中点击右上角+,然后选择“添加朋友”,然后选择“公众号”,然后输入“微小助”并关注该公众号。2、进入微小助公众号,然后点击底部菜单【新增授权】,如下图所示:3、然后会打开一个温馨提示页面。请一定要..._php微信公众号服务提示

推荐文章

热门文章

相关标签