本篇文章介绍一下如何在Ubuntu中实现MATLAB与ROS的通讯,主要分为四部分:一、建立MATALB与ROS的通讯、二、使用MATLAB观测ROS中小乌龟的运动信息、三、使用MATLAB发布指令控制小乌龟运动、四、利用MATLAB生成ROS代码,实现对小乌龟运动的控制。


   一、建立MATALB与ROS的通讯

   1、在终端输入以下命令查看本机地址

  ifconfig 

这时候有的小伙伴会像我一样报错:

   Command ‘ifconfig’ not found, did you mean: command ‘ifconfig’ from deb net-tools (1.60+git20180626.aebd88e-1ubuntu1)Try: sudo apt install

这是由于没有安装net-tools造成的,按照提示输入以下命令安装就可以了

sudo apt install net-tools

 这时候再次输入ifconfig命令就可以查看了,如下图所示我目前的IP是192.168.3.128

2、将本机IP写入到.bashrc文件

   打开home文件夹,按Ctrl+h显示隐藏的文件,选择.bashrc并打开(注意并不一定是在home文件夹下,如果没有就往下一级看看有没有,比如我的就在home/jzx/ 下,并没有在home文件夹下)
   打开后在最后加入以下命令(后面的IP改为你的电脑的IP),然后保存退出

export ROS_IP=192.168.3.128

3、启动roscore,并获取ROS输出的IP

   在终端输入roscore启动,可以发现此时roscore会输出一个IP如下图所示:

4、打开MATLAB,建立与ROS的连接

   在MATLAB的命令行窗口输入以下语句,后半部分就是我们上一步得到的ROS输出的IP

setenv('ROS_MASTER_URI','http://jzx-virtual-machine:11311') 

 在MATLAB的命令行窗口输入rosinit,得到以下反馈信息,说明MATALB与ROS已经成功建立连接

二、使用MATLAB观测ROS中小乌龟的运动信息

   1、在终端输入 rosrun turtlesim turtlesim_node,启动turtlesim,然后在另一个终端下输入rosrun turtlesim turtle_teleop_key,启动键盘控制节点

 2、在终端输入rostopic list,查看目前ROS启动的节点,控制小乌龟运动的是/turtle1 /cmd_vel

 3、打开simulink,找到ROS部分,选择Subscribe工具包

  4、双击Subscribe工具包,按下图所示,选择订阅控制小乌龟运动的/turtle1 /cmd_vel

5、Subscribe工具包的isnew接口接Terminator,Msg接口接解析Bus Selector

terminator的作用是终止未连接的输出端口。使用Terminator模块去盖住不与其他模块连接的模块的输出。执行仿真时如果有不与输出相连的模块,simulink发出警告消息。使用Terminator模块可以阻止警告消息弹出。
   Bus selector可用于选择总线信号的一个或多个,双击该模块,按下图所示,将小乌龟的线速度和角速度都添加到Selected elements,点击确定。

 6、按下图所示进行连接,使用Scope去观测小乌龟运动的线速度和角速度

将仿真时间改为inf,如下图所示:

在键盘控制节点所在的终端,使用↑↓←→去控制小乌龟运动,然后通过Scope去观测其线速度和角速度,如下所示:

在这里插入图片描述

 通过分析我们其实很容易得到,在上面的运动中,其实只有X轴上有线速度,Z轴上有角速度,因此我们再放置一个示波器只观测这两个信息,如下图所示,上面的波形是X轴的线速度,下面的波形是Z轴的角速度,当小乌龟前进时X轴线速度为2,后退时为-2,当小乌龟逆时针旋转时角速度为2,顺时针为-2

在这里插入图片描述

三、使用MATLAB发布指令控制小乌龟运动

   1、在终端输入下面的第一条指令,可以查看与控制小乌龟运动的消息类型,在终端输入下面的第二条指令,可以进一步查看该消息具体变量,可以发现,我们只需要在matlab中发布和修改geometry_msgs/Vector3 linear中的float64 x和geometry_msgs/Vector3 angular中的float64 z的数值就可以改变小乌龟的运动状态

rostopic info /turtle1/cmd_vel
rosmsg show geometry_msgs/Twist

