主要内容

在Matlab中使用ROS 2签署后面的机器人

此示例显示了如何使用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

设置ROS 2通信

使用指定的域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]'% 蓝色

使用StateFlow®Chart创建以下控制器的标志

此示例提供了一个示例帮助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的机器人模拟器中移动的机器人,如下所示。