树莓派4b系统上安装ros1

在树莓派上安装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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值