这个示例向您展示了如何配置一个Simulink模型,以从单独的基于ROS的模拟器(如金宝appGazebo®)在ROS 2上发送和接收信息。
可以使用Simulink金宝app连接到支持ros的物理机器人或支持ros的机器人模拟器,例如露台.这个例子展示了如何:
配置Simulink金宝app以使用ROS 2连接到单独的机器人模拟器
向模拟机器人发送速度命令
接收来自模拟机器人的位置信息
这是模型您将在本例中创建。
open_system (“robotROS2ConnectToRobotExample”);
先决条件:从ROS 2开始,与ROS 2发布者和订阅者交换数据,在Simulink®中开始使用ROS 2金宝app
在本任务中,您将为差动驱动机器人启动一个基于ROS的模拟器,以及一个ROS桥,该桥通过ROS 2网络重放ROS消息。
启动Ubuntu®虚拟机桌面虚拟机与ROS 2旋律和Gazebo.
在Ubuntu桌面上,点击“”露台空的图标,开始了凉亭的世界。
点击"ROS桥图标,在ROS和ROS 2网络之间传递信息。
模拟器接收和发送以下主题的消息:
接收geometry_msgs /扭
/cmd_vel主题上的速度命令消息。
发送nav_msgs /测程法
消息/奥多姆
的话题。
从模拟选项卡准备画廊,点击ROS网络下ROS工具箱.
在配置ROS网络地址对话框,在Domain ID (ROS 2),设置ID来25
.这个ID值与Ubuntu虚拟机上ROS 2网络的domain ID相匹配,ROS网络中Gazebo的消息在Ubuntu虚拟机上被接收。
创建一个向模拟器发送控制命令(线速度和角速度)的发布者。通过使用使这些速度可调滑块获得块。
ROS使用右手坐标系,所以x轴是正向的,y轴是向左的,z轴是向上的。控件发送控制命令geometry_msgs /扭
消息,linear.x
表示线性前进速度(以米/秒为单位),和angular.z
表示绕z轴的角速度(以弧度/秒为单位)。
打开一个新的Simul金宝appink模型。
在应用程序选项卡,在控制系统,点击机器人操作系统.
在机器人操作系统(ros)对话框中,单击选择ROS网络并选择机器人操作系统2 (ROS 2).
从ROS工具箱>ROS 2选项卡,拖动发布模型块。双击。
集课题来源来指定您自己的.输入/ cmd_vel
在主题字段。点击选择旁边消息类型中,选择geometry_msgs /扭
从下拉列表中,单击好吧.
从ROS工具箱>ROS 2选项卡,删除一个空白的信息模型块。双击。
点击选择旁边消息类型并选择geometry_msgs /扭
.
集样品时间来0.01
并点击好吧.
从金宝app>信号路由选项卡,拖动总线分配模型块。
的输出连接空白的信息块的公共汽车
输入的总线分配块,公共汽车
的输入的输出发布块。
从建模选项卡上,单击更新模型确保总线信息被正确传播。忽略以下错误:“在总线分配块中‘untitled/Bus Assignment’中选定的信号‘signal1’不能在输入总线信号中找到”。下一步将解决这个错误。
双击总线分配块。选择???
signal1
在右侧列表框中单击删除.在左侧列表框中,展开两者线性
和角
属性。选择线性>x和角>z并点击选择.点击好吧关闭块掩码。
添加一个常数块,获得块,两个滑块获得块。如图所示将它们连接在一起,并设置获得价值-1.
设置线速度滑块的限制和当前参数为0.0
来2.0
,1.0
分别。设置转向增益滑块的相应参数为-1.0
来1.0
,0.1
.
创建一个订阅者来接收发送到/奥多姆
的话题。您还将提取机器人的位置,并在xy平面上绘制它的路径。
从ROS工具箱>ROS 2选项卡,拖动订阅模型块。双击。
集课题来源来从ROS网络中选择,然后单击选择旁边的主题盒子。选择“/odom”作为主题,点击好吧.请注意消息类型nav_msgs /测程法
自动设置。
从金宝app>信号路由选项卡,拖动总线选择器模型块。
连接味精
的输出端口。订阅控件的输入端口总线选择器块。在建模选项卡上,单击更新模型确保总线信息被正确传播。
双击总线选择器块。选择???
signal1
和???
signal2
在右侧列表框中单击删除.在左侧列表框中展开构成>构成>位置并选择x和y.点击选择然后好吧.
从金宝app>汇选项卡中,拖动XY图模型块。连接X
和Y
的输出端口总线选择器控件的输入端口XY图块。
下图显示了完成的模型。一个预先配置的模型是为了方便您。
从建模选项卡上,单击模型设置.在解算器窗格中,设置类型来固定步和固定的大小来0.01
.
设置模拟停止时间为正
.
点击运行开始模拟。
在模拟器和XY图中,您应该看到机器人在圆周上移动。
当模拟运行时,更改值滑块获得控制机器人的方块。双击XY图块并更改X
和Y
如果需要,轴限制(您可以在模拟运行时执行此操作)。
要停止模拟,单击停止.