以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/YVfdF7fknRFpNUU5v7MV3A
环境准备
Linux 在国内运用得很广泛,尤其在嵌入式领域,而嵌入式在机器人开发方向用的比较多的还是基于 Ubuntu 发行版,虽然一般需要裁剪掉冗余的功能,而写作的时候主流版本集中在 16、18 这两个版本上。本文系统平台以 Ubuntu 18.04 x64 为例。
多亏了交叉编译器,开发的过程不需要依赖调试板,可以直接用虚拟机安装桌面版的 Ubuntu 并在其中编译调试程序,不建议物理主机安装多系统,因为容易弄坏主系统。我这里使用 VMware Workstation Payer,八戒介绍给大家的都是安全可靠的,关于版权问题无需担心,个人用户可以免费注册使用这套软件。
在虚拟机安装好 Ubuntu 系统之后,登录系统后先不要随意安装软件或者更新系统,有些软件版本可能和下面要安装的 ROS 系统有兼容性问题,为避免节外生枝,先搞定我们的 ROS2 安装过程,我们的目标是最大限度流畅体验!
切换安装源
在 Linux 生态下,有无数的个人和组织在贡献各种功能的软件,无论是源码或者可执行包,那么如此多的软件包,在用户端如何去下载使用和管理呢?
这需要有包管理系统的辅助,其中在 Ubuntu 这种基于 Debian 的 Linux 发行版或者直接就是 Debian 发行版,一般安装软件包都是倾向于使用包管理器 dpkg,而 apt 就是 dpkg 的前端命令行工具。为避免罗嗦,下面说的 apt 其实就是指 dpkg。
使用 apt 这类包管理系统下载或者更新已有软件包时,会从 apt 的服务器下载数据,官方 apt 服务器在墙外,由于众所周知的网络限制,相信墙内的小伙伴们都体验过跨墙的痛苦了。那么就有一批人为了墙内的同学们使用和学习方便,在墙内拷贝了一批 apt 服务器资源的镜像,镜像会定期从官方服务器拉取数据资源。当你的本地系统配置了包管理器的安装源为镜像源,那么使用包管理器安装软件包时,会自动改为从镜像源下载资源,免去了跨墙的网络阻滞。
而墙内使用率比较高的镜像源有清华大学镜像、阿里云镜像、中科大镜像等等。
经过以前的折腾(上一次是在本地安装 ROS1),最近项目需要切换到了 ROS2, 顺带摸清了使用包管理器可以最大化流畅安装 ROS2,但需要把包管理器的安装源切换到墙内的镜像。下面以清华的镜像源为例。
Ubuntu 的软件源配置文件是 /etc/apt/sources.list。先将系统自带的该文件做个备份,然后再将下面的内容覆盖原有文件内容,即可切换成功。
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
安装
字符支持 UTF-8
在本地化字符信息配置中,ROS2 要求必须支持 UTF-8。如果你不确定自己的环境是否符合要求,可以用下面的指令来测试一下,并根据模板文件更新本地化字符信息
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
设置 ROS2 安装源
既然安装 ROS2 过程中选择使用包管理器 apt,那么需要将 apt 的 ROS2 的安装源路径添加到系统中。要做到这一点,首先为 apt 添加授权 ROS2 仓库的 GPG 密钥
sudo apt update && sudo apt install curl gnupg2 lsb-release
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
关于第二条指令中需要访问域名 raw.githubusercontent.com,在墙内极有可能会失败,那么你可以在公众号后台回复关键词【ros.asc】,我已经帮你上传到云端,这样你就可以大概率地快速获取到文件 ros.asc。下载好该文件,存放到当前目录,可以把第二条指令改为
sudo apt-key add ./ros.asc
然后,把 ROS2 的仓库路径添加到 apt 的源列表中
sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture)] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list'
有的同学会发现安装源信息不是被写到 /etc/apt/sources.list 了,而是存到目录 /etc/apt/sources.list.d/ 中的新添加文件 ros2-latest.list。
/etc/apt/sources.list.d/ 这目录有什么用?一切都是为了避免所有的安装源配置信息都集中记录在同一个文件(/etc/apt/sources.list)里,这样确实比较难管理,于是在较新版本的系统中就有了这个文件夹,根据不同的软件分别有对应的文件记录各自的安装源,并存放在该文件夹下。
安装 ROS2 包
Ubuntu 18.04 能支持的 ROS2 最高版本是 crystal。下面以安装 ROS2 crystal 为例。为了方便后边的指令,先将版本信息 crystal 赋值到变量 CHOOSE_ROS_DISTRO
export CHOOSE_ROS_DISTRO=crystal
更新安装库缓存
sudo apt update
我这里安装桌面版,功能比较完整,其中包含了 ROS, RViz, demos, tutorials 等资源,和基础版的区别是多了 GUI 相关的模块
sudo apt install ros-$CHOOSE_ROS_DISTRO-desktop python3-argcomplete
如果你不想安装 GUI 相关的模块,可以换成下面这样,其中包含了通信组件、消息包和命令行工具等
sudo apt install ros-$CHOOSE_ROS_DISTRO-ros-base python3-argcomplete
还有开发工具,用于编译 ROS 包和其它的一些工具
sudo apt install ros-dev-tools
到这里整个安装 ROS2 就完成了,过程大概率是不会再报错了,除非你的网络状态真的太烂!还有在我的公众号是可以拿到相当多资源的。
卸载
本文的主题是安装 ROS2,但是这里也略带介绍一下卸载的指令,以后有需要可以使用
sudo apt remove ros-crystal-* && sudo apt autoremove
玩起来
启动环境
使用 ROS2 是通过指令 ros2 来操作,但是在打开命令行终端后,默认是找不到指令 ros2 的,需要先启动环境
source /opt/ros/crystal/setup.bash
如果你比较频繁依赖环境,可以把上面的操作追加到 ~/.bashrc
文件末尾,这样在当前用户打开命令行终端后就会自动启动环境。
echo "source /opt/ros/crystal/setup.bash" >> ~/.bashrc
试一下 demo 程序
ROS2 同时支持 C++ 和 Python,下面我们同时玩一下这两种语言的 demo,需要启动两个终端,分别运行 demo 程序,一个用于发送信息,另一个用于接收并显示信息。
启动 C++ 版本的 talker,发送信息
ros2 run demo_nodes_cpp talker
启动 Python 版本的 listener,接收信息
ros2 run demo_nodes_py listener