建议跳过 ROS,直接学习使用 ROS2;
介绍 ROS
ROS(Robot Operating System,机器人操作系统)是一系列程序库和工具的集合。它提供了硬件抽象、设备驱动、函数库、可视化工具、消息传递和软件包管理等诸多功能。
| 官网 | 中文文档 |
安装 ROS
选择一个 ROS 版本
选择 ROS 版本时,建议 Ubuntu 版本匹配,否则安装会困难很多;
我的运行环境是 WSL2 Ubuntu20.04,选择最新的 ROS Noetic Ninjemys;

在 Ubuntu 上安装 ROS Noetic
参考文章:http://wiki.ros.org/cn/noetic/Installation/Ubuntu
-
设置 sources.list
增加来自 packages.ros.org 的软件源:
1
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
若下载速度缓慢,清使用 Tsinghua University 软件源 :
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'
-
设置密钥
使用 ubuntu 密钥服务器:
1
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
如不成功,使用第三方密钥服务器:
1
sudo apt-key adv --keyserver 'hkp://pgp.mit.edu:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
-
开始安装 ROS
首先更新程序包索引:
1
sudo apt update接着选择一个版本的 ROS 进行安装:
虚拟机 Ubuntu、WSLg 可尝试 Desktop-Full;
WSL2(无 GUI)选择 ROS-Base;
-
完整桌面版(Desktop-Full,推荐):除了桌面版的全部组件外,还包括 2D/3D 模拟器(simulator)和 2D/3D 感知包(perception package);
1
sudo apt install ros-noetic-desktop-full
-
桌面版(Desktop):包括了 ROS-Base 的全部组件,还有一些工具,比如 rqt 和 rviz;
1
sudo apt install ros-noetic-desktop
-
ROS-Base(仅含骨架):ROS packaging,build,和 communication 库。没有图形界面(GUI)工具;
1
sudo apt install ros-noetic-ros-base
-
-
设置 ROS 运行环境
临时环境(新建终端都要手动执行命令设置 ROS 环境):
1 2 3 4 5
# bash 版本 source /opt/ros/noetic/setup.bash # zsh 版本 source /opt/ros/noetic/setup.zsh
永久环境,添加到 .zshrc(新建终端后自动执行设置 ROS 环境):
1 2
echo "source /opt/ros/noetic/setup.zsh" >> ~/.zshrc source ~/.zshrc
-
安装 rosinstall
rosinstall 是安装 ROS package 的命令行工具,它和 ROS 是分开发布的。
1
sudo apt-get install python3-rosinstall
初步体验 ROS
示例:小海龟仿真
该示例基于 ros-noetic-desktop-full 版本;
-
新建终端 1 执行 ros 核心服务
1
roscore

-
新建终端 2 执行 ros 应用
1
rosrun turtlesim turtlesim_node
执行后 WSLg 会弹出一个窗口显示一只小乌龟:

-
保持终端 2 运行的情况下,新建终端 3 执行 ros 应用
1
rosrun turtlesim turtle_teleop_key
执行后就可以使用电脑键盘方向键控制小乌龟了:
前进 后退 向左转 向右转 ↑ ↓ ← → 控制小乌龟动作后,路径也会显示在屏幕上:

第一个 ROS 程序
-
创建工作区
1 2 3 4 5 6
# 创建工作区 ros_work mkdir ros_work mkdir ros_work/src # 进入工作区的 src 目录 cd ros_work/src
-
创建 ROS 功能包
1
catkin_create_pkg hello_ros

-
在功能包 hello_ros 目录中新建 hello.cpp 文件,内容如下:
1 2 3 4 5 6 7 8 9
#include <ros/ros.h> int main(int argc, char **argv) { ros::init(argc,argv,"hello"); ros::NodeHandle n; ROS_INFO("Hello ROS!"); ros::spinOnce(); }
-
在功能包 hello_ros 目录中编辑 CMakeLists.txt 文件,内容如下:
为了容易理解使用非官方写法,官方使用 cmake 宏 catkin_package(…);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
cmake_minimum_required(VERSION 3.0.2) project(hello_ros) # 查找包 catkin find_package(catkin REQUIRED COMPONENTS roscpp) # 包含头目录 include_directories(include ${catkin_INCLUDE_DIRS}) # 生成可执行文件 add_executable(hello hello.cpp) target_link_libraries(hello ${catkin_LIBRARIES}) # 设置可执行文件生成目录为源码目录 set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
-
回到工作区 ros_work,执行以下命令编译:
1
catkin_make
执行后会生成:
- 目录 build:编译中间目录;
- 目录 devel:存放设置环境变量的脚本,让 ROS 能找到新创建的功能包和可执行文件;
devel/setup.zsh是 zsh 设置环境变量的脚本;devel/setup.bash是 bash 设置环境变量的脚本;
- 文件
src/hello_ros/hello:目标 elf 文件;

-
使用 rosrun 执行 hello 程序;
-
新建终端执行 ros 核心服务:
1
roscore
-
在工作区 ros_work 目录先设置新程序包环境变量,然后使用 rosrun 执行功能包中 hello 程序;
不同终端使用不同设置脚本,zsh 使用 setup.zsh,bash 使用 setup.bash;
1 2
source devel/setup.zsh rosrun hello_ros hello执行效果如下:

-