前言

希望通过本博客,记录本人搭建的完全过程,减少后来者的搭建成本,以此避免反复造轮子,在本文中,沿用了博客的一贯配置,即使用Docker搭建Ubuntu20.04,并完成后续系列操作,本博客算是系列章节的第一章。

安装ROS

此处走过很多的弯路,不过到头来发现,官方给出的安装流程,才是最正确最有效的,首先在这里给出ROS安装帮助说明和PX4的官方链接,我们照着路径一步步来,能够完成一个从入门到入土精通的安装配置。

生成Docker容器

本节可以参考自博客,在此不再赘述,安装完成后使用nvidia-smi验证安装结果。

安装ROS

在容器内,使用以下命令逐个完成ROS的安装,首先是获取适合当前版本的源,这一步可以使用对应的镜像,例如在使用清华源的情况下,可以使用如下命令:

1
sudo 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'

然后添加密钥,更新源,安装ROS:

1
2
3
sudo apt install curl # if you haven't already installed curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo apt update

这里使用的是最新的密钥安装方法,直接使用apt-key命令。然后下一步完成ROS的安装,推荐安装最完整的版本,即ros-noetic-desktop-full

1
sudo apt install ros-noetic-desktop-full

实际上,我自己的系统没有必要安装这么详细的内容,有相当大的一部分都使用不上,因此,安装一个基本版就足够了:

1
sudo apt install ros-noetic-desktop

此时ROS的安装基本完成,请不要着急直接输入roscore等相关的命令,它们都需要在环境变量的初始化后才能够使用,因此请使用如下命令初始化ROS环境:

1
source /opt/ros/noetic/setup.bash

这里也可以直接将该环境变量写入.bashrc中,保证每次打开的终端中都能够运行ros相关的命令。然后,完成一系列必要的依赖项安装:

1
2
sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
sudo apt install python3-rosdep

这里安装的的rosdep实际上起到了包管理的作用,因此它的镜像源也是不可以少的,实际中参考清华大学开源镜像站的帮助说明,可使用以下步骤代替官方给出的两步步骤:

1
2
3
4
5
6
7
8
9
10
# 手动模拟 rosdep init
sudo mkdir -p /etc/ros/rosdep/sources.list.d/
sudo curl -o /etc/ros/rosdep/sources.list.d/20-default.list https://mirrors.tuna.tsinghua.edu.cn/github-raw/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
# 为 rosdep update 换源
export ROSDISTRO_INDEX_URL=https://mirrors.tuna.tsinghua.edu.cn/rosdistro/index-v4.yaml
rosdep update

# 每次 rosdep update 之前,均需要增加该环境变量
# 为了持久化该设定,可以将其写入 .bashrc 中,例如
echo 'export ROSDISTRO_INDEX_URL=https://mirrors.tuna.tsinghua.edu.cn/rosdistro/index-v4.yaml' >> ~/.bashrc

由此完成的全部的ROS安装。

使用手记

使用ROS系统,首先应当建立工作目录,然后使用命令catkin_make在该目录下建立工程,程序将自动在目录下生成devel文件夹,内有一个setup.bash文件,使用source devel/setup.bash命令即可激活ROS环境,在当前环境变量激活的情况下,以ros开头的一系列命令才可以使用。

其中的catkin_make命令用于编译CMakeLists文件,生成激活当前工程目录环境变量的setup.bash。创建工程文件时,应当将使用到的依赖项列在命令后,以便于直接生成.xml文件。

当需要生成工程项目包时,应当使用系统级别的环境变量,即/opt/ros/noetic/setup.bash,这样可以保证在任何地方都可以使用ros命令。

ROS Node

节点给我的第一感觉是,它是可以跨命令行间通信的,应该是系统级别的通信图。一共有三个重要的命令行工具,分别是roscorerosrunrosnode,分别用于生成一个主机节点(用于管理标准出入流、从机节点以及一些属性信息等 )、运行一个节点(可以从一个项目 包里面运行)以及获取当前节点的信息。

与节点相对应的另一个顶级的概念是会话Topic,它用于在有多节点通信的图中实现信息的交流与传递。会话的查看可以使用rqt_graph,亦可使用命令行指令rostopic echo /topic_name/path查看当前会话某条信息通路的信息。

会话命令除了单纯地查看信息作监督以外,还可以强制向会话中的节点施加影响,例如使用rostopic pub命令。rostopic本质上提供了一系列的API,以便于仿真平台访问其数据,亦可简单地提供一些图形化的界面以便于在线调试。

rostopic是个非常厉害的命令,一定要好好掌握

常见的rostopic就是echolist,能够查看当前全部会话节点以及每一个节点发布的信息,能够直接判断某个节点是否正常工作,例如,在前些日子我使用mavros自带的系列模块如/mavros/imu/mavros/local_position等查看功能时,均发现未有任何信息输出,报错:

1
2
WARNING: no messages received and simulated time is active.
Is /clock being published?

经封兄@Feng1909亲自帮忙排查问题后,发现实际问题是roslaunch发布的前后文件侦听端口问题,意即:

launch文件中存在迭代调用情况,迭代调用的launch文件与当前launch文件在同一个mavros的端口不相等。

由此最底层的launch文件发布信息至其对应端口后,后者再从另一个端口获取信息并重新发布,此时另一个端口并没有信息被发布,这就导致/mavros系列订阅结果为空。

ROS Service

正如文档里说的一样,服务也是另一种在命令行之间交互的方式,服务命令rosservice可允许图中的一个节点发出请求,而另一个节点对此作出应答,即实现request-response结构(本质上实现了lazy过程,在实际使用中可能增强了系统处理多个信息的能力,即节点不需要一直保持对其他节点的侦听,而只需要处理请求信息即可)。

在服务之上,更有一个监管的命令,rosparam,可以用于直接查看整个服务器(由roscore创建)的全部参数,并可读可写,可删可增,这个命令让我第一次感受到了为什么“ROS”能够被称为是一个操作系统,它本质上是沟通与机器人相关的各个传感器和控制器部件,由它们实现节点和主机的通信,ROS在其中充当与硬件直接交互的角色,并提供文件系统,因此具备了操作系统的几个特点,可以被称为是一个操作系统

这些命令,就与Linux系统里面最底层的cd、ls一样,是最基础的东西,是搭建后面一切工程项目 包的基础。在rqt的控制台里面介绍了最简单的监视器rqt_logger_levelrqt_console,共计有FatalErrorWarnInfoDebug五个级别,分别对应了五种不同的信息输出,这些级别的信息输出可以由节点对应的控制程序进行设置以便于调试。