此示例显示了如何使用MATLAB®在ROS 2网络上控制在基于ROS的模拟器上运行的模拟机器人。
在此示例中,运行一个MATLAB脚本,该脚本实现符号之后的算法,并控制模拟机器人以遵循基于环境中的符号的路径。该算法从模拟机器人接收位置信息和相机信息,该机器人在基于单独的ROS的模拟器中运行。该算法检测标志的颜色并发送速度命令以基于颜色转动机器人。在此示例中,算法旨在当机器人遇到蓝色标志时左转,然后机器人遇到绿色标志时右转。最后,机器人在遇到红色标志时停止。
要使用ROS 1或Simulink®查看此示例,请参阅金宝app在Matlab中使用ROS签署后面的机器人。
为差分驱动机器人启动基于ROS的模拟器,并使用机器人模拟器配置MATLAB®连接。
要遵循此示例,请使用说明下载虚拟机开始凉亭和模拟的火炬。
启动Ubuntu®虚拟机桌面。
在Ubuntu桌面中,单击凉亭ROS2迷宫图标以启动为此示例而建造的凉亭世界。
在matlab命令窗口中,设置ros_domain_id.
环境变量到25.
匹配机器人模拟器ROS桥接设置并运行ROS2主题列表
要验证机器人模拟器的主题在Matlab中可见。
setenv('ros_domain_id'那'25')ROS2('话题'那'列表')
/ Camera / Camera_Info / Camera / Image_raw / Clock / Cmd_vel / IMU / Connt_states / Odom / Parameter_Events / Rosout / Scan / TF
使用指定的域ID创建ROS 2节点。
DomainID = 25;n = ros2node(“matlab_example_robot”,DomainID);
创建发布者和订阅者以通过ROS 2网络从机器人模拟器中继邮件。您需要对图像和内径数据的订阅者。要控制机器人,请设置发布者以使用速度命令使用/ cmd_vel.
话题。
imgsub = ros2subscriber(n,“/ camera / image_raw”那“sensor_msgs /图像”);odomsub = ros2subscriber(n,“/ odom”那“nav_msgs / odometry”);[velpub,velmsg] = ros2publisher(n,“/ cmd_vel”那“geometry_msgs / twist”);
定义图像处理颜色阈值参数。每行定义不同颜色的阈值。
colorthresholds = [100 255 0 55 0 50;......% 红色的0 50 50 255 0 50;......% 绿0 40 0 55 50 255]'% 蓝色
此示例提供了一个示例帮助MatlabStateFlow®图表,其占据了图像大小,从处理的图像坐标,机器人测量仪姿势。该图表提供了线性和角速度,以基于这些输入驱动机器人。
控制器= exampleHelpersignfollowingControllerchart;打开('examplehelpersignfollowingcontrollerchart');
本节运行控制器接收图像并将机器人移动以遵循标志。控制器执行以下步骤:
获取来自ROS网络的最新图像和OCOMOTRY消息。
运行algoritm以检测图像特征(examplehelpersignfollowingprocessimg
)。
使用StateFlow®Chart生成控制命令步
。
将速度控制命令发布到ROS网络。
为了可视化机器人看到的蒙版图像,更改值愚蠢化
变量到真的
。
examplehelpersignfollowingsetuppreferences;%控制掩模的可视化Dovisualization = false;r = RATECONTROL(10);接收(IMGsub);在开始循环之前,%等待在循环之前接收图像消息接受(OdomSub);尽管(~cliner.done)%获得最新传感器消息并处理它们imgmsg = imgsub.latestmessage;odommsg = odomsub.latestmessage;[img,pose] = examplehelpersignfollowingprocessmsg(imgmsg,odommsg);%运行视觉和控制功能[掩码,blobsize,blobx] = examplehelpersignfollowingprocessimg(img,colorthresholds);步骤(控制器,'blobsize',blobsize,'blobx',blobx,'姿势',姿势);v = controller.v;w = controller.w;%发布速度命令velmsg.linear.x = v;velmsg.angular.z = w;发送(Valpub,Velmsg);%可选择可视化%注意:可视化数据将减慢执行循环。%如果您有计算机Vision工具箱,我们建议使用%Vision.deplyableVideoplayer而不是imshow。如果Dovisualization imshow(面具);标题(['线性vel:'num2str(v)'角度vel:'num2str(w)]);rawingow('limitrate');结尾%pace执行循环。等待(r);结尾
您应该看到在基于ROS的机器人模拟器中移动的机器人,如下所示。