所要介绍的是有关ROS机器人的,不是软路由。这篇文章里的R不是Route,而是Robot的缩写。
ROS系统中一个非常重要的一个概念是节点。一个ROS机器人系统由众多节点构成,每个节点是独立的软件模块。当一个机器人系统足够复杂时,只有一台小电脑可能不堪重负。于是多个节点就不可避免得要被放到不同的机器上跑,这时候就会用到网络通信。
我们过去已经见过一些Chibios、Nuttx等机器人操作系统,这些系统一般在单片MCU上跑,可以用来做无人车、空中机器人或无人潜航器。使用这种操作系统的机器人项目有很多,比较有名的有PX4、Paparazzi UAV等。因为属于嵌入式操作系统,这种操作系统的使用和开发的难度都是很大的。
今天我们来聊聊另一个更偏应用层的“操作系统”——ROS。
ROS(Robot Operating System)是一个机器人用的“操作系统”。ROS是个软件系统(相当于嵌入式系统的应用层),它需要在Linux系统上跑。
既然它不是传统意义的操作系统,为什么ROS的英文名字会叫Operating System呢?因为ROS对不同的机器人、传感器进行了封装。然后,当你要做激光SLAM建图、双目视觉扫描或运动规划时,就可以通过ROS的API接口来操作硬件;在操作上,就像基于一个操作系统来编程一样。
ROS可以实现计算机集群操作系统的功能。更妙的是,由于应用层的C和Python代码可以跨平台使用,这个计算机集群甚至可以由X86、ARM等不同架构来组合。ROS使用了跨平台的模块化软件通讯机制,ROS系统中每个功能是实现都由各自的节点来实现,每个节点又可以分布式地跑在不同的机器上。比如,可以把PX4飞控与树莓派组成一个无人机节点,通过网络接入到一个由x86计算机集群组成的ROS系统中,然后让X86电脑来做视觉识别计算、激光SLAM建图以及路径计算,以此来扩展更高端的功能。
目前常见的ROS有两个版本,Kinetic和Melodic,Melodic是最新版本。
虽然Melodic是最新版本,但还是经常有人问我怎么在友善之臂的RK3399上安装ROS Kinetic。我也很疑惑,友善之臂已经适配ROS Melodic了,为什么还有人要装Kinetic呢?
原来,初学者容易被名字误导,而想要Kinetic版本。Melodic的英文名听上去像音乐播放器,很难让人联想到机器人。相对的,Kinetic这个名字有动力学的意思,听上去似乎比Melodic更专业一些。然而,事实上Melodic是Kinetic的升级版本。
也有些情况,是因为萌新看完Kinetic的中文教程以后,不会灵活应变,换Melodic以后连ROS软件包都不会安装了。对于这个问题,本文第5小节会指导怎么装Melodic的软件包。
如果是ubuntu18系统,安装方法很简单,直接用apt命令就可以了。
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt-get up<ickey>date
sudo apt-get install ros-melodic-desktop-full
sudo rosdep init
rosdep up.bash
我喜欢下面这样做,写入用户bashrc里。下次重启后就不用每次重新设置了
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
考虑到有萌新不会装Melodic的软件包,这一小节说说Melodic软件包的安装方法。安装例子就用大家最感兴趣的无人机Mavlink协议和激光雷达SLAM建图的相关软件包吧。
MAVlink是一种非常常见的机器人通信协议,在开源的无人机项目中,PX4、Ardupilot等都是用这种协议的。ROS要与这些机器人通讯,需要先装一下mavros软件包。
sudo apt-get install ros-melodic-mavros
机器人上装有激光雷达,当需要根据激光雷达的数据建立虚拟地图并对自身进行定位时,就需要先装一下slam gmapping软件包
sudo apt-get install ros-melodic-slam-gmapping
聪明的你已经看出规律了吧,这些包的安装方式都是:
sudo apt-get install ros-melodic-包名
如果你在ROS中文站找到了一个需要的教程,但是发现教程较老,对应的ROS版本比较低,比如kinetic版本的。
可以试试把教程里的apt命令中的安装包名字里的kinetic直接替换为melodic。
ROS系统需要一个主机节点,即master,然后实现各种功能的所有的子节点都去连接这个主机节点。主节点和子节点可以在同一台电脑上,也可以在不同的电脑上(即网络通信)。
这一小节,我们要做三个节点,一个Master节点,一个帧听节点,一个发送节点。
首先是Master节点。对于Master来说,主机名和主机IP都是本地,即localhost,不需要特别的配置
roscore
我们使用友善之臂的RK3399板子(型号NanoPi M4)来跑Master节点,截图如下。调试打印信息显示了ROS的版本和节点端口号
上面这个例子是放在嵌入式的友善之臂上,实际上,Master节点放在x86电脑上跑也是没问题的。原理一样。
侦听节点和发送节点可以放在不同的电脑上,所有子节点都要配置ROS MASTER URI(注意是i的大写,一竖后面没有弯,别写成URL了)连接到同一个master节点。
侦听节点的命令代码举个例子。如果,我们已经在192.168.1.116上开了一个master节点。那么,192.168.1.116以外IP的电脑需要输入如下命令:
export ROS_MASTER_URI=http://192.168.1.116:11311
rosrun rospy_tutorials listener.py
上面这个命令需要输入IP号,其实也可以用电脑的hostname来代替。方法如下:把除master节点以外的电脑的hosts文件设置一下,把hostname对应的IP都写上,这样就能实现hostname的解析。举个例子,如果master节点的电脑名师NanoPi-M4,它的IP是192.168.1.111,那么侦听节点的代码也可以写成如下:
export ROS_MASTER_URI=http://NanoPi-M4:11311
rosrun rospy_tutorials listener.py
发送节点的配置方法也是一样,如果已经配置了hosts,就直接这样写:
export ROS_MASTER_URI=http://NanoPi-M4:11311
rosrun rospy_tutorials talker.py
下面是测试图片,ROS1发送数据,ROS2侦听。
刚开始,ROS2是没有数据的
然后ROS1开启发送,发了hello world
ROS2节点收到hello world
前面几小节讲了怎么开启master节点和子节点。我们归纳一下,一句话:除了主机节点外,实现各种功能的子节点需要在启动前设置ROS_MASTER_URI为主节点所在IP和端口。
这一小节,我们用ROS的来玩玩网络控制,要被控制的是喜闻乐见的乌龟机器人。因为前面一小节已经开启了主节点了,所以这一小节要开启两个节点。我们有两台电脑做子节点,ROS1和ROS2
下面我们要对ROS1和ROS2分别做如下的设置:
1、乌龟机器人控制节点(在ROS2上跑);2网络遥控节点(在ROS1上跑)。
在ROS1中,先设置ROS_MASTER_UR,开启乌龟机器人的节点。虽然是个虚拟的仿真平台,并不是实际的硬件,但用来演示ROS的网络控制已经是足够的了。下图中ROS2开启了乌龟机器人节点,显示了机器人的仿真图像,目前太还没有接收到遥控指令。
然后,在ROS1上设置ROS_MASTER_UR并开启遥控节点,然后,在ROS1上输入上下左右,就可以控制ROS2中的乌龟前进或转弯。
在ROS1上随意控制一下。可以发现ROS2上的乌龟随着你的操作开始动了
太有用的分享啦,喜欢,谢谢啦。