跳到主要内容

ROS1 环境搭建

主要介绍搭建 ROS1 Noetic 版本的环境。

提示
  • 建议以下操作基于 VNC 远程桌面或者连接显示器进行操作。
  • ROS 环境是搭建在 Docker 容器中的,建议先安装和学习 Docker 的使用。
  • Ubuntu 是 ROS 官方首选和主要支持的发行版,我们会基于 Docker 的 Ubuntu 镜像来搭建 ROS 环境。

拉取 Docker 镜像

使用 docker pull 命令拉取 Ubuntu20.04 的 Docker 镜像。

radxa@device$
docker pull ubuntu:20.04

编写 Docker 脚本

使用脚本启动 Ubuntu20.04 的 Docker 容器。

您需要编写一个启动脚本 ros_noetic.sh:

radxa@device$
vi ros_noetic.sh

添加以下内容到 ros_noetic.sh 脚本内:

#!/bin/bash
xhost +

docker run -it \
--net=host \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
-v /tmp/.X11-unix:/tmp/.X11-unix \
ubuntu:20.04 /bin/bash

参数说明:

  • xhost +: 允许 Docker 容器访问 X11 服务器
  • -it: 以交互模式运行容器
  • --net=host: 使用主机的网络栈
  • --env="DISPLAY": 设置环境变量,用于显示 X11 图形界面
  • --env="QT_X11_NO_MITSHM=1": 设置环境变量,用于 Qt 应用程序的显示
  • -v /tmp/.X11-unix:/tmp/.X11-unix: 挂载 X11 Unix 域套接字,用于显示 X11 图形界面
  • ubuntu:20.04: 使用 Ubuntu 20.04 镜像
  • /bin/bash: 在容器内启动 Bash shell

启动 Docker 容器

使用 bash 命令启动脚本。

radxa@docker$
bash ros_noetic.sh

安装 Noetic

编码环境检查

确保安装 Noetic 的环境支持 UTF-8 编码。

radxa@docker$
locale

若系统编码格式是 UTF-8,你可以在终端看到类似以下信息输出:

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

若终端输出的信息不是 UTF-8 编码,你可以在终端输入以下命令来安装和修改编码环境:

radxa@docker$
apt update && apt install locales
locale-gen en_US en_US.UTF-8
echo "export LANG=en_US.UTF-8" >> ~/.bashrc
source ~/.bashrc

设置软件源和密钥

确保系统处于最新的环境,然后添加清华软件源和密钥。

radxa@docker$
apt update && apt upgrade
apt install lsb-core
sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

安装 Noetic

使用以下命令安装 Noetic 完整桌面版。

radxa@docker$
apt update && apt upgrade
apt install ros-noetic-desktop-full -y

安装依赖

使用以下命令安装 Noetic 的依赖包。

radxa@docker$
apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential -y

初始化 rosdep

使用以下命令初始化 rosdep。

radxa@docker$
rosdep init
rosdep update

若 rosdep init 出现 ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list Website may be down. 错误提示,访问 https://www.ipaddress.com/ 搜索 raw.githubusercontent.com 域名,并将搜索得到的 IP 地址填写进 /etc/hosts 文件。

radxa@docker$
vi /etc/hosts

添加以下内容:

185.199.110.133 raw.githubusercontent.com

然后重新运行初始化 rosdep 命令。

设置环境变量

使用以下命令设置环境变量:

radxa@docker$
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

验证 ROS 环境

在终端输入以下命令验证 ROS 环境是否安装成功。

radxa@docker$
roscore

若安装成功,你会看到类似以下信息输出:

... logging to /root/.ros/log/a9473172-5731-11f0-9a87-5acb6b3cedae/roslaunch-rock-4d-spi-27211.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://rock-4d-spi:34861/
ros_comm version 1.17.4

# SUMMARY

PARAMETERS

- /rosdistro: noetic
- /rosversion: 1.17.4

NODES

auto-starting new master
process[master]: started with pid [27219]
ROS_MASTER_URI=http://rock-4d-spi:11311/

setting /run_id to a9473172-5731-11f0-9a87-5acb6b3cedae
process[rosout-1]: started with pid [27229]
started core service [/rosout]

使用 Ctrl + C 可以停止 roscore。

保存 Docker 镜像

目前我们的修改都是基于 Ubuntu20.04 的 Docker 容器,我们需要把这个修改的容器保存为镜像,以便下次直接使用。

注意:若没有保存为镜像,下次启动容器时需要重新安装 ROS 环境。

查看正在运行的容器

在 Cubie A7A 的另一个没有进入 Docker 容器的终端输入以下命令查看正在运行的容器。

radxa@device$
docker ps

提交容器为镜像

在 Cubie A7A 的另一个没有进入 Docker 容器的终端输入以下命令提交容器为镜像。

提示

需要根据 docker ps 命令输出的容器 ID进行命令的修改。

radxa@device$
docker commit [CONTAINER ID] [NEW NAME]

# 示例

docker commit e5c795d8ca66 ros_noetic:1.0

等待提交完成,完成后会输出类似以下信息输出:

sha256:43b559a4d879c83477764730e0af90e8904e8fb8aeeeb9b653967e665bb7a7ca

修改启动脚本

将启动脚本 ros_noetic.sh 内的启动镜像修改为刚才保存的镜像名称:

#!/bin/bash

xhost +

docker run -it \
--net=host \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
-v /tmp/.X11-unix:/tmp/.X11-unix \
ros_noetic:1.0 /bin/bash