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所构建的。

参考固件

参考固件地址: ROC-RK3308-CC_Yocto_ROS

demo程序以及系统的使用说明请看使用教程

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.”。

_images/repositories.png

设置软件源

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进行通信,按引脚描述图接上VCC5GNDI2C1_SDAI2C1_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_URIROS_HOSTNAME,具体细节查看 setup.sh 脚本。

运行 demo 节点

rosrun firefly_controller firefly_controller

等待 PC主机端 准备好即可。

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

最终效果

效果图如下: _images/firefly_controller.png

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

当按下rb,将会控制设备端红蓝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

_images/rosgraph.png

这里需要事先安装 rqt_graph :

$ sudo apt-get install ros-indigo-rqt
$ sudo apt-get install ros-indigo-rqt-common-plugins