ROS探索总结(三十五)——Matlab中的ROS

  • 内容
  • 评论
  • 相关

 

众所周知Matlab是一款强大的数据处理工具,在科研、教学、商业领域广泛应用,不管你从事哪个行业的工作,多多少少都会用过或者听说过这款工具。Matlab有一个吊炸天的工具箱,几乎和哆啦A梦的口袋差不多,可以提供丰富而强大的扩展功能,其中有一个robotics工具箱,提供了一些机器人需要用到的工具,当然也包括ROS相关的工具。今天我们就来探索一下Matlab中的ROS工具如何使用吧

 

一、 ROS-MATLAB是什

Matlab中的robotics system toolbox提供了ROS的大部分功能,我们可以通过Matlab启动rosmaster,创建ROS节点,发布ROS消息/服务,查看ROS话题数据,控制ROS机器人等,更重要的是可以结合Matlab强大的功能,实现机器人算法设计和实现,直接接入ROS系统,结合gazebo或者V-REP完成仿真。我们将这个Matlab中的ROS工具包简称为ROS-MATLAB

image

上边这张框图就是ROS-MATLAB和机器人系统的通信框架,可以看到,Matlab拥有强大而丰富的算法功能包(视觉处理、控制系统、信号处理等等),通过ROS-MATLAB可以获取机器人的数据,在处理之后再将控制指令发送到机器人。简而言之,ROS-MATLABMatlab成为了机器人强大的计算后台

需要注意的是,ROS-MATLABMatlab2013之后的版本才有,而且需要Matlab安装robotics system toolbox,可以登录官网链接下载安装

 

二、ROS-MATLAB可以做什

那么ROS-MATLAB到底可以实现哪些ROS的功能?我们还是打开Matlab看一下

Matlab的命令窗口中,输入“help robotics.ros”,如果工具箱没有问题的话,可以看到如下命令列表,每个命令后边都进行了相应功能的说明

image

可以看打,ROS-MATLAB 提供了ROS大部分的命令

我们首先通过一个简单的例子对ROS-MATLAB有个大致的概念

运行例程的第一步是什么?当然是把roscore跑起来,在ubuntu里我们使用的是roscore命令,而在Matlab里边,我们需要使用rosinit命令

image

运行成功会有上图的提示

然后我们来运行例程 exampleHelperROSCreateSampleNetwork,输入命令后稍等一下例程就会启动,使用rosnoderostopic命令我们就可以查看节点和消息

image

是不是有一种在ubuntu下的穿越感,仿佛是一个运行在windows下的虚拟机一般

 

三、连接MatlabROS

上边的例程中,我们完全是在Matlab中运行了ROS masternode,在实际使用中,我们还是需要将Matlab连接到ROS系统的网络中。下面我们就来尝试一下

1.      确定IP

首先需要确定运行matlab和运行ROS的两台计算机的IP地址(必须在同一网络下)

本人运行matlabwin7计算机:使用ipconfig命令,找到有线网络的IP如下

image

ROS运行在虚拟机中,通过bridge的方式联网,使用ifconfig命令,找到网络IP如下

image

2.      Matlab中设置IP

然后,在ubuntu中运行roscore,在matlab中设置ROS master的路径,类似于多计算机运行ROS系统时候的配置

配置命令如下

image

3.      ROS->Matlab

现在路径已经配置完成,检查通讯是否建立。我们在ubuntu中启动一个talker

  1. rosrun roscpp_tutorials talker

接着在matlab中查看topic

image

可以看到,matlab中已经可以找到talker发布的topic了,可以使用echo命令来查看具体的message数据

4.      Matlab->ROS

Matlab同样可以编写节点并发布数据,一个简单的talker实现如下,也可以在matlab.m文件里保存下边的命令运行

image

