跟很多人的想法一样,我也想自己搭建一个基于ROS的可移动平台,由于特别喜欢树莓派,就想把ROS装到树莓派3上面,折腾了好几天,终于装好了。过程中参考了不少大神的教程,主要参考了著名博主东方赤龙和ROS官方教程,但是Raspbian版本和一些依赖包的更新导致我在安装的时候不能完全参考这两个教程。安装的过程中也是遇到了很多问题,所以总结了一些经验,希望能够帮到大家,有什么错误也希望大家能够指出。
1、准备材料
树莓派3B, ROS Indigo, 16G SD卡,Raspbian OS(博主装的是jessie)
2、准备安装
2.1添加ROS代码仓库
Raspbian Jessie:
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu jessie main" > /etc/apt/sources.list.d/ros-latest.list' $ wget https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add -更新一下,否则很容易出错
$ sudo apt-get update $ sudo apt-get upgrade
2.2安装相关依赖包
Raspbian Jessie:
$ sudo apt-get install python-pip python-setuptools python-yaml python-distribute python-docutils python-dateutil python-six $ sudo pip install rosdep rosinstall_generator wstool rosinstall
2.3初始化rosdep
$ sudo rosdep init
$ rosdep update
3、开始安装
3.1创建catkin工作空间用于编译ROS源码
$ mkdir ~/ros_catkin_ws $ cd ~/ros_catkin_ws接下来下载ROS源码,我们要安装的是完整版(Desktop)
下载并产生package列表,耐心等待
$ rosinstall_generator desktop --rosdistro indigo --deps --wet-only --exclude roslisp --tar > indigo-desktop-wet.rosinstall $ wstool init src indigo-desktop-wet.rosinstall
$ wstool init src indigo-desktop-wet.rosinstall -j8
如果中途下载中断,可以使用下面的命令恢复下载,如果不确定是否完全下载也可以用下面的命令来检测
$ wstool update -t src
3.2解决依赖
3.2.1安装软件源没有的依赖包
这部分很重要,编译报错的原因大多数都是在这里,很多人在编译的过程中报错卡在"collada_parser"这里,这是因为"collada_parser"的依赖包"liburdfdom-headers-dev"在最近的几个版本都用使用C++11的std替换掉了boost组件,而"collada_parer"源码里面用的依旧是boost组件,所以我们不能直接安装最新版本(2.4)的"liburdfdom-headers-dev",这里我们要安装的是1.0.0版本,但是1.0.0版本又缺少一个头文件utils.h,具体解决方法在下面。
由于libconsole-bridge-dev, liblz4-dev, liburdfdom-headers-dev, liburdfdom-dev, collada-dom-dev这5个依赖包不在Raspbian的软件源里面,不能直接通过apt-get安装,需要下载源码手动编译安装
创建一个新目录来存放这5个依赖包
$ mkdir ~/ros_catkin_ws/external_src $ sudo apt-get install checkinstall cmake $ sudo sh -c 'echo "deb-src http://mirrordirector.raspbian.org/raspbian/ testing main contrib non-free rpi" >> /etc/apt/sources.list' $ sudo apt-get update
注意:update这一步不能省,确保全部更新完成,即使网络不好也要执行,博主在这一步因为update太慢直接跳过但是后面报错了。
libconsole-bridge-dev:
$ cd ~/ros_catkin_ws/external_src $ sudo apt-get build-dep console-bridge $ apt-get source -b console-bridge $ sudo dpkg -i libconsole-bridge0.2*.deb libconsole-bridge-dev_*.deb如果看到关于'-std=c++11' 的错误,按照下面的步骤将gcc版本升级到gcc 4.7+
sudo apt-get install g++-4.7 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7 sudo update-alternatives --config gcc
$ cd ~/ros_catkin_ws/external_src $ apt-get source -b lz4 $ sudo dpkg -i liblz4-*.deb
$ cd ~/ros_catkin_ws/external_src $ git clone https://github.com/ros/urdfdom_headers.git $ cd urdfdom_headers $ git reset --hard 9aed725 $ cmake . $ sudo checkinstall make install前面分析了编译过程可能出现"collada_parser"报错的原因,这里的'9aed725'就是将"liburdfdom-headers-dev"的安装版本变成我们需要的1.0.0版本。
check-install开始会让你输入包的描述,可以直接按回车跳过。当checkinstall询问是否改变安装选项时,选择[2],将名字从"urdfdom-headers" 改为 "liburdfdom-headers-dev",其余有[y]或[n]的问题都输入'n'按回车, 否则会编译出错
注:因为rosdep不认这几个package默认安装的名字,所以需要我们在安装的时候修改package名
安装完成后我们可以用下面的命令来查看已安装的包
$ dpkg -l运行上面命令在列表中没有看到我们安装的"liburdfdom-headers-dev"包,或者package名没有修改成功,运行下面命令重新安装(为确保这里的每个依赖包都正确安装,建议每安装一个包之后都用这个方法检查一遍)
$ sudo checkinstall make install
安装"liburdfdom-headers-dev"后我们还要下载添加一个文件(utils.h)到/usr/local/include/urdf_model目录下,否则编译会报错
$ cd /usr/local/include/urdf_model $ sudo wget https://raw.githubusercontent.com/ros/urdfdom_headers/master/urdf_model/include/urdf_model/utils.h
$ cd ~/ros_catkin_ws/external_src $ sudo apt-get install libboost-test-dev libtinyxml-dev $ git clone https://github.com/ros/urdfdom.git $ cd urdfdom $ cmake . $ sudo checkinstall make installcheck-install开始会让你输入包的描述,可以直接按回车跳过。当checkinstall询问是否改变安装选项时,选择[2],将名字从 "urdfdom"改为"liburdfdom-dev" ,其余有[y]或[n]的问题都输入'n'按回车, 否则会编译出错
collada-dom-dev:
$ cd ~/ros_catkin_ws/external_src $ sudo apt-get install libboost-filesystem-dev libxml2-dev $ wget http://downloads.sourceforge.net/project/collada-dom/Collada%20DOM/Collada%20DOM%202.4/collada-dom-2.4.0.tgz $ tar -xzf collada-dom-2.4.0.tgz $ cd collada-dom-2.4.0 $ cmake . $ sudo checkinstall make installcheck-install开始会让你输入包的描述,可以直接按回车跳过。当checkinstall询问是否改变安装选项时,选择[2],将名字从 "collada-dom"改为 "collada-dom-dev" ,其余有[y]或[n]的问题都输入'n'按回车, 否则会编译出错
3.2.2解决rosdep的依赖
Raspbian Jessie:
$ cd ~/ros_catkin_ws $ rosdep install --from-paths src --ignore-src --rosdistro indigo -y -r --os=debian:jessie这个命令会寻找所有src目录的package并递归安装依赖,要安装的依赖包有点多,耐心等待吧。
注意: Rosdep可能会提示python-rosdep, python-catkin-pkg, python-rospkg, 和 python-rosdistro 安装失败,可以忽略这些错误,因为他们已经由pip安装好了。
3.3编译catkin工作空间
3.3.1在开始编译之前,先打两个补丁。
$ nano ~/ros_catkin_ws/src/robot_model/collada_urdf/src/collada_urdf.cpp
修改 ~/ros_catkin_ws/src/robot_model/collada_urdf/src/collada_urdf.cpp文件,在最后一个#include(如果#include的下一行是#endif则放到#endif后)行后加入以下代码:
#ifdef __arm__
#include <strings.h>
bool Assimp::IOSystem::ComparePaths(const char *p1, const char *p2) const
{
return !::strcasecmp(p1,p2);
}
#include <strings.h>
bool Assimp::IOSystem::ComparePaths(const char *p1, const char *p2) const
{
return !::strcasecmp(p1,p2);
}
#endif
$ nano ~/ros_catkin_ws/src/rviz/src/rviz/mesh_loader.cpp
修改~/ros_catkin_ws/src/rviz/src/rviz/mesh_loader.cpp文件,在最后一个#include(如果#include的下一行是#endif则放到#endif后)行后加入以下代码:
#ifdef __arm__
#include <strings.h>
bool Assimp::IOSystem::ComparePaths(const char *p1, const char *p2) const
{
return !::strcasecmp(p1,p2);
}
#endif
#include <strings.h>
bool Assimp::IOSystem::ComparePaths(const char *p1, const char *p2) const
{
return !::strcasecmp(p1,p2);
}
#endif
3.3.2修改交换空间大小
树莓派在编译的时候会消耗很多CPU和内存资源,可能会出现死机和编译器内部错误,为了防止这种情况发生,需修改系统交换空间大小。
$ sudo nano /etc/dphys-swapfile找到CONF_SWAPSIZE=100,修改为 CONF_SWAPSIZE=1024
修改完后重启树莓派才能生效
$ sudo reboot
3.3.3正式编译和安装
$ cd ~/ros_catkin_ws $ sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/indigo执行上面命令默认使用4个核心来编译,会使得CPU的使用率长时间为100%,容易死机,所以我们可以加上-j2参数设定树莓派使用2个核心编译。
$ sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/indigo -j2
接下来要做的事情就是睡一觉或者干别的事情,没有好几个小时是不能编译好的。
...
...
...
不出什么意外等待几个小时后我们的ROS就编译安装完成了,下面我们设置一下ROS的环境变量。
$ source /opt/ros/indigo/setup.bash设置ROS环境变量在每次启动shell时自动添加到bash会话
$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc到这里我们的ROS完整版就已经成功安装好了,不妨运行roscore试一下
$ roscore成功运行roscore就证明我们安装成功了,接下来就可以按照官网教程愉快地学习了,距离做出自己的ROS移动平台又近了一步。
注意事项:上面libconsole-bridge-dev, liblz4-dev, liburdfdom-headers-dev, liburdfdom-dev, collada-dom-dev这几个package一定要按照顺序正确安装,尤其要注意名字有没有修改正确,如果安装错误必须得按照依赖关系卸载并重新安装。在update和安装依赖包的时候可能会因为网络问题中断,所以一定仔细看终端输出的信息,提示失败就重新执行命令。