2、同样是在simulink的ROS工具包内,这次选择Blank Message模块

   简单介绍一下Blank Message模块的作用:Blank Message模块用指定的消息或服务类型创建一个空白消息。Msg块的输出是一个空白的ROS消息(总线信号)。设置Class参数来选择ROS消息、服务请求和服务响应消息。这里我们使用的是ROS消息(总线信号)。可以使用总线分配块来修改总线信号中的特定字段。总线信号被初始化为零值(接地)。

  3、双击打开后按下图所示操作,选择Twist,点击确定

 4、我们想要发布信息还需要Publish模块,双击打开后按下图所示,因为我们是要发布给/turtle1/cmd_vel去控制小乌龟运动,所以这里选择/turtle1/cmd_vel话题,点击确定

 5、上面的我们提到了Blank Message输出是一个空白的ROS消息(总线信号)我们可以使用总线分配块(Bus Assignment)来修改总线信号中的特定字段。所以我们还需要一个Bus Assignment模块

这个模块接受一个总线作为输入,并允许总线中的元素被分配新的值。左边的列表框显示了输入总线中的元素。使用选择按钮来选择要分配的元素。使用向上、向下或移除按钮重新排列选择。

   这里选择我们需要的X轴线速度和Z轴角速度,按下图所示操作:

  6、按下图所示连接,这里我们将线速度设置为常数10和角速度设定为常数7(速度均可根据需要自行设定)

同样要把仿真时间改为inf

我们来看一下效果:

在这里插入图片描述

四、利用MATLAB生成ROS代码,实现对小乌龟运动的控制

   当我们用simulink完成控制程序的搭建后,我们期望下一次可以直接对ROS进行控制,而不是每次都需要启动matlab和simulink,因此我们可以使用simulink的代码生成器,生成ROS代码
   1、生成代码前需要进行如下的设置
   (1)按下图所示,打开设置,选择Hardware implementation,然后选择Robot….(ROS

(2)按下图所示,检查Solver中的Type是否为Fixed-step

(3)保存一下,准备工作完成

   2、按下图所示,打开Build Model

完成后会生成一个sh文件和一个tgz文件

 3、找到以上文件所在的文件夹,右键在终端打开,输入以下指令

./build_ros_model.sh ROStest2.tgz ~/catkin_ws/

  (1)如果你之前没有建立过catkin_ws,会报以下错误,按照提示创建依次输入以下三条指令去创建catkin_ws

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace

(2)创建完工作空间后,还需要去编译工作空间,依次输入以下三条指令

cd ~/catkin_ws/
catkin_make
catkin_make install

 (3)编译工作空间之后,还需要设置环境变量,输入以下指令:

source devel/setup.bash

(4)设置环境变量之后,输入以下指令去检查一下

echo $ROS_PACKAGE_PATH

(5)我们顺便建立一个功能包,功能包是ROS里面放置源码的最小单元,所有的源码必须放到功能包下面,不允许直接放在src文件夹下,用catkin_create_pkg命令创建功能包,后面跟的第一个参数是功能包的名字,后面的参数是这个功能包的依赖,也就是这个功能包需要用到ros里面的那些其他的功能包,因为要用c++编程所以要添加依赖roscpp,因为要用Python编程,所以要添加依赖rospy ,标准的消息结构std_msgs ,创建的功能包要放在src文件夹下,添加完功能包后,我们返回到catkin_ws目录下,再对工作空间进行编译,就会把刚才添加的功能包也编译了。只有设置了环境变量后才能让系统找到我们的工作空间 ,用命令echo $ROS_PACKAGE_PATH来检查我们创建的环境变量
   上面那段话是帮助大家理解的,操作的的话,只需要按顺序输入以下指令就可以了(功能包的名字可以任取)

cd ~/catkin_ws/src
catkin_create_pkg test_ros_matlab std_msgs rospy roscpp
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash

关于工作空间及功能包的创建及编译本文介绍较略,详情可见我之前写过的文章:ROS学习笔记——-创建工作空间与功能包 (点击可跳转)

完成上面的操作后,此时再返回去执行下面这条指令就可以了

 ./build_ros_model.sh ROStest2.tgz ~/catkin_ws/ 

可以查看一下,我们需要的节点已经编译成功了

 4、由于我们在工作空间内添加了新的内容,因此需要执行下面的指令去编译工作空间,并设置环境变量

cd ~/catkin_ws/
catkin_make
source ~/catkin_ws/devel/setup.bash 

 5、这个时候我们打开一个新的终端,依次输入以下指令,执行我们生成的节点去控制小乌龟运动(按理说只需要执行第二条语句,但是我这边一直找不到rostest2功能包,所以再设置一遍环境变量)

source ~/catkin_ws/devel/setup.bash
rosrun rostest2 rostest2_node

在这里插入图片描述

 可以发现小乌龟按照我们在simulink里编写的程序进行运动了,借助simulink的代码生成功能,生成了具备相同控制效果的ros代码,这样就不需要再启动matlab了。