转自:http://blog.163.com/myfzh@126/blog/static/35048490201642732142416/
我在美帝大农村读博搬砖,学着一个奇怪的专业,生物系统工程,搞生物的?不不不不,搞拖拉机的,农业机器人方向(拖拉机维修与制造)。上个月偶尔从老板教的一门课中得知一个听起来特别高贵的平台ROS(RobotOperating System),正巧又从老板手中抢了一个淘宝款的雷达(别问我外导是怎么搞到淘宝雷达的)来玩,作为他课程的期末设计作业。
看了下这款叫做RPLIDAR的雷达官网,SDK主要有三块,Arduino的驱动程序,C++的SDK,和ROS的SDK。我和小伙伴三人想着用这个雷达和实验室的一辆小卡车做一个扫描地图并且壁障到达某目标点的项目,本着从简到难试的方法先搞了Arduino,但是小单片机的处理能力实在不足够支撑每秒2000点数据的雷达,C++可以搞定数据,可是实现其可视化不是那么直接,我还是心心念着最最方面和熟悉的MATLAB。
MATLAB在它的Robotic tool box 中已经支持ROS,ROS能很有效的管理机器人的各个部分,而MATLAB又是数据可视化和快速开发的利器,正好趁此机会,学习一下怎么将这两个整合到一起使用,在摸索的过程中发现目前中文有关此的资料较少,因此将我的探索过程记下,一来能够给自己做个归档,二来也希望能够帮助到更多人。
本文主要涉及:
ROS在MATLAB中的基本配置
ROS在LINUX下的基本配置
MATLAB ROS与LINUX下的ROS的连接
系统配置:
Windows 10 装有 MATLAB以及VMware
VMware 中的Ubuntu 14.04 和ROSIndigo.
(Indigo 不支持Ubuntu 16.04,最新出的ROSKinect支持)
如果在不支持的Ubuntu版本上装ROS会浪费你大概1小时时间
(嗯,别问我怎么知道的)
好的,我们开始
Matlab:
MATLAB和ROS相关的材料在该网页中,特别的详细,可以一步步照着做,有坑的地方我会在下面提及。
http://www.mathworks.com/help/robotics/robot-operating-system-ros.html
MATLAB 中输入
rosinit
便可以启动ROS,需要注意的是很多Academic 版本License的MATLAB并不包含 Robotic tool box 的许可,即使你安装了这个工具包,在输入上述命令的时候它也会提示你找不到变量。因此请核实是否有该TOOLBOX的许可。
Linux ROS:
ROS 的官网也提供了非常详细的ROS介绍,和相关的教程,浏览对学习ROS非常有帮助。http://wiki.ros.org/
根据以下步骤,完成ROS在Ubuntu上的安装
http://wiki.ros.org/ROS/Installation
ROS主要的概念涉及到,
主机Master: 负责全面的管理节点之间的通讯和地址,一个ROS网络一般只有一个MASTER。
节点 Nodes : 这个是ROS中最重要的概念,所有的传感器和机器人部件都被虚拟化成节点,一个ROS网络可以有很多节点,一台HOST可以创建多个节点,包括创建Master的HOST。
通讯方式有两种:
1、 由Publisher和Receiver 节点通过topic进行通讯
2、 由Service完成通讯
一旦网络建立完成,节点和节点之间可以不通过Master进行连接。
关于ROS的相关知识,我也在努力学习中,大家可以进一步通过它官网的WIKI进行学习。本文主要要讲的是怎么进行它与MATLAB的连接,通过虚拟机。
1、 首先,检查网络配置
http://wiki.ros.org/ROS/NetworkSetup
ROS官网上有关于网络配置的教程,但是检查网络配置中的netcat并不支持windows系统。
因此请先检查虚拟机中的Ubuntu是否能够ping成功主机。
主机是否能够ping到虚拟机。
我采用的是虚拟机有两块虚拟网卡的方法,一块通过NAT进行互联网连接,另一块通过host-on
Ubuntu下用ifconfig找到它的IP地址
Windows下用ipconfig确定ip地址
确保能够相互ping成功。
2、 检查防火墙!确定防火墙没有对MATLAB的行为进行拦截。
如果防火墙有拦截,很有可能你能够相互Pingt通,并且甚至能够让MATLABROS连接上UbuntuROS,但是一点数据都收不到,然后又一个下午浪费在这里(也别问我怎么知道的),如果之后连接不成功又不确定是不是防火墙的问题,可以先关了整个防火墙试试。
3、 非常重要的一步,设置ROS的主机名称
ROS默认会用你电脑的局域网名称来进行相互的连接,通常来说在一个有DHCP设置好的局域网中是没有问题的,但是往往情况并不是这样。在这种没法解析电脑名称的情况下,用IP地址连接,最为可靠。
ROS有三个重要的名称
'ROS_MASTER_URI':ROS 将要连接的 Master主机的名称地址
'ROS_HOSTNAME':本机ROS的名称地址
'ROS_IP':本机ROS的IP,也是一个名称,在存在HOSTNAME的情况下略过
在MATLAB中可以通过getenv
getenv('ROS_MASTER_URI')
getenv('ROS_HOSTNAME')
getenv('ROS_IP')
来查看,并且通过来设置setenv
setenv('ROS_MASTER_URI','http://192.168.1.1:11311')
setenv('ROS_IP','192.168.1.100')
在Ubuntu下,可以通过echo 来查看
echo ROS_HOSTNAME
并且通过赋值来更改
export ROS_HOSTNAME=10.0.0.1 # Correct the fact that artoo doesn't know its name
特别注意:
Bash下的赋值,仅对改工作的terminal有效,在另外的terminal中ROS_HOSTNAME值依然为默认,因此你需要在每个将要进行roscore及rosrun操作的terminal中对其进行赋值。
我采用的配置:
Ubuntu下:
export ROS_MASTER_URI=http://192.168.80.129:11311
export ROS_HOSTNAME=192.168.80.129
roscore #启动ROS
MATLAB下:
setenv('ROS_MASTER_URI','http://192.168.80.129:11311')
setenv('ROS_IP','192.168.80.1')
rosinit('http://192.168.80.129:11311') #启动ROS
本例中,Ubuntu ROS开启Master,MATLAB连接到Ubuntu的ROS中,你也可以反过来做,但是记住一个ROS网络只能有一个ROSMaster.
启动之后,理论上你已经能够通过任何一个ROS中的
rosnode list
看到两台ROS的nodes。
rosnode list
/matlab_global_node_33333 #该node由matlab创建
/rosout #该node由ubuntu ros创建
分别在两个ROS中,使用
rosnode info 对 方 node
如果一切都没问题的话,你能够看到对方node的相关信息,和网络地址,并且没有错误提示。
Example:
如果发现连接错误,并且Node的地址中包含主机名的话,很可能是你名称设置部分没有做好。
至此,连接全部完成。
我们来看一个获取数据的例子:
在Ubuntu ROS下建立基本教程中的乌龟node,并且利用键盘控制它行动(具体参见ROSWIKI最初教程)
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key #用键盘控制
在MATLAB下:
rostopic echo /turtle1/cmd_vel
接下来,每当你在Ubuntu中用方向键控制小乌龟,MATLAB中都获取到你的指令信息
联系客服