Ubuntu22.04 安装 Ros1 Noetic

从 Ubuntu22 开始,仅能安装 Ros2,没有 Ros1 的 apt 安装方法,因为官方并没有做适配。

Ros 官网中有关于 Ros1 源码安装攻略,但仅适用于对应的 Ubuntu 版本,如果在 Ubuntu22 上安装本应在 Ubuntu20 上安装的 Ros1,需要结合官方源码安装方法进行一定的修改。Ubuntu20 的最新内核版本仅为 5.15,可能无法满足 2023 年以及往后的新硬件的使用。

本文内容参考自Ros 官方源码安装以及 Jean-Guillaume Durand 编写的安装方法,同时加上了我自己的尝试,最终可以在 Ubuntu22 上面运行 Ros Noetic 并进行编译。

添加 Ros2 源

按照 Ros2 Humble 的官方安装说明添加 Ros2 的官方源。

添加 ROS2 GPG 密钥

sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/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] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

国内可以考虑使用镜像,例如使用中科大的 Ros 镜像。

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

安装引导程序依赖项

主要是 rosdep、vcstools 等一系列用于源码安装的工具。

sudo apt-get install python3-rosdep python3-rosinstall-generator python3-vcstools python3-vcstool build-essential

初始化 rosdep。

sudo rosdep init

此处与官方方式有所不同,如果按照官方更新方式rosdep update,必定会在后续过程中出现下面的错误:

# rosdep install --from-paths ./src --ignore-packages-from-source --rosdistro noetic -y
ERROR: the following packages/stacks could not have their rosdep keys resolved to system dependencies:
diagnostic_common_diagnostics: [hddtemp] defined as "not available" for OS version [*]

我们需要手动安装 hddtemp 包,同时修改 rosdep 初始化中的文件信息以解决问题。

安装 hddtemp

cd ~/Downloads
wget http://archive.ubuntu.com/ubuntu/pool/universe/h/hddtemp/hddtemp_0.3-beta15-53_amd64.deb
sudo apt install ~/Downloads/hddtemp_0.3-beta15-53_amd64.deb

修改 rosdep 初始化文件

下载 base.yaml 文件。

cd ~/Downloads
wget https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml

打开 base.yaml 文件,Ubuntu22 可以使用 gedit 修改。

gedit ~/Downloads/base.yaml

搜索 hddtemp,在 ubuntu 那一部分,添加上 ubuntu22 的名字,如下所示:

hddtemp:
  arch: [hddtemp]
  debian: [hddtemp]
  fedora: [hddtemp]
  freebsd: [python27]
  gentoo: [app-admin/hddtemp]
  macports: [python27]
  nixos: [hddtemp]
  openembedded: [hddtemp@meta-oe]
  opensuse: [hddtemp]
  rhel: [hddtemp]
  slackware: [hddtemp]
  ubuntu:
    "*": null
    bionic: [hddtemp]
    focal: [hddtemp]
    impish: [hddtemp]
    jammy: [hddtemp]

修改 20-default.list 文件内容

修改Rosdep init创建的 20-default.list 文件内容,使其读取本地的 base.yaml 文件

sudo gedit /etc/ros/rosdep/sources.list.d/20-default.list

修改为如下内容:

# os-specific listings first
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml osx

# generic
# yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml
# 确保下面的base文件路径和你的保存位置一致,前缀file://即为读取本地文件,/home/your_usernme/需要根据你的设置进行修改
# 也可以移动base.yaml文件到你需要的地方,保证下面的位置是你移动的位置即可
yaml file:///home/your_username/Downloads/base.yaml
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml
yaml https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml
gbpdistro https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml fuerte

# newer distributions (Groovy, Hydro, ...) must not be listed anymore, they are being fetched from the rosdistro index.yaml instead

更新 rosdep

rosdep update

可能会需要一定时间(需要连接到 Github),可以考虑修改 hosts 文件,抑或其他帮助连接 Github 的方法,具体请自行查阅。

正式安装

创建 catkin 工作区

主要用于存放安装 Ros 的源码工作区。

mkdir ~/ros_catkin_ws
cd ~/ros_catkin_ws

使用 vcstools 下载 Ros 包,安装 Desktop 版本

rosinstall_generator desktop --rosdistro noetic --deps --tar > noetic-desktop.rosinstall
mkdir ./src
vcs import --input noetic-desktop.rosinstall ./src

个人更推荐安装 Desktop full 版本,更全面一点,代码如下:

rosinstall_generator desktop_full --rosdistro noetic --deps --tar > noetic-desktop.rosinstall
mkdir ./src
vcs import --input noetic-desktop.rosinstall ./src

解决依赖问题

安装 Ros 包可能有相互依赖的情况,如果缺少系统依赖则无法使用,需要使用 rosdep 工具自动检测并安装相应的依赖文件。

rosdep install --from-paths ./src --ignore-packages-from-source --rosdistro noetic -y

解决兼容问题

构建 Ros1 Noetic 之前,我们需要手动修补 src 文件夹中的两个包,以兼容 Ubuntu22.04:

  • rosconsole:ROS 的控制台日志记录实用程序
  • urdf:统一机器人描述格式(URDF)文件的解析器

相关的修补程序在 Github 上有开源实现,作者Daniel Reuter,参考链接:

使用 Github 上的修改包直接替换初始源码包。

cd ~/ros_catkin_ws

# Download and use fix branch
git clone https://github.com/dreuter/rosconsole.git
cd rosconsole
git checkout noetic-jammy
cd ..
mv rosconsole src

git clone https://github.com/dreuter/urdf.git
cd urdf
git checkout set-cxx-version
cd ..
mv urdf src

构建 Ros1 Noetic

使用catkin_make_isolated命令构建 Ros1 Noetic,并安装

./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release

Ros1 将会自动安装到所设置的 catkin 工作区中的 install_isolated 文件夹中,更新后即可正常使用 Ros1 了!

source ~/ros_catkin_ws/install_isolated/setup.bash

可以直接将 source 命令写入 bashrc 中,避免每次使用时都需要更新。

其他

安装的 Ros1 Desktop full 版本并非完全包含所需要的 Ros packages,可能还需要单独安装包。例如 octomap、mavros 等等。在 Ubuntu20 下安装方式为:

sudo apt install ros-noetic-octomap ros-noetic-mavros

但从源码安装 Ros1,相应的包也需要源码安装。过程如下。

生成包文件并自动下载依赖

cd ~/ros_catkin_ws
rosinstall_generator package1 package2 --rosdistro noetic --deps --tar > noetic-packages.rosinstall
vcs import --input noetic-packages.rosinstall ./src

package1 和 package2 的位置替换为需要安装的包即可,注意不需要添加 ros-noetic-的内容,也可以继续在后面放更多的包以一次性安装,但是个人建议还是单独安装比较稳妥(因为 Github 连接问题,vcs 下载包的方式会导致必须所有依赖项都正确下载才能正常编译)。 以 mavros 举例,安装方式为:

cd ~/ros_catkin_ws
rosinstall_generator mavros --rosdistro noetic --deps --tar > noetic-packages.rosinstall
vcs import --input noetic-packages.rosinstall ./src

替换 rosconsole 和 urdf

新生成的包文件可能对 rosconsole 和 urdf 存在依赖,参考本文解决依赖问题部分进行替换即可。

安装

./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release
source ~/ros_catkin_ws/install_isolated/setup.bash