ROS 使用指南¶
简介¶
ROS ( Robot Operating System, 机器人操作系统) ,提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、函数库、可视化工具、消息传递和软件包管理等诸多功能。ROS 遵循 BSD 开源许可协议。
ROS 维基¶
ROS 官网的中文维基地址:http://wiki.ros.org/cn
ROS 支持版本¶
目前 ROS 的发布版本,官方只支持 Ubuntu Linux 等安装,但由于在 OpenEmbedded/Yocto 框架下维护了meta-ros layer,使得我们可以将ROS集成到同样基于 Openembedded 框架 的嵌入式Linux中运行。
OpenEmbedded 框架提供了通用的交叉编译环境。在此开发环境允许开发人员自己配置编译工具链,编译程序,并为其嵌入式系统,创建完整的Linux发行版。 它可通过丰富的板级支持包,以支持各种硬件架构和嵌入式主板。
目前 ROS OpenEmbedded meta-ros Layer 有三个版本,分别支持 ROS hydro,indigo 和 kinetic 发行版本。其中 ROS indigo是支持最好的一个版本,ROC-RK3308-CC ROS 系统所集成的也是这个版本,同时根文件系统是基于的 Yocto 版本为 Rocko所构建的。
PC 端(Ubunut主机)安装 ROS¶
查看ROS所有的发行版本。目前 ROS 最新的版本,也是官方推荐的版本是 ROS Melodic Morenia 。其安装教程官方有很详细的介绍,需要注意的是,不同的Ubuntu版本,对应安装不同的 ROS 版本,例如 ROS Melodic Morenia 主要针对 Ubuntu 18.04 (Bionic) release,而 ROS Indigo Igloo 则针对 Ubuntu 14.04 LTS (Trusty) release。
由于 ROC-RK3308-CC 的 ROS 系统使用的是 ROS Indigo Igloo 版本,所以我们主机这里也安装 ROS Indigo Igloo 版本进行测试,下面的简要安装教程也是主要针对 Ubuntu 14.04 (ROS Indigo),其他版本的安装教程可到官网维基查询。
平台说明¶
ROS Indigo 仅仅只支持Ubuntu 13.10 (Saucy) 和 Ubuntu 14.04 (Trusty)。这里在 Ubuntu 14.04 系统上安装ROS。
安装步骤¶
配置Ubuntu仓库¶
允许”restricted”,”universe”,”multiverse.”。
设置软件源¶
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
或者来自中国的源:
sudo sh -c '. /etc/lsb-release && echo "deb http://ros.exbot.net/rospackage/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
可根据UbuntuMirrors自己选。
添加key¶
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
安装¶
1、更新软件索引:
sudo apt-get update
2、安装:
这里推荐 Desktop-Full 安装: ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators and 2D/3D perception。
sudo apt-get install ros-indigo-desktop-full
3、初始化 rosdep:
使用ROS之前,需要初始化rosdep,以解决一些系统依赖问题。
sudo rosdep init
rosdep update
4、环境配置
echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
source ~/.bashrc
5、推荐安装 rosinstall,一个非常好用的命令行工具
sudo apt-get install python-rosinstall
6、测试
安装官方的教学例子:
sudo apt-get install ros-indigo-ros-tutorials
启动其中一个例子:
roslaunch roscpp_tutorials talker_listener.launch
一切正常的话,你将会看到以下结果:
SUMMARY
========
PARAMETERS
* /rosdistro: indigo
* /rosversion: 1.11.21
NODES
/
listener (roscpp_tutorials/listener)
talker (roscpp_tutorials/talker)
ROS_MASTER_URI=http://localhost:11311
core service [/rosout] found
process[listener-1]: started with pid [9520]
process[talker-2]: started with pid [9521]
[ INFO] [1545896255.189016471]: hello world 0
[ INFO] [1545896255.289000624]: hello world 1
[ INFO] [1545896255.388990355]: hello world 2
[ INFO] [1545896255.489031727]: hello world 3
[ INFO] [1545896255.489457481]: I heard: [hello world 3]
[ INFO] [1545896255.589028597]: hello world 4
[ INFO] [1545896255.589358894]: I heard: [hello world 4]
使用教程¶
接下来。通过我们一个简单的demo:firefly_controller,来阐述 ROS 系统的使用方式。
此 Demo 展示了如何在两台机器上使用ROS系统,详述了使用ROS_MASTER_URI来配置多台机器使用同一个master ,其主要功能是:
通过PC端的键盘,控制 ROC-RK3308-CC 主板上的两个LED灯的亮灭
外接温湿度传感器,获取当前的温湿度值
其中采用的温湿度传感器模块是:SHT30,盛世瑞恩出产的一款温湿度传感器,基于i2c传输协议。代码主要参考了ROC-RK3308-CC开发实例总结–SHT30温湿度模块调试。
ROC-RK3308-CC 设备端准备¶
烧写固件¶
按照《升级固件》进入loader模式,从固件地址: ROC-RK3308-CC_Yocto_ROS下载固件,解压,执行命令:
sudo upgrade_tool ul MiniLoaderAll.bin && \
sudo upgrade_tool di -p parameter.txt && \
sudo upgrade_tool di -uboot uboot.img && \
sudo upgrade_tool di -trust trust.img && \
sudo upgrade_tool di -boot zboot.img && \
sudo upgrade_tool di -rootfs rootfs.img && sudo upgrade_tool rd
按照《上手教程》,给 ROC-RK3308-CC 主板上电开机,接上串口。上电后需要输入账号密码进入系统,输入root
即可,无需密码。
注意:如果有温湿度传感器模块SHT30,先接上模块再上电,这里使用I2C1进行通信,按引脚描述图接上VCC5
、GND
、I2C1_SDA
、I2C1_SCL
即可。
初始化配置¶
根文件系统里,我们放了两个小工具,方便配置环境:
ls /home/root
setup.sh wifi.sh
首先上电开机后,先连接wifi(WiFi需要和PC主机在同一网段,可互相ping通),通过脚本配置,其中ssid
为你的WiFi账号,psk
为你的密码
./wifi.sh $ssid $psk
接着配置 ROS 环境,这里我们将以PC主机端为master(整个ROS运行环境只需要一个master),所以这里不需要启动 roscore
source ./setup.sh $master_ip
其中master_ip
是PC主机端的ip地址,这里主要配置了ROS_MASTER_URI
和ROS_HOSTNAME
,具体细节查看 setup.sh 脚本。
PC 端准备¶
注意:以下操作方法使用了catkin工具,只适用于ROS Groovy及后期版本,对于ROS Fuerte及早期版本请使用rosbuild,这里不讲述。
Demo 软件包下载¶
Demo 软件包下载:firefly_iot_keyboard.tar.bz2
创建 ROS 工作空间¶
如果你是初次安装 ROS,可通过catkin方式创建ROS工作空间:
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
即使这个工作空间是空的(在src
目录中没有任何软件包,只有一个CMakeLists.txt链接文件),你也可以编译它。
cd ~/catkin_ws/
catkin_make
编译¶
现在先将下载的Demo 软件包解压到工作空间的src
目录:
tar -xjf firefly_iot_keyboard.tar.bz2 -C ~/catkin_ws/src/
然后编译工作空间:
cd ~/catkin_ws/
catkin_make
执行¶
分别打开两个终端,每个终端都需要按以下操作配置。
配置当前工作空间为ROS工作环境的最顶层:
cd ~/catkin_ws/
source devel/setup.bash
配置ROS_HOSTNAME为主机ip地址,不然设备端那边不识别。
export ROS_HOSTNAME=$master_ip
其中一个终端运行demo键盘控制节点:
rosrun firefly_iot_keyboard keyboard.py
另一个终端运行demo接收节点
rosrun firefly_iot_keyboard receiver.py
最终效果¶
效果图如下:
PC 端¶
注意,如果不能控制,请选中 keyboard.py 所在的终端窗口以确保你的按键输入能够被捕获。
终端键盘控制:
rosrun firefly_iot_keyboard keyboard.py
Reading from the keyboard and Publishing to firefly_controller!
----------------------------------------------------------------
keymap:
LED:
b : Blue LED ON/OFF
r : Red LED ON/OFF
Sensor:
t : show Temperature and Humidity
当按下r
和b
,将会控制设备端红蓝LED灯的亮灭,如果外接了温湿度传感器sht30,按下t
将会获得设备端传过来的温湿度值,被另一”receiver.py”所在终端接受。
终端接收:
rosrun firefly_iot_keyboard receiver.py
currently:
Temperature 28.607613c Humidity 49.396507%
ROC-RK3308-CC 设备端¶
串口效果:
root@rockchip-rk3308-evb:~# rosrun firefly_controller firefly_controller
[ INFO] [1545900033.047350122]: I heard: [blue]
[ INFO] [1545900034.086951914]: I heard: [red]
[ INFO] [1545900035.106874956]: I heard: [sht30]
调试¶
使用rosnode list
命令,列出活跃的节点:
rosnode list
/firefly_base_controller
/firefly_iot_keyboard
/firefly_iot_receiver
/rosout
可看到当前运行的demo,有三个节点在运行:/firefly_base_controller
、/firefly_iot_keyboard
、/firefly_iot_receiver
通过rostopic list
命令,能够列出所有当前订阅和发布的话题:
rostopic list
/cmd_vel
/rosout
/rosout_agg
/temphumidity
这里可看到当前运行的demo有发布了两个Topic:/temphumidity
、/cmd_vel
使用命令rostopic echo
可以显示在某个话题上发布的数据:
rostopic echo /temphumidity
humidity: 50.0968933105
temp: 24.1374816895
---
humidity: 51.638053894
temp: 23.3657588959
---
使用工具rqt_graph
查看当前 ROS 系统运行情况的图形:
rosrun rqt_graph rqt_graph
这里需要事先安装 rqt_graph :
sudo apt-get install ros-indigo-rqt
sudo apt-get install ros-indigo-rqt-common-plugins