如果用.m文件保存命令的话,可以将上面的所有命令写到一个.m文件中

  1. %Setting ROS_MASTER_URI
  2. setenv('ROS_MASTER_URI','http://192.168.1.202:11311')
  3.  
  4. %Starting ROS MASTER
  5. rosinit
  6.  
  7. %Creating ROS publisher handle
  8. chatpub = rospublisher('/talker', 'std_msgs/String');
  9.  
  10. %This is to create the message definition
  11. msg = rosmessage(chatpub);
  12.  
  13. %Inserting data to message
  14. msg.Data = 'Hello, From Matlab';
  15.  
  16. %Sending message to topic
  17. send(chatpub,msg);
  18.  
  19. %Latching the message on topic
  20. latchpub = rospublisher('/talker', 'IsLatching', true);

然后在matlab中打开该文件,点击菜单栏中的“Run”即可运行

image

ubuntu中,我们查看topic

image

OK,通过这一次的探索,我们大概了解了ROS-MATLAB的概念和使用方法,又打开了一扇新世界的大门


原创文章,转载请注明: 转载自古月居

本文链接地址: ROS探索总结(三十五)——Matlab中的ROS

微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixinpay_weixin

评论

34条评论
  1. Gravatar 头像

    李风雷 回复

    博主,您好,最近买了您的《ROS机器人开发实践》,正在学习。我有一个疑问,我把按照您的教程把ROS与MATLAB在一个局域网上进行通讯,并在ROS中运行了小乌龟,使它能够移动。在matlab中调用rostopic echo /turtle1/pose,小乌龟的运动数据实时在MATLAB命令窗中不断刷新,但是工作空间中没有数据,我想问怎么把MATLAB中读取的小乌龟的运动数据实时地保存下来呀?不胜感激~

  2. Gravatar 头像

    吉巧丽 回复

    看完您的帖子有些疑惑:
    1、确定运行matlab和ROS的两台计算机在同一网络下,是啥意思?是说同时联网么?
    2、ROS运行在虚拟机中,意思是matlab和ROS在同一台计算机上运行,只是分别装了两个系统么?windows是运行matlab,而虚拟的linux上装ubuntu运行ROS?
    3、我在matlab上运行例程后,查看node_1的信息,显示发布了两个话题,一个是pose,还有一个rosout。这是啥原因?

    • 古月

      古月 回复

      @吉巧丽 1. 两台计算机在同一局域网下
      2. 是的,这样可以模拟出一个局域网来
      3. rosout是ROS默认发布的日志话题,可以不用关注

      • Gravatar 头像

        吉巧丽 回复

        @古月 我的matlab所在的电脑ip是10.150.38.7
        ROS所在的电脑ip是202.198.67.162
        那这不是在同一局域网了?
        我不太懂这个啥意思,网上说ip前三个一样一般是在同一局域网

      • Gravatar 头像

        吉巧丽 回复

        @古月 您好,第3步ROS-matlab中,在ROS启动节点talker,在matlab中可以rostopic list得到chatter 这个topic
        但是rostopic echo chatter时,matlab没有显示ROS发布的消息,显示正忙,请问这是啥原因?

  3. Gravatar 头像

    左左 回复

    您好,利用simulink控制小乌龟的方法您能推荐下网址么

    • 古月

      古月 回复

      @左左 没有类似的教程,可以参考博客的内容在matlab里写发布话题的节点

  4. Gravatar 头像

    Nanky 回复

    博主大佬,改完Ubuntu下的bashrc里IP和uri,对于自定义的msg,在matlab下还是不能有rostopic echo 的显示,提示Failed to create a subscriber with topic name ~~~ and type ~~~,这要如何解决呀?求教,万分感谢!

    • 古月

      古月 回复

      @Nanky 这个我没试过,不确定matlab里边可不可以订阅自定义的话题,因为消息的结构matlab并不知道,还是google一下吧,或者看看matlab的帮助文档里有没有关于自定义话题的内容

  5. Gravatar 头像

    宙辕 回复

    博主,跟着您的教程做完了,我发现在matlab读取ros上的数据时候,在matlab上的rostopic list可以用,但是用rostopic echo的时候,发现matlab上没有接收到的数据显示,如果用receive的话要不就是超时,要不就卡在那里没有显示,把两个系统的防火墙都关了也好用,请问这是什么情况,该如何解决?我在matlab上发的数据ros上可以接收到。

    • 古月

      古月 回复

      @宙辕 这个我也不清楚,google找一下吧,猜测还是网络或者matlab配置的问题

    • Gravatar 头像

      Nanky 回复

      @宙辕 博主大佬,改完Ubuntu下的bashrc里IP和uri,对于自定义的msg,在matlab下还是不能有rostopic echo 的显示,提示Failed to create a subscriber with topic name ~~~ and type ~~~,这要如何解决呀?求教,万分感谢!

  6. Gravatar 头像

    Duan 回复

    上周五跟着这个教程做 做的很顺利,今天想再跟着做一遍的时候,做到”连接Matlab和ROS“这一步的时候一直出错:”Cannot connect to ROS master at http://192.168.0.108:11311. Check
    the specified address or hostname.“ 但是我在matlab的主机上,ping上述地址,显示是两台电脑是连接着的。(我没有用虚拟机,用了两台电脑,mac上装的matlab,ubuntn上装的ROS)
    请问这是什么原因呀?感谢!

    • 古月

      古月 回复

      @Duan 这个只能是网络配置的问题了,仔细检查吧,重启再试试

    • Gravatar 头像

      罗西 回复

      @Duan 我照着教程做,也发现这个问题,想问一下你是怎么解决的。

    • Gravatar 头像

      Yukun 回复

      @Duan 请问这个问题是如何解决的呢?

  7. Gravatar 头像

    洪瑞 回复

    对了,春哥,最近在ros上用kinect采集图像,启动roslaunch turtlebot_bringup 3dsensor.launch发布图像image话题,一个python脚本里去订阅image话题,每次图像更新后回调函数里会用opencv转成rgb格式编码(这个过程耗时可以忽略不计),然后再目标识别处理(这个过程耗时2s),整个回调函数执行完耗时2s多,执行几秒后,最终经过目标识别处理后的结果延迟很大,有二十几秒,也就是看到打印的结果差不多都是30秒前的。
    这个20多秒的延迟是哪里造成的?
    假设1,想是不是默认kinect采集的帧率高了,想没有方法把kinect采集帧率配置成1fps,目前还没找到python代码初始化采集帧率;
    假设2,回调函数的处理机制,是不是回调函数在执行过程中,image更新,也不会打断回调函数,但更新的image是不是被放到一个缓存里,一开始的打印很及时,但因为缓存满了后,会先去处理缓存里的图片,而且缓存是先进先出的机制,所以程序跑了几秒后,一直都会先处理先放到缓存里大图片,导致固定的延时二三十秒;
    如果上面第二个假设成立,那么就算按照假设1处理后,程序跑一段时间后,依然会出现二三十秒的延时。那么只能处理最新的image,这个目前还在找具体实现,怎么让回调函数处理最新的image
    春哥,请助攻。 😛 😛 😛

    • 古月

      古月 回复

      @洪瑞 消息有一个队列,接收到的消息数据会放到队列中,每次spin会去查看队列,如果有数据就进入回调函数。在回调函数处理过程中是不会嵌套的,所以如果回调函数处理时间过长,会导致延时的问题。解决办法:
      1. 在创建订阅者时,将队列长度设置为1,这样每次只会存储最新的图像数据
      2. 尽量减少回调函数的处理时间,最好不要把复杂的计算放到回调函数中

      • Gravatar 头像

        洪瑞 回复

        @古月 谢谢春哥解答。 🙂
        确认了一下,原来程序中订阅队列长度就是1。那因为帧率默认是30,而回调函数执行差不多是2s。是不是每次消息来,是等待回调函数执行完后,回到spin,再去查看队列?

        • 古月

          古月 回复

          @洪瑞 是这样的,所以回调函数不能执行太长时间

          • Gravatar 头像

            洪瑞 回复

            @古月 恩。
            回调函数执行耗时2s,也就是处理一帧图像差不多2s,然后输出图像,理应输出图像有卡顿,2s多更新一次,延迟也就两三秒,但实际输出显示的图像延迟20多秒。目前不知道多余的时间损耗是哪里造成的。

    • Gravatar 头像

      Ryan 回复

      @洪瑞 小哥 ,请问你是用kinect采集图像做什么呢

  8. Gravatar 头像

    洪瑞 回复

    春哥,你的第四步 Matlab->ROS,实际主机还是ubuntu对吧
    也就是说从机和主机之间信息是双向的,从机发布的消息也能被主机订阅对吗?

    • 古月

      古月 回复

      @洪瑞 是的,主机在ubuntu上,通讯是双向的,和ubuntu下的多节点一样

      • Gravatar 头像

        洪瑞 回复

        @古月 好的,谢谢春哥

  9. Gravatar 头像

    李锐 回复

    太棒啦,这正是我所需要的。

  10. Gravatar 头像

    洪瑞 回复

    第一次用这个,点了一次,看到没刷新,又点了一次, 😛 😛 😛 😛

  11. Gravatar 头像

    洪瑞 回复

    春哥,受春哥耳濡目染很多年,最近开始搞ROS啦 😆 。请教一个和matlab仿真无关的问题。
    我看到“消息发布器和订阅器”的例子,比如http://www.ncnynl.com/archives/201611/1059.html,这个链接。里面都是python的例子,步骤差不多可以总结为:
    1,建立工作空间
    2,构建catkin包,catkin_create_pkg beginner_tutorials std_msgs rospy
    3,编写talker.py listener.py
    4,catkin_make
    5,roscore
    6,rosrun beginner_tutorials talker.py; rosrun beginner_tutorials listener.py;
    以上是发布和订阅的过程,为了运行多个节点,又创建和修改了launch文件。
    实际上,如果只是一个一个手动启动节点的话,发布和订阅只需要下面两个步骤就可以了:
    1,编写talker.py listener.py
    2,python talker.py ; python listener.py

    综上,上面那个链接里发布和订阅的例子步骤那么繁琐,是为了一次启动运行多个节点,添加launch文件才搞得那么复杂的吗?

    • 古月

      古月 回复

      @洪瑞 哈哈,欢迎欢迎!
      那个链接里边是比较完整的一个教程,所以稍显繁琐,但是确实是ROS中的标准流程,如果是比较复杂的功能包,可能需要自己创建消息类型,那么就需要按照教程里边的做法进行了。
      这个例程比较简单,launch文件的功能没有完全体现出来,继续往后学习,你就会发现launch文件的强大。
      你说的方法是可以用,但是不建议使用python的方式运行ROS中的python代码,最好还是用rosrun,养成好的习惯对后边应用还是很重要的。

      • Gravatar 头像

        洪瑞 回复

        @古月 好的,明白了,谢谢春哥。 🙂 🙂 🙂

  12. Gravatar 头像

    洪瑞 回复

    春哥,受春哥耳濡目染很多年,最近开始搞ROS啦。请教一个和matlab仿真无关的问题。
    我看到“消息发布器和订阅器”的例子,比如http://www.ncnynl.com/archives/201611/1059.html,这个链接。里面都是python的例子,步骤差不多可以总结为:
    1,建立工作空间
    2,构建catkin包,catkin_create_pkg beginner_tutorials std_msgs rospy
    3,编写talker.py listener.py
    4,catkin_make
    5,roscore
    6,rosrun beginner_tutorials talker.py; rosrun beginner_tutorials listener.py;
    以上是发布和订阅的过程,为了运行多个节点,又创建和修改了launch文件。
    实际上,如果只是一个一个手动启动节点的话,发布和订阅只需要下面两个步骤就可以了:
    1,编写talker.py listener.py
    2,python talker.py ; python listener.py

    综上,上面那个链接里发布和订阅的例子步骤那么繁琐,是为了一次启动运行多个节点,添加launch文件才搞得那么复杂的吗?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.