本文详细介绍了在 Jetson Orin Nano 类似的 ARM 设备上编译安装 ROS2 的 Foxy 分支的过程,包括从源代码编译、安装依赖库、设置环境变量等方面。同时,针对安装过程中可能遇到的问题,提供了相应的解决方案,以帮助读者顺利完成 ROS2 的安装。

文章目录

[TOC]

1. 背景

Jetson 边缘计算设备之前的 Ubuntu 版本为18.04,在出了 Orin 系列后,Ubuntu 版本可以安装 20.04 的,对于直接安装 ROS2 不使用容器化时,可以直接安装 foxy 分支版本。但是,因为 Jetson 设备是 ARM 架构的,若从源码构建我们并不能使用官方在 Github 提供的预编译版本,所以需要走通过源码自行编译这条路。

2. 准备工作

为了保证在国内快速拉取依赖包,首先需要通过 Ubuntu 的包管理 GUI 界面将软件源更换为国内,你也可以直接前往 Ubuntu Ports 软件仓库镜像使用帮助 选择 20.04 LTS 根据帮助说明进行修改清华的仓库镜像。

2.1 基础源

修改 /etc/apt/sources.list

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse

# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse

deb http://ports.ubuntu.com/ubuntu-ports/ focal-security main restricted universe multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ focal-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-proposed main restricted universe multiverse

2.2 ROS2 源

同时,把ROS的软件源也按照说明进行处理:ROS2 软件仓库镜像使用帮助

下载 ROS 的 GPG Key:

sudo apt install curl gnupg2
sudo curl -sSL https://gitcode.net/marin1993/rosupdate/-/raw/master/ros.key  -o /usr/share/keyrings/ros-archive-keyring.gpg

添加仓库源:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu focal main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

sudo apt update

注意:此时如果你不想折腾,走编译安装的坑,并且不在意安装的是否为最新版本,那么你可以直接使用下面的命令安装,并直接转到最后的安装验证一节。以下的安装命令适用于开发测试阶段:

sudo apt install ros-foxy-desktop python3-argcomplete ros-dev-tools

3. 编译安装

接下来参考官方的编译安装说明往下走即可,出现的问题主要就是国内的网络问题。

3.1 安装开发工具和 ROS 工具

开发工具:

sudo apt update && sudo apt install -y \
  libbullet-dev \
  python3-pip \
  python3-pytest-cov \
  ros-dev-tools

安装用于测试等一些 Python 库

python3 -m pip install -U \
  argcomplete \
  flake8-blind-except \
  flake8-builtins \
  flake8-class-newline \
  flake8-comprehensions \
  flake8-deprecated \
  flake8-docstrings \
  flake8-import-order \
  flake8-quotes \
  pytest-repeat \
  pytest-rerunfailures \
  pytest

安装 Fast-RTPS Cyclone DDS 的依赖

sudo apt install --no-install-recommends -y \
  libasio-dev \
  libtinyxml2-dev \
  libcunit1-dev

3.2 获取 ROS2 代码

创建工作区并克隆所有存储库,注意给git使用代理,不然拉不下来,或者使用镜像仓库。使用下面的命令即可使用镜像的仓库进行下载。

mkdir -p ~/ros2_foxy/src
cd ~/ros2_foxy
vcs import --input https://gitcode.net/marin1993/rosupdate/-/raw/master/foxy_ros2.repos src

3.3 使用 rosdep 安装依赖项

其实最主要的问题是 rosdep 这一块的处理,不像 git 那么好操作,代理使用起来也是很容易丢包失败,我们可以体验到各种的 ERROR 和 Failed 的,这些是 Github 访问不畅造成的。

我们可以将资源改为国内的,这里主要使用 gitcode 和 ghproxy 代理站点。

在开始安装依赖前,需要修改 rosdep2 的一些源码中的仓库参数,修改后的文件可以在这个仓库找到,如果版本还一致,可以直接替换: https://gitcode.net/marin1993/rosupdate

对于文件的修改内容,主要是将 github 资源的前缀改为为此前缀 https://gitcode.net/mirrors/ros/rosdistro/-/raw/master/ 。以下是详细修改内容:

3.3.1 rosdep2

risdep2 版本 0.22.2,修改此目录下文件 /usr/lib/python3/dist-packages/rosdep2

sources_list.py 第64行: DEFAULT_SOURCES_LIST_URL = 'https://gitcode.net/marin1993/rosupdate/-/raw/master/20-default.list'

rep3.py 第36行:REP3_TARGETS_URL = 'https://gitcode.net/mirrors/ros/rosdistro/-/raw/master/releases/targets.yaml'

gbpdistro_support.py 第34行:FUERTE_GBPDISTRO_URL = 'https://gitcode.net/mirrors/ros/rosdistro/-/raw/' \ 'master/releases/fuerte.yaml'

3.3.2 rosdistro

rosdistro 版本 0.9.0,修改 /usr/lib/python3/dist-packages/rosdistro/__init__.py

第68行:DEFAULT_INDEX_URL = 'https://gitcode.net/mirrors/ros/rosdistro/-/raw/master/index-v4.yaml'

3.3.3 后续处理

接下来的操作就回归正常了:

sudo apt upgrade
sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-5.3.1 urdfdom_headers"

当看到 All required rosdeps installed successfully 就代表依赖安装成功了,接下来就是编译了。

cd ~/ros2_foxy/
colcon build --symlink-install

此时只需要等待即可,这边在Jetson Orin Nano设备上用了一个小时多的时间,ros2 就编译完成了。

4. 安装验证

4.1 环境变量

首先我们需要将 ros 加入环境变量,对于使用 apt 方式安装的用户,使用下面的命令添加:

echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc
source ~/.bashrc

对于编译安装,因为路径不同,则应使用下面这个命令:

echo "source ~/ros2_foxy/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

4.2 简单测试

处理好环境变量我们就可以简单测试安装好的 ROS2 了,使用 talker 和 listener 节点可以在控制台中进行简单的测试。只需在两个不同的控制台分别执行以下命令: ros2 run demo_nodes_cpp talkerros2 run demo_nodes_py listener

5. 最后

在本文中,我们详细介绍了如何在 Jetson Orin Nano 设备上编译安装 ROS2 的 Foxy 分支版本的过程,并提供了相应的解决方案以帮助读者顺利完成 ROS2 的安装。如果在使用过程中遇到任何问题可以参考查阅 ROS2 官方文档。如果你对ROS感兴趣,可以关注我的其他相关文章。