前言

由于之前已经了 Ubuntu 22.04 LTS Jammy 双系统,想装 ros noetic,但发现 ros noetic 的 release 只支持到 20.04,所以就想自己从源码构建一个。但是,装完发现 autolabor 官方已经编译了一个 ros noetic ninjemys 安装包,按照以下步骤直接安装即可

使用 autolabor 官方的安装包

添加源

1
echo "deb [trusted=yes arch=amd64] http://deb.repo.autolabor.com.cn jammy main" | sudo tee /etc/apt/sources.list.d/autolabor.list

更新源

1
sudo apt update

安装

网不好可能需要多试几次

1
sudo apt install ros-noetic-autolabor

就这样,简简单单。
以下手动构建的内容权当娱乐>_<

从源码构建

基础准备

首先我们需要安装如下基础软件包来确保后面步骤的正常进行:

1
sudo apt install git gnupg wget

安装构建依赖的工具

首先添加 packages.ros.org 作为软件提供者

1
2
3
4
5
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list'

curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

sudo apt update

然后安装构建所需要的依赖工具

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

安装完成后,我们就可以初始化 ros 的依赖管理工具了

1
sudo rosdep init

安装 hddtemp¿

虽然很神奇,但是我们确实需要为为 Ubuntu 22.04 安装 hddtemp。推测是 ros 需要 hddtemp 但是在 22.04 这个被移除了。

1
2
3
4
5
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

然后我们需要让 rosdeb 知道你本地已经有 hddtemp 了,为此,我们需要让 ros 读取本地修改过的 base.yaml 文件而不是让它直接从仓库拉取。
我们首先需要拉下来一个 base.yaml 来修改

1
2
3
cd ~/Downloads

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

然后打开下载的 base.yaml 文件,在 hddtemp 部分添加 jammy: [hddtemp] 。修改之后文件的 hddtemp 部分应如下所示(注意最后一行):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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]

最后只需要让 rosdep 读取本地的 base.yaml 文件就可以了
先下载 ros 的 default.list

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

修改本地的 default.list 文件

1
vim /etc/ros/rosdep/sources.list.d/20-default.list

只需修改你的用户名为你的用户名(?),当然,如果你把 base.yaml 放在了别处就修改整个地址为你 base.yaml 的位置就行

1
2
3
4
5
6
7
8
9
10
11
# 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
yaml file:///home/你的用户名/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 即可

1
rosdep update

下载 ROS 包的依赖项

创建一个文件夹来临时存放源码

1
2
3
mkdir ~/ros_catkin_ws

cd ~/ros_catkin_ws

下载 ros-noetic-desktop-full 的源代码

1
2
3
4
5
rosinstall_generator desktop --rosdistro noetic --deps --tar > noetic-desktop.rosinstall

mkdir ./src

vcs import --input noetic-desktop.rosinstall ./src

然后安装所有这些 ROS 包的依赖项,大抵是需要等一会

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

小修一下原版的包

原版的 ros 有两个包(rosconsole 和 urdf)与 Ubuntu 22.04 不兼容
但是 github 上已经有解决方案了!感谢大佬们!

先备份一下原版的文件,免得修坏了

1
2
3
4
5
cd ~/ros_catkin_ws/src

mkdir ~/Downloads/backup

mv rosconsole urdf ~/Downloads/backup/

拉取 github 上兼容的的 rosconsole 和 urdf 包

1
2
3
4
5
6
7
git clone https://github.com/dreuter/rosconsole.git

cd rosconsole

git checkout noetic-jammy

cd ~/ros_catkin_ws/src
1
2
3
4
5
6
7
git clone https://github.com/dreuter/urdf.git

cd urdf

git checkout set-cxx-version

cd ~/ros_catkin_ws/src

安装!

终于,可以安装了
以下命令是将其默认安装在~/ros_catkin_ws/install_isolated这个位置。当然,你可以添加--install-space /opt/ros/noetic参数来让 ros 安装在/opt/ros/noetic 位置,也就是其在 20.04 上的默认位置
ros 会构建它所需要的包,这大抵还是需要一些时间

1
2
3
cd ~/ros_catkin_ws

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

大功告成

如果一切顺利,ros 应该是被成功安装了,你可以使用如下命令启动 roscore 来验证

1
2
3
source ~/ros_catkin_ws/install_isolated/setup.bash

roscore

看到末尾有started core service [/rosout]就是成功启动了

为了使你的 ros 命令添加在环境变量中,不用每次都 source,你可以

1
vim ~/.bashrc

在文件末尾加上

1
source ~/ros_catkin_ws/install_isolated/setup.bash

收工!