树莓派4b系统上安装ros1

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

在树莓派上安装ros有两种方式1 使用现成的ros安装包 2 从源代码开始编译

  • 方式一 使用现成的ros包

使用方式1 比较简单但是要求使用的ubuntu系统是在已有的支持列表里面否则你无法找到对应的安装包。如何查看个人的经验如下

先检查

网站1Packages - /ros/ubuntu/lists/ :: Oregon State University Open Source Lab

找到你需要的ros版本记录后面的ubuntu 版本名称然后到

网站2Index of /ubuntu-cdimage/releases/ (ustc.edu.cn) 找对应的ubuntu 下载。

比如我希望在树莓派上安装ros1ros1可选的有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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6