在1.4节我们已经用apt工具安装好了ROS,apt安装的软件包都是二进制形式,可以在系统中直接运行,它们是ROS官方提供给用户的应用程序。然而很多时候我们需要自己做一些定制改写,或者运行第三方开发的软件包,这个时候就需要下载源代码进行编译。
本节我们下载本书配套的ROS-Academy-for-Beginners软件包,给读者演示源码包下载-编译-运行的完整流程。后续章节的主要代码都基于这个软件包,请读者按照流程下载编译。
在Ubuntu系统上,确保git已经安装
$ sudo apt-get install git
然后在创建一个名为tutorial_ws的工作空间,在它的的src路径下克隆ROS-Academy-for-Beginners软件包
$ cd
$ mkdir -p tutorial_ws/src #创建catkin工作空间
$ cd tutorial_ws/src #进入src路径,克隆教学软件包
$ git clone https://github.com/DroidAITech/ROS-Academy-for-Beginners.git
并且安装ROS-Academy-for-Beginners所需要的依赖
$ cd ~/tutorial_ws
$ rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y
注意:以上命令非常重要,缺少依赖将导致软件包无法正常编译和运行。
在开始编译之前,需要确保Gazebo在7.0版本以上
$ gazebo -v #确认7.0及以上
如果你的Gazebo版本低于7.0,则需要进行升级
$ sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list'
$ wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install gazebo7
接着回到catkin_ws下编译
$ cd ~/tutorial_ws
$ catkin_make
$ source ~/tutorial_ws/devel/setup.bash #刷新环境 方法一
$ rospack profile #刷新环境 方法二
注意:source命令,编译完成后必须刷新一下工作空间的环境,否则可能找不到工作空间。许多时候我们为了打开终端就能够运行工作空间中编译好的ROS程序,我们习惯把source ~/tutorial_ws/devel/setup.bash
命令追加到~/.bashrc
文件中(rosacademy_ws替换为你的工作空间名称),这样每次打开终端,系统就会刷新工作空间环境。你可以通过echo "source ~/tutorial_ws/devel/setup.bash" >> ~/.bashrc
命令来追加。
编译完成后就可以运行本教学配套的仿真了,输入
$ rospack profile
$ roslaunch robot_sim_demo robot_spawn.launch
你会看到仿真画面启动,仿真界面中包括了软件博物馆和Xbot机器人模型。
再打开一个新的终端,输入以下命令,用键盘控制机器人移动
$ rosrun robot_sim_demo robot_keyboard_teleop.py
聚焦控制程序窗口,按下i、j、l等按键,这样你就可以通过键盘来控制机器人的移动了。
当你完成了这一步,首先恭喜你,你已经完成了ROS最常见的源码下载-安装依赖-编译-运行的流程,在ROS社区有许许多多这样的软件包,基本都按照这样的流程来运行。相信你一定可以举一反三。
键盘控制仿真机器人移动这个demo展现了ROS分布式消息收发的特性。我们打开的虽然是键盘控制程序,但它可以替换为手柄控制、手机平板控制、甚至是路径规划自动控制。模拟器里的机器人并不关心是谁发给它的消息,它只关心这个消息是什么(速度、角速度等指令)。所以,每一个进程(节点)都各司其职,负责不同的任务,同时定义好消息收发的接口。如果我们现在要做路径规划任务,那么我们只用单独再开发一个节点,同样向底盘发送我们解算出的速度/角速度指令就可以了。 你现在可能对ROS工作方式还一无所知,不过不要紧。后续我们会对ROS涉及的这些概念进行详细介绍,等你看完了这本书,你就能明白整个ROS框架运行的原理,甚至自己能编程实现一些功能模块了。
在1.4节我们通过apt方式安装了ROS系统以及相关的软件包,而在1.5节我们通过下载源码编译的方式安装了一个ROS教学软件包。这是两种常见的软件包安装方式,通常我们的软件包(Package)就可以分为二进制和源代码。
二进制包里面包括了已经编译完成,可以直接运行的程序。你通过sudo apt-get install
来进行下载和解包(安装),执行完该指令后就可以马上使用了。因此这种方式简单快捷,适合比较固定、无需改动的程序。
而源代码包里是程序的原始代码,在你的计算机上必须经过编译,生成了可执行的二进制文件,方可运行。一些个人开发的程序、第三方修改或者你希望修改的程序都应当通过源代码包的来编译安装。
区别 | 二进制包 | 源代码包 |
---|---|---|
下载方式 | apt-get install /直接下载deb |
git clone /直接下载源代码 |
ROS包存放位置 | /opt/ros/kinetic/ |
通常~/catkin_ws/src |
编译方式 | 无需编译 | 通过make/cmake/caktin |
来源 | 官方apt软件源 | 开源项目、第三方开发者 |
扩展性 | 无法修改 | 通过源代码修改 |
可读性 | 无法查看源代码 | 方便阅读源代码 |
优点 | 下载简单,安装方便 | 源码可修改,便于定制功能 |
缺点 | 无法修改 | 编译工具、软件包依赖、版本和参数 |
应用场景 | 基础软件 | 需要查看、开发和修改的程序 |
在1.4中,我们用apt-get安装了ROS及其组件,因此我们不需要编译就可以运行turtlesim程序。对于这些程序,除非我们做操作系统的设计开发才会去下载源码,否则直接用官方提供的ROS软件包;而在1.5中,ROS-Academy-for-Beginners以源码呈现,你可以看到每个demo下面的C++代码。对于这些源文件我们必须caktin_make
编译,然后才能运行。
在ROS中,我们可能经常会遇到缺少相关的ROS依赖的问题。有些时候你编译或者运行一些ROS程序,系统会提示找不到XXX功能包,如图所示。
遇到这样的问题,请先注意阅读错误原因,看看是否有解决方法,也可以Google一下。如果是缺少ROS的依赖,通常可以用以下命令来安装:
$ sudo apt-get install ros-kinetic-PACAKGE
将PACKAGE替换为系统提示缺啥少的软件包,例如
$ sudo apt-get install ros-kinetic-slam-gmapping #GMapping-SLAM算法包
$ sudo apt-get install ros-kinetic-turtlebot-description #Turtlebot机器人模型包
所有APT官方中的ROS功能包都是按照ros--的形式来命名。
通常ROS的程序都是用C++和Python开发的,为了提高开发的效率,我们建议用IDE来写代码。目前在Ubuntu上已经有许多IDE支持ROS开发,比如Eclipse、Qt Creator。不过这些IDE配置起来会比较麻烦,我们推荐一款适配ROS的IDE——RoboWare Studio来开发ROS。
读者可在http://cn.roboware.me/#/home下载和使用。