一、前言
我的运行环境:
操作系统:Ubuntu Kylin 14.04
ROS版本:Indigo
背景说明:本文记录了ROS的安装和卸载过程与Turtlebot包的安装过程以及其间遇到的问题
本文地址:http://blog.csdn.net/u013453604/article/details/49386953
二、ROS的安装
1、ROS与Ubuntu版本的考虑
ROS作为机器人操作系统并不是一个像Windows、Linux那样可以独立运行的操作系统,他需要运行在Linux环境下。所以运行ROS的前提是电脑要装有Linux系统,我的是Ubuntu。安装之前需要注意的问题是ROS版本通常与Ubuntu版本是一一对应的,比如:
ROS Jade 仅支持Trusty (14.04)、Utopic (14.10) 和 Vivid (15.04)。
ROS Indigo 仅支持 Saucy (13.10) 和 Trusty (14.04)。
ROS Hydro 仅支持Precise(12.04)、Quantal(12.10)和Raring(13.04)。
- 1
- 2
- 3
截止到目前(2015.10.24),jade版本的ROS还对某些package不支持,比如初学者用到的Turtlebot包。
并且indigo版本的ROS相对于hydro版本来说有较大升级改动。
考虑到以上两点我选择了indigo版本的ROS进而决定了电脑上的操作系统是Ubuntu 14.04(虽然Ubuntu Kylin 15.04在中文的集成上有了很大改善,不需要操心中文输入、显示、乱码的问题,还集成了Windows下的常用软件,但是由于ROS版本要求只好放弃)。
Ubuntu Kylin 在这里下载:http://www.ubuntukylin.com/downloads/
再推荐一个Ubuntu Kylin镜像的下载地址:http://cdimage.ubuntu.com/ubuntukylin/releases/14.04/release/
大多数Linux版本的镜像都能在这里找到(并且提供BT种子):http://cdimage.ubuntu.com/
2、ROS安装教程
ROS安装我选择apt-get的方式,因为源码安装不仅编译麻烦,后期遇到问题也会造成不必要的困扰,ROS WIKI上也不推荐从源码安装ROS。
安装过程参考ROS的中文版WIKI:http://wiki.ros.org/cn/indigo/Installation/Ubuntu
2.1配置Ubuntu软件仓库
按下电脑上的windows键打开搜索栏,输入“软件和更新”,打开软件仓库如图:
勾选以允许 “restricted”、”universe” 和 “multiverse”这三种安装模式。
2.2添加 sources.list
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
- 1
也可以选择国内的源,速度快很多
中国科学技术大学:
$ 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'
- 1
中山大学:
$ sudo sh -c '. /etc/lsb-release && echo "deb http://mirror.sysu.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
- 1
ExBot机器人实验室:
$ 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'
- 1
2.3添加Keys
$ sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116
- 1
2.4安装
先更新Debian软件包索引
$ sudo apt-get update
- 1
安装桌面完整版(包含ROS、rqt、rviz、通用机器人函数库、2D/3D仿真器、导航以及2D/3D感知功能):
$ sudo apt-get install ros-indigo-desktop-full
- 1
或者直接点击这里启动安装。
2.5初始化 rosdep
在开始使用ROS之前你还需要初始化rosdep。rosdep可以方便在你需要编译某些源码的时候为其安装一些系统依赖,同时也是某些ROS核心功能组件所必需用到的工具。
$ sudo rosdep init
$ rosdep update
- 1
- 2
2.6环境设置
到了这一步要使用ROS的一些命令比如roscd、roslaunch还需要source一下setup.bash文件:
$ source /opt/ros/indigo/setup.bash
- 1
如果不想每次用ROS都先运行一句上面那条source命令而是希望每次打开一个新的终端时ROS环境变量都能够自动配置好(即添加到bash会话中),那将会方便得多:
$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
- 1
- 2
在这记一下两个查看环境变量的命令,但写在文件中没有载入的变量是查不到的
$ export | grep ROS
$ env | grep ROS
- 1
- 2
2.7创建工作空间
下面是一个创建工作空间的例子
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ cd ~/catkin_ws/
$ catkin_make
$ source devel/setup.bash
- 1
- 2
- 3
- 4
- 5
- 6
2.8安装 rosinstall
rosinstall 是ROS中一个独立分开的常用命令行工具,它可以方便让你通过一条命令就可以给某个ROS软件包下载很多源码树。
$ sudo apt-get install python-rosinstall
- 1
到这里ROS的安装就完成了,可以点击这里开始ROS的初级教程。
三、ROS的卸载
由于我是用apt-get方式安装ROS的,卸载使用如下命令:
$ sudo apt-get remove ros-*
- 1
卸载成功的效果就是/opt下的ROS文件夹被删除,原先的ROS以及曾经安装在ROS中的package也没有了。
四、安装turtlebot包
我移动机器人平台是turtlebot,所以安装turtlebot的package以运行现成的代码。
原先hydro版本的ROS下turtlebot包只有一个turtlebot文件夹,这也是一个独立的工作空间,但是在indigo版本下的turtlebot包是三个组合工作空间分别是rocon、kobuki、turtlebot,这是三个并列同级的文件夹,这里涉及到工作空间的覆盖(overlay)问题。
如下步骤是从源码安装
1、安装前的准备
$ sudo apt-get install python-rosdep python-wstool ros-indigo-ros
$ sudo rosdep init
$ rosdep update
- 1
- 2
- 3
2、安装rocon、kobuki、turtlebot
这三个是组合空间的关系,必须按照顺序安装
$ mkdir ~/rocon
$ cd ~/rocon
$ wstool init -j5 src https://raw.github.com/robotics-in-concert/rocon/indigo/rocon.rosinstall
$ source /opt/ros/indigo/setup.bash
$ rosdep install --from-paths src -i -y
$ catkin_make
$ mkdir ~/kobuki
$ cd ~/kobuki
$ wstool init src -j5 https://raw.github.com/yujinrobot/yujin_tools/master/rosinstalls/indigo/kobuki.rosinstall
$ source ~/rocon/devel/setup.bash
$ rosdep install --from-paths src -i -y
$ catkin_make
$ mkdir ~/turtlebot
$ cd ~/turtlebot
$ wstool init src -j5 https://raw.github.com/yujinrobot/yujin_tools/master/rosinstalls/indigo/turtlebot.rosinstall
$ source ~/kobuki/devel/setup.bash
$ rosdep install --from-paths src -i -y
$ catkin_make
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
从上面的安装顺序以及依次source的setup.bash文件可以看出他们三个工作空间的层级关系。
3、环境设置
【kobuki平台】
# 设置udev规则使得电脑自动识别kobuki串口,无需每次用chmod赋权限
$ . ~/turtlebot/devel/setup.bash
$ rosrun kobuki_ftdi create_udev_rules
# 如果你使用Kinect作为3D传感器就设置一下TURTLEBOT_3D_SENSOR
$ echo "export TURTLEBOT_3D_SENSOR=kinect" >> ~/turtlebot/devel/setup.sh
$ source ~/turtlebot/devel/setup.bash
#将Turtlebot空间设置为默认空间,以后可以不用每次运行source命令
$ echo "source ~/turtlebot/devel/setup.bash" >> ~/.bashrc
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
接下来说一下电池变量
# 运行turtlebot_dashboard查看Turtlebot运行状态
$ roslaunch turtlebot_bringup minimal.launch
$ roslaunch turtlebot_dashboard turtlebot_dashboard.launch
# 如果看到上面面板上的笔记本电池能够显示电量就不用专门设置下面的电池环境变量了,如果无法正常显示电量的话需要设置以下变量
$ echo "export TURTLEBOT_BATTERY=/proc/acpi/battery/BAT1" >> ~/turtlebot/devel/setup.sh
$ source ~/turtlebot/devel/setup.bash
- 1
- 2
- 3
- 4
- 5
- 6
如果显示找不到/proc/acpi/battery/BAT1
说明电池文件不在这个位置
Linux内核版本<= kernel 2.6的系统电池文件位置应该在/proc/acpi/battery/
名字有可能是BAT0
或者BAT1
Linux内核版本是kernels 3.0+的系统,电池文件在/sys/class/power_supply/
文件夹下,名字有可能是BAT0
或者BAT1
所以 TURTLEBOT_BATTERY=/sys/class/power_supply/BAT0
或者TURTLEBOT_BATTERY=/sys/class/power_supply/BAT1
最简单办法是在系统/
目录下搜索BAT0
或者BAT1
文件,从而确认TURTLEBOT_BATTERY
的值
【create平台】
修改~/.bashrc文件,这样每次启动都将自动设置这些环境变量,否则每次都要用export命令逐个添加这些环境变量。
先打开.bashrc文件:
$ gedit ~/.bashrc
- 1
再在文件末尾添加如下语句:
(我的移动机器人平台是turtlebot一代:IRobot Create+Kinect)
# For a source installation
source ~/turtlebot/devel/setup.bash
# Export the turtlebot variables
export TURTLEBOT_BASE=create
export TURTLEBOT_STACKS=circles
export TURTLEBOT_3D_SENSOR=kinect
export TURTLEBOT_SERIAL_PORT=/dev/ttyUSB0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
到这里就安装完成了。
可以以最小模式运行turtlebot机器人测试一下是否安装成功,如果环境变量配置正确,下面命令中的单词输入一部分之后按下Tab键是可以自动补全该单词的。
$ roslaunch turtlebot_bringup minimal.launch
- 1
4、另一种安装方式
前面讲了从源码安装turtlebot包的过程,这种安装方式使得包里的源码都在用户目录(~/)下,运行节点的文件就在~/rocon、~/kobuki、~/turtlebot相应的文件夹里,这样在运行中要修改参数或者修改某个节点就可以直接在这些文件夹下找到对应的文件进行修改了。基于这点考虑,博主推荐使用前面介绍的从源码安装的方式。
下面要介绍deb方式安装的方法,这种方法很简单,运行apt-get命令就可以了,但是问题就来了,这种方式安装会导致turtlebot工作空间中的许多包单独在/opt/ros/indigo/share里面,根本看不出这些包之间的关系,有的时候想单独运行一个节点而不记得名字也没办法根据代码来找这个节点,因为在/opt/ros/indigo/share文件夹下有无数个包,你根本找不过来。
所以对于想理解ROS的工作空间中的包之间的关系、launch文件启动哪些节点、如何编写自己的节点和launch文件的初学者博主不建议以deb方式安装turtlebot包!!!
说了半天,deb安装方式就是apt-get的安装方式,一句话搞定:
$ sudo apt-get install ros-indigo-turtlebot ros-indigo-turtlebot-apps ros-indigo-turtlebot-interactions ros-indigo-turtlebot-simulator ros-indigo-kobuki-ftdi ros-indigo-rocon-remocon ros-indigo-rocon-qt-library ros-indigo-ar-track-alvar-msgs
- 1
如果你只是想用一下turtlebot里的某些包而不关心代码,运行上面这行命令就行了。
然后是环境设置:
还是打开.bashrc文件:
$ gedit ~/.bashrc
- 1
再在文件末尾添加如下语句:
(我的移动机器人平台是turtlebot一代:IRobot Create+Kinect)
# For a deb installation
source /opt/ros/indigo/setup.bash
# Export the turtlebot variables
export TURTLEBOT_BASE=create
export TURTLEBOT_STACKS=circles
export TURTLEBOT_3D_SENSOR=kinect
export TURTLEBOT_SERIAL_PORT=/dev/ttyUSB0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
和前面源码安装不一样的地方就是source的文件不同。
【轶事】
博主一开始干过一件很逗比的事儿,看ROSWIKI上英文教程安装turtlebot包的时候二话不说,把教程里所有命令依次粘贴到终端运行一遍,那个教程里是这样的:
2.2节是deb方式安装
2.3节是从源码安装
这些命令我依次运行下来就是把两种方式都走了一遍,这样导致我的~/目录下面有turtlebot包的代码,而/opt/ros/indigo/share也有这些代码,在没注意source了哪个工作空间的情况下我根本不清楚一个命令下去运行的是哪个目录下的节点,有的时候修改了节点参数,再次运行却发现完全没有变化,所有的这些问题都是因为我把turtlebot包安装了两次!!!
知道了问题的原因,那么对于初学者的我来说那就好办了,根据安装的方式用同样的apt-get命令卸载deb方式安装的那些包:
$ sudo apt-get --purge remove ros-indigo-turtlebot ros-indigo-turtlebot-apps ros-indigo-turtlebot-interactions ros-indigo-turtlebot-simulator ros-indigo-kobuki-ftdi ros-indigo-rocon-remocon ros-indigo-rocon-qt-library ros-indigo-ar-track-alvar-msgs
- 1
还记得安装这三个工作空间的时候运行的命令里面有三句source命令,他们直接恰好是前后衔接的么:
$ source /opt/ros/indigo/setup.bash
.
.
.
$ source ~/rocon/devel/setup.bash
.
.
.
$ source ~/kobuki/devel/setup.bash
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
这样思路就很清晰了,刚打开终端的时候默认是运行在turtlebot工作空间的,由于组合空间的层次关系(请看上面三句source命令),最顶层的/opt/ros/indigo/share也可以被rospack找到,这样不管你是想运行turtlebot里面的节点还是/opt/ros/indigo/share下面的节点系统都能找到,不信你用 roscd [package]或者rospack find [package]命令试试看。这也有助于理解工作空间覆盖的问题。