在树莓派上安装ros有两种方式:1 使用现成的ros安装包 2 从源代码开始编译
方式一 使用现成的ros包
使用方式1 比较简单,但是要求使用的ubuntu系统是在已有的支持列表里面,否则你无法找到对应的安装包。如何查看?个人的经验如下:
先检查:
网站1:Packages - /ros/ubuntu/lists/ :: Oregon State University Open Source Lab
找到你需要的ros版本,记录后面的ubuntu 版本名称,然后到:
网站2:Index of /ubuntu-cdimage/releases/ (ustc.edu.cn) 找对应的ubuntu 下载。
比如我希望在树莓派上安装ros1,ros1可选的有melodic 和noetic,可以从网站1发现ubuntu focal版本可以满足要求,而且提供了arm版本的。
提示:还要留意32位和64位
然后到网站2可以看到focal版本是有树莓派的版本:
那么下载上面的ubuntu版本就是可以使用的,需要注意的是不要以ubuntu的数字版本做检索,比如22.04 既有jammy 也有focal,而jammy版本由于没对应ros版本无法使用现有的二进制包。
操作系统选对后可以直接按照ros官方网站步骤安装即可,比如按照noetic/Installation/Ubuntu - ROS Wiki 步骤操作。
方式2 手动自行编译:
如果你选用了非官方的ubuntu版本,则需要自己编译
我们以手动在树莓派虚拟环境上编译安装ros noetic为例介绍。
核心步骤按照官方文档从源代码编译(noetic/Installation/Source - ROS Wiki),但是由于国内访问国外部分资源受限,官方文档也需要适当修正才能完整的编译下来,本文只聚焦编译流程,编译错误如非必要不在本文详述。
系统:
目标硬件:树莓派4b (本文档采用arm虚拟机编译编译方式,故整个编译不需要有树莓派硬件)
树莓派操作系统:2022-09-22-raspios-buster-armhf.img.xz
注意:buster是32位系统,如果你需要64位系统请自行替换
存储容量不要低于8G。
Pc机:ubuntu 22.04 (Jammy Jellyfish)
准备工作(如直接使用烧写到树莓派的真机编译则不需要此步骤)
将2022-09-22-raspios-buster-armhf.img的rootfs提取出来单独做一个像文件并将该文件扩大到8G。
如果是实体tf卡,用下面命令扩容(分区号改成实际的分区):
e2fsck -f /dev/sdb5
resize2fs -p /dev/sdb5 1G
如果是虚拟像:
sudo e2fsck -f rootfs-raspberry.img
sudo resize2fs rootfs-raspberry.img 8G
*Pc预先安装一些支持库(可选):
sudo apt-get install qemu-user-static binfmt-support
确认一下解析器是否正常:
cat /proc/sys/fs/binfmt_misc/qemu-arm
将arm解析软件复制到镜像系统的/usr/bin/目录下面。
sudo cp /usr/bin/qemu-arm-static /media/shuaiwen/rootfs/usr/bin/
提示:qemu-arm-static 属于解释程序,其将arm指令翻译成对应x86的指令集,可以认为是一个指令翻译工具。
依次运行下面命令,将内核接口暴露给u盘系统:
export RASP_ROOT=/media/shuaiwen/rootfs/
sudo -E mount -o bind /dev $RASP_ROOT/dev
sudo -E mount -o bind /sys $RASP_ROOT/sys
sudo -E mount -o bind /proc $RASP_ROOT/proc
sudo -E mount -o bind /run $RASP_ROOT/run
进入虚拟环境:
sudo chroot $RASP_ROOT /bin/bash
按照noetic/Installation/Source - ROS Wiki 进行源代码级别的安装
增加ros源:
sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
增加密钥:
curl -s https://raw.fastgit.org/ros/rosdistro/master/ros.asc | sudo apt-key add -
注意,官网的源是raw.githubusercontent.com,由于该网站被国内屏蔽,这里改为了raw.fastgit.org
开始更新系统:
apt update
安装必要的包:
apt-get install python3-rosdep python3-rosinstall-generator python3-vcstools python3-vcstool build-essential
修改usr/lib/python3/dist-packages/rosdep2/里面的文件,将所有raw.githubusercontent.com 改成raw.fastgit.org,对我的系统是修改下面三个文件:
sources_list.py rep3.py 和gbpdistro_support.py
sudo rosdep init
然后替换下列文件和目录里面所有包含githubusercontent.com字段为fastgit.org:
*/etc/ros/rosdep/sources.list.d/20-default.list
*/lib/python3/dist-packages/rosdistro目录
运行$rosdep update,如果遇到类似:
ERROR: Rosdep experienced an error: IncompleteRead(64756 bytes read, 143816 more expected)
这样的错误,暂时解决方法(后续有空的话修订一下断点续传问题):
用wget获取文件保存到本地
修改文件/usr/lib/python3/dist-packages/rosdistro/__init__.py直接加载本地保存的文件
def _load_yaml_data(url):
logger.debug('Load file from "%s"' % url)
print('shuaiwen Load file from "%s"' % url)
if url=='https://raw.fastgit.org/ros/rosdistro/master/foxy/distribution.yaml':
print('load specificed file')
f=open('/root/distribution.yaml')
return yaml.safe_load(f)
if url=='https://raw.fastgit.org/ros/rosdistro/master/galactic/distribution.yaml':
f=open('/root/galactic-distribution.yaml')
return yaml.safe_load(f)
if url=='https://raw.fastgit.org/ros/rosdistro/master/humble/distribution.yaml':
f=open('/root/humble-distribution.yaml')
return yaml.safe_load(f)
if url=='https://raw.fastgit.org/ros/rosdistro/master/melodic/distribution.yaml':
f=open('/root/melodic-distribution.yaml')
return yaml.safe_load(f)
if url=='https://raw.fastgit.org/ros/rosdistro/master/noetic/distribution.yaml':
f=open('/root/noetic-distribution.yaml')
return yaml.safe_load(f)
if url=='https://raw.fastgit.org/ros/rosdistro/master/rolling/distribution.yaml':
f=open('/root/rolling-distribution.yaml')
return yaml.safe_load(f)
yaml_str = load_url(url)
return yaml.safe_load(yaml_str)
上面的链接需要根据各自实际错误情况修改,以上只是我机器上看到的现象,修改完后rosdep update 可以正常执行完。
解释:urllib没有断点续传功能,如果用python命令行直接输入下面命令可以出现同样现象:
with urllib.request.urlopen('https://raw.fastgit.org/ros/rosdistro/master/foxy/distribution.yaml') as response:
html=response.read()
如果用wget 测试抓取该文件,发现他也是连续重复了多次才获得完整的数据包:
即根本原因是断点续传功能不完善导致。
开始编译:
创建工作目录:
mkdir ~/ros_catkin_ws
$ cd ~/ros_catkin_ws
下载编译需要代码:
$ rosinstall_generator desktop --rosdistro noetic --deps --tar > noetic-desktop.rosinstall
$ mkdir ./src
替换git下载位置(非必须):
修改noetic-desktop.rosinstall 文件,将github.com都修改为kgithub.com这样访问速度快
下载相关文件
$ vcs import --input noetic-desktop.rosinstall ./src
运行中出现错误的包会出现E字,可以重新运行上面命令,对于少数无法正常下载的,可以用wget直接下载,用wget下载后的文件解压后目录名字类似这样:
ros_comm-release-release-noetic-rosmsg-1.15.15-1/
名称对应本地目录为src/ros_comm/rosmsg,也就是将解压缩文件放到对应目录即可。
下载代码,运行命令:
$ rosdep install --from-paths ./src --ignore-packages-from-source --rosdistro noetic -y
正常会出现下面信息:
#All required rosdeps installed successfully
升级cmake,这一步非常重要,系统自带的cmake 3.16.3不能正常解析file 的GLOB,会导致一堆编译错误,需要升级cmake,我测试cmake 3.22.1可以工作,你可以按照:(4条消息) Ubuntu升级Cmake的正确方式_Liangtao`的博客-CSDN博客_ubuntu cmake升级升级cmake。
*编译:
./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=/usr/bin/python3