ROS与Matlab语言入门教程-从Simulink连接到ROS使能的机器人
用户可以使用Simulink连接到一个物理机器人或者ROS使能的机器人仿真器,如Gazebo,用户将在本例程学习如下内容:
- 配置Simulink以连接到使用ROS的单独机器人仿真器;
- 发送速度命令到仿真机器人;
- 从仿真机器人接收位置信息。
下面是用户将在本例程中创建的模型,如图2.2.1所示。
任务1-启动机器人仿真器
本任务中,用户将启动一个基于ROS的仿真差动机器人仿真器,该仿真器在如下的主题接收和发送消息:
在“/mobile_base/commands/velocity”主题上,接收“geometry_msgs/Twist”类型的速度指令消息。
以“nav_msgs/Odometry”类型的消息,发送里程计的信息到“/odom”主题。
有如下两种方式设置基于ROS的仿真器:
- 方式一:在MATLAB中的仿真器
该方式使用一个简单的基于MATLAB的仿真器,绘制机器人的当前位置到一个单独的图像窗口。
在MATLAB命令行输入“rosinit”指令,这将创建一个本地的ROS主控节点,网络地址(URI)为http://localhost:11311。
输入“ExampleHelperRobotSimulator”启动机器人仿真器,打开一个图像窗口如图2.2.2所示。
- 方式二:Gazebo仿真器
该方式使用一个“Gazebo”中的仿真器“TurtleBot”。
参阅“开始使用Gazebo和仿真TurtleBot”获取有关设置Gazebo环境的说明。
在虚拟机上的Ubuntu桌面上,点击“Gazebo Empty”图标。
注意ROS主控节点的网络地址(URI)类似:http://192.168.84.128:11311。
用户可以通过在Ubuntu的终端窗口输入“rostopic list”,验证Gazebo的环境设置是否正确,应该可以看到话题列表包含了“/mobile_base/commands/velocity”话题和“/odom”话题。
任务2-配置Simulink以连接到ROS网络
(1)从模型菜单,选择“Tools > Robot Operating System (ROS) > Configure Network Addresses”,如图2.2.3所示。
(2)在“ROS Master”区域,下拉“Network Address”的内容并选择“Custom”。
如果用户选择方式一(MATLAB 仿真器),确保“Hostname/IP Address”设置为“localhost”,“Port”设置为“11311”。
如果用户选择方式二(Gazebo 仿真器),指定Gazebo中ROS主控节点的IP地址和端口号码,例如http://192.168.60.165:11311,那么在“Hostname/IP address”中输入“192.168.60.165”,在“Port”中输入“11311”,如图2.2.4所示。
任务3-发送速度指令到机器人
本任务中,用户将会创建一个发布器用于发送控制命令(线性和角度速度)到仿真器。用户可以使用“Slider Gain”块使得这些速度是可调的。ROS使用右手坐标系统,那么X代表前方,Y代表左侧而Z代表上方。控制指令使用“geometry_msgs/Twist”消息传输,此处“Linear.X”表示前向线性速度(m/s),“Angular.Z”表示绕Z轴的角速度(rad/s)。
打开一个新的Simulink模型。
从库浏览器的“Robotics System Toolbox”选项卡,拖放一个“Publisher”会到模型中并双击。设置“Topic source”域到“Select From ROS network”,点击“Topic”域旁边的“Select >>”,选择“/mobile_base/commands/velocity”并点击“OK”,注意,消息类型“geometry_msgs/Twist”是自动设定的。
从库浏览器的“Robotics System Toolbox”选显卡,拖放一个“Blank Message”块到模型中并双击。点击“Message type”旁边的“Select >>”,选择“geometry_msgs/Twist”并点击“OK”。
从库浏览器的“Simulink > Signal Routing”选项卡,拖放一个“Bus Assignment”块到模型中。
按如下方式连接“Blank Message”,“ Bus Assignment”和“Publish”:点击“Simulation > Update Diagram”确认总线消息是否正确的传播。用户可能得到一个错误信息“Selected signal 'signal1' in the Bus Assignment block 'untitled/Bus Assignment' cannot be found in the input bus signal”。该错误是预料中的事,因为将要在下一步得到解决。
双击“Bus Assignment”块,在右侧列表中选择“??? signal1”并点击“Remove”。在左侧列表,展开“Linear”和“Angular”属性,选择“Linear > X”和“Angular > Z”并点击“Select>>”,点击“OK”关闭块。
增加一个“Constant”块、一个“Gain”块和两个“Slider Gain”块,将它们连接起来,如图2.2.7所示,并设“Gain”的值为-1(双击“Gain”)。
设置“Slider Gain”块的限制值和当前值,如图2.2.8所示。
任务4-从机器人接收定位信息
本任务中,用户将会创建一个订阅器接收被发送到“/odom”话题的消息,还会提取机器人的(X,Y)坐标并绘制机器人的路径。
从库浏览器的“Robotics System Toolbox”选项卡,拖放一个“Subscribe”块到模型中并双击。设置“Topic source”域到“Select From ROS network”,点击“Topic”域旁边的“Select>>”并选择话题为“/odom”并点击OK。注意,消息类型“nav_msgs/Odometry”是自动设定的。
从库浏览器的“Simulink > Signal Routing”选项卡,拖放一个“Bus Selector”块到模型中,连接“Subscribe”块的输出端口到“Bus Selector”块的输入端口,点击“Simulation > Update Diagram”确认总线的信息是否正确传播。
双击“Bus Selector”块,在右侧的列表选择“??? signal1”和“??? signal2”并点击“Remeve”。在左侧的列表,展开“Pose > Pose > Position”并选择“X”和“Y”,点击“Select>>”并点击“OK”。
从库浏览器的“Simulink > Sinks”选项卡,拖放一个“XY Graph”块到模型中。将“Bus Selector”的输出端口连接到“XY Graph”的输入端口。
整个模型应看起来如如2.2.10所示。方便起见,包含了一个预先配置的模型。
任务5-配置和运行模型
本任务中,用户将会配置并运行模型。
点击“Simulation > Model Configuration Parameters”,在“Solver”面板,设置“Type”为“Fixed-step”,“Fixed-step size”的值为0.01。
设置仿真停止时间为“inf”。
点击“Play”按钮开始仿真,一个XY图将会出现。在仿真器和XY图,用户应该能够看到机器人绕圆周运动。
在仿真运行的过程中,改变“Slider Gain”块的值以控制机器人,如果机器人跑出XY图的范围,双击“XY Graph”块并改变X和Y轴的限度值(仿真运行期间还可以更改)。
点击“Stop”按钮,停止仿真。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号