王平莹 发表于 2025-12-8 00:50:05

ROS2概述和环境搭建

近期我们想实现一个功能,利用机器人实现羽绒服分拣。我们计划的硬件:宇树G1(移动底盘+躯干) + 灵巧手(末端执行器) + 摄像头/深度传感器(视觉)和力量传感器(触觉)
那么问题就来了?这些组件来自不同的厂商,使用不同的通信协议(CAN总线、Ethernet、USB等),数据格式也千差万别。如何让它们“对话”?
而ROS2就可以解决我们的问题,ROS2提供了一个基于“话题”、“服务”、“动作”的标准化通信中间件;

[*]宇树G1的关节状态发布到一个/joint_states话题;
[*]摄像头图像发布到/camera/image_raw话题;
[*]分拣算法订阅这些话题获取信息,经过处理(比如识别羽绒服类型),然后通过/hand_control动作或服务向灵巧手发送抓取指令;
[*]所有模块都通过ROS2这个“总线”连接,无需关心彼此底层硬件细节。
一、ROS2概述

1.1 ROS2的历史

ROS:英文全称Robot Operating System(机器人操作系统),但ROS本身并不是一个操作系统,而是可以安装在现在已有的操作系统上(Linux、Windows、Mac)的软件库和工具集。
ROS出生于2007年,ROS的出现解决了机器人各个组件之间的通信问题,同时基于ROS完善的通信机制,越来越多的优秀的机器人算法集成到了ROS中来。
现在的ROS功能已经变得非常的丰富和强大。但随着对ROS功能上要求越来越多,一些原始的架构和设计不能够满足目前的使用需求,这也是ROS2出现的原因。
1.1.1 ROS的作用

做一个机器人需要涉及到多个部分,而且这些部分之间还要进行通信,如果想要整个机器人可以跑起来,那么必须要有一个东西将下面的几个部分合理的连接到一起,这个东西就是ROS;

[*]感知部分:激光雷达、深度相机、IMU、里程计、碰撞感知、建图;
[*]决策部分:路径规划(navigation)算法、定位算法;
[*]控制部分:轮子驱动。
1.1.2为什么需要 ROS2

2007年ROS开发人员设计和制作ROS时,当时只想着简化机器人的开发,并没有想到过今天那么多的功能需求,比如商业化要求的稳定性、生命周期管理、多机协同、数据加密等。
随着ROS被越来越多机器人使用,受限于当初设计的局限性,ROS的问题也逐渐暴露。为了能够真正设计一款适用于所有机器人的操作系统,ROS2在2017年底正式发布,历经多年迭代,终于在2022年5月底,迎来了ROS2第一个长期支持版——ROS2 Humble。
1.1.3 ROS2版本对照表

ROS2是在ROS的基础上设计开发的第二代机器人操作系统,可简化机器人开发任务,加速机器人落地的软件库和工具集;
DistributionRelease datePosterEOL dateSupport durationRolling Ridley
(rolling release with latest features)progressing since June 2020https://gitee.com/zyly2033/blog-pic/raw/master/202512071538841.pngN/AN/ALyrical LuthMay 2026N/AN/AN/AKilted Kaiju23 May 2025https://gitee.com/zyly2033/blog-pic/raw/master/202512071538465.pngNovember 20261.5 yearsJazzy Jalisco23 May 2024https://gitee.com/zyly2033/blog-pic/raw/master/202512071539074.pngMay 20295 yearsIron Irwini23 May 2023https://gitee.com/zyly2033/blog-pic/raw/master/202512071539705.pngNovember 20241.5 yearsHumble Hawksbill23 May 2022https://gitee.com/zyly2033/blog-pic/raw/master/202512071542704.pngMay 20275 yearsGalactic Geochelone23 May 2021https://gitee.com/zyly2033/blog-pic/raw/master/202512071542975.pngDecember 20221.5 yearsFoxy Fitzroy5 June 2020June 20233 yearsEloquent Elusor22 November 2019https://gitee.com/zyly2033/blog-pic/raw/master/202512071543565.pngNovember 20201 yearDashing Diademata31 May 2019https://gitee.com/zyly2033/blog-pic/raw/master/202512071543178.pngMay 20212 yearsCrystal Clemmys14 December 2018https://gitee.com/zyly2033/blog-pic/raw/master/202512071543619.pngDecember 20191 yearBouncy Bolson2 July 2018https://gitee.com/zyly2033/blog-pic/raw/master/202512071543969.pngJuly 20191 yearArdent Apalone8 December 2017https://gitee.com/zyly2033/blog-pic/raw/master/202512071543828.pngDecember 20181 yearbeta313 September 2017N/ADecember 20174 monthsbeta25 July 2017N/ASeptember 20172 monthsbeta119 December 2016N/AJuly 20177 months(ROS 2 real-time proposal)7 January 2016N/AN/AN/Aalpha1 (Anchor) - alpha8 (Hook-and-Loop)31 August 2015 - 5 October 2016N/ADecember 2016total: 16 months("Why ROS 2?")20 July 2015N/AN/AN/A(batch CI jobs for ROS 2 and http://design.ros2.org)referenced in Q&A 6 May 2015N/AN/AN/A(first commits to ROS 2 repository)February 2015N/AN/AN/AROSCon 2014:"Next-generation ROS: Building on DDS", "ROS 2.0: Developer preview"12 September 2014N/AN/AN/A1.2 ROS和ROS2对比

1.2.1 系统架构

https://gitee.com/zyly2033/blog-pic/raw/master/202512071457384.png在这张图中,左侧是ROS1,右侧是ROS2,大家注意看两者最明显的变化,那就是Master。

[*]在ROS1中,应用层里Master这个节点管理器的角色至关重要,所有节点都得听它指挥,类似是一个公司的CEO,有且只有一个,如果这个CEO突然消失,公司肯定会成一团乱麻。ROS2把这个最不稳定的角色请走了,节点可以通过另外一套discovery——自发现机制`,找到彼此,从而建立稳定的通信连接;
[*]中间层是ROS封装好的标准通信接口,我们写程序的时候,会频繁和这些通信接口打交道,比如发布一个图像的数据,接收一个雷达的信息,客户端库会再调用底层复杂的驱动和通信协议,让我们的开发变得更加简单明了;
[*]在ROS1中,ROS通信依赖底层的TCP和UDP协议,而在ROS2中,通信协议更换成了更加复杂但也更加完善的DDS系统;
[*]如果是在进程内需要进行大量数据的通信,ROS1和ROS2都提供了基于共享内存的通信方法,只不过名字不太一样而已;
[*]最下边是系统层,也就是可以将ROS安装在哪些操作系统上,ROS1主要安装在Linux上,ROS2的可选项就很多了,Linux、windows、MacOS、RTOS都可以;
通过这样对比的方式,我们了解了ROS2的整体架构,如果大家有接触过ROS1,这个框架应该并不难理解,如果大家是从ROS2开始学习,先大致有一个印象,通过后续的学习,就会有更加深入的理解。
1.2.2 DDS通信

https://gitee.com/zyly2033/blog-pic/raw/master/202512071500157.pngROS2相比ROS1最大的变化,除了省略了Master之外,应该就是通信系统的变化了。ROS1中基于TCP/UDP的通信系统,频繁诟病于延迟、丢数据、无法加密等问题,ROS2中的DDS在通信层面的功能就丰富多了。
DDS其实是物联网中广泛应用的一种通信协议,类似于我们常听说的5G通信一样,DDS是一个国际标准,能够实现该标准的软件系统并不是唯一的,所以我们可以选择多个厂家提供的DDS系统,比如这里的OpenSplice、FastRTPS,还有更多厂家提供的,每一家的性能不同,适用的场景也不同。
不过这就带来一个问题,每个DDS厂家的软件接口肯定是不一样的,如果我们按照某一家的接口写完了程序,想要切换其他厂家的DDS,不是要重新写代码么?这当然不符合ROS提高软件复用率的目标。
为了解决这个问题,ROS2设计了一个ROS Middleware,简称RMW,也就是指定一个标准的接口,比如如何发数据,如何收数据,数据的各种属性如何配置,都定义好了,如果厂家想要接入ROS社区,就得按照这个标准写一个适配的接口,把自家的DDS给移植过来,这样就把问题交给了最熟悉自家DDS的厂商。对于我们这些用户来讲,某一个DDS用的不爽,只要安装另一个,然后做一个简单的配置,程序一行的都不用改,轻松更换底层的通信系统。
举一个例子,比如我们在产品开发时,可以先用开源版本的DDS满足基本需求,部署交付的产品时,再更换为商业版本更稳定的DDS,这样可以减少开发成本。
https://gitee.com/zyly2033/blog-pic/raw/master/202512071504880.png总之,DDS的加入,让ROS2系统更加稳定,也更加灵活,当然复杂度也会高一些。这样,我们不用再纠结ROS的通信系统是否稳定、该如何优化等问题,更多精力都可以放在其他三个部分,专注优化我们的机器人应用功能。
二、ROS2安装方法

2.1 ubuntu 22.04环境搭建

这里我们安装ROS2使用的是ubuntu 22.04操作系统;

[*]如果有树莓派或者其它SOC的板子,可以直接使用嵌入式设备安装ubuntu 22.04;
[*]如果没有那就使用虚拟机安装ubuntu 22.04,具体参考《Ubuntu虚拟机安装》。
这里我们使用NanoPC-T6开发板,系统镜像使用rk3588-usb-ubuntu-jammy-desktop-6.1-arm64-20250811.zip,下载地址:https://download.friendlyelec.com/NanoPC-T6(位于01_系统固件03_USB线刷固件(USB-to-eMMC)目录)。
烧写固件到eMMC参考博客:《Rockchip RK3588 - NanoPC-T6开发板介绍》;
https://gitee.com/zyly2033/blog-pic/raw/master/202512071322836.png
稍等片刻即可完成烧写,完成后设备会自动重启, 并从eMMC启动你安装的系统。这里我的开发板会会自动进入ubuntu 22.04桌面系统。
2.1.1 ssh远程连接

由于我通过路由器网口与开发板连接的,因此我们可以查看路由器连接的设备信息,比如这里我使用的开发板ip地址问为192.168.2.102。
通过ssh远程连接工具连接我们的开发板,这里我使用的是MobaXterm,ubuntu系统默认账号密码如下:
普通用户:    用户名: pi    密码: piRoot用户:    默认没有设置root密码,可通过sudo passwd root命令配置root密码这里我们使用Mobaxterm工具以pi用户登录,通过sudo passwd root命令配置root密码:
pi@NanoPC-T6:~$ sudo passwd rootNew password:Retype new password:passwd: password updated successfully这里我将root密码设置为123456,我们可以使用su命令切换到root用户:
pi@NanoPC-T6:~$ su rootPassword:root@NanoPC-T6:/home/pi#2.1.2 查看操作系统

运行如下命令:
root@NanoPC-T6:/home/pi# cat /etc/os-releasePRETTY_NAME="Ubuntu 22.04.4 LTS"NAME="Ubuntu"VERSION_ID="22.04"VERSION="22.04.4 LTS (Jammy Jellyfish)"VERSION_CODENAME=jammyID=ubuntuID_LIKE=debianHOME_URL="https://www.ubuntu.com/"SUPPORT_URL="https://help.ubuntu.com/"BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"UBUNTU_CODENAME=jammy##### 安装`x11vnc`远程桌面x11vnc是一个VNC服务器,安装后我们可以不依赖外部的显示设备,,通过网络远程登debia桌面。
2.1.3 开启远程链接

ubuntu 22.04内置了远程连接功能,这里简单介绍一下,路径为:Settings --> Sharing --> Remote Desktop,打开后如下:
https://gitee.com/zyly2033/blog-pic/raw/master/202512071842340.png其中:

[*]开启Remote Desktop,可以使用windows的Remote Desktop Connection远程连接到ubuntu桌面了;
[*]开启Remote Control,可以使用远程连接软件进行操作控制;
[*]勾选Enable Legacy VNC Protocol,就可以使用VNC客户端进行远程桌面了;另外,VNC最好是我们选择使用密码连接,因为这样方便一些:
https://gitee.com/zyly2033/blog-pic/raw/master/202512071834704.png账号密码是可以自定义设置的 ,在此设置页面的Authentication一栏。
在windows电脑上打开远程桌面连接,输入开发板IP地址和连接账号,效果如下图所示;
https://gitee.com/zyly2033/blog-pic/raw/master/202512071841597.png2.2 ROS2系统安装

接下来,我们就可以把ROS2安装到ubuntu系统中了,安装步骤如下。
2.2.1 设置编码

首先刷新/更新本地的软件包索引缓存;
root@NanoPC-T6:/# sudo apt updateroot@NanoPC-T6:/# localeLANG=LANGUAGE=LC_CTYPE="POSIX"LC_NUMERIC="POSIX"LC_TIME="POSIX"LC_COLLATE="POSIX"LC_MONETARY="POSIX"LC_MESSAGES="POSIX"LC_PAPER="POSIX"LC_NAME="POSIX"LC_ADDRESS="POSIX"LC_TELEPHONE="POSIX"LC_MEASUREMENT="POSIX"LC_IDENTIFICATION="POSIX"LC_ALL=下载安装包,生成区域数据,并设置系统默认的区域环境变量;
root@NanoPC-T6:/# sudo apt install localesroot@NanoPC-T6:/# sudo locale-gen en_US en_US.UTF-8root@NanoPC-T6:/# sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 虽然我们设置了系统默认的区域环境变量,但是需要重新登陆才能生效,这里我们直接使能当前终端会话的临时配置;
root@NanoPC-T6:/# export LANG=en_US.UTF-8执行完上述步骤后,通过以下命令验证。首先查看当前激活的区域设置:
root@NanoPC-T6:/# localeLANG=en_US.UTF-8LANGUAGE=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=查看可用的区域设置:
root@NanoPC-T6:/# locale -aCC.utf8en_USen_US.iso88591en_US.utf8POSIX查看系统配置文件:
root@NanoPC-T6:/# cat /etc/default/locale#File generated by update-localeLANG=en_US.UTF-8LC_ALL=en_US.UTF-82.2.2 添加源

安装必要的工具:
root@NanoPC-T6:/# sudo apt install curl gnupg lsb-release 其中:gnupg用于管理加密密钥,验证软件包签名。
获取并保存ROS官方仓库的数字签名密钥;
root@NanoPC-T6:/# sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg 创建ROS2软件源配置文件;
root@NanoPC-T6:/# echo "deb https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null这里使用了中科大镜像源。
查看/etc/apt/sources.list.d/ros2.list文件;
root@NanoPC-T6:/# cat /etc/apt/sources.list.d/ros2.listdeb https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu jammy main这么做的目的是让系统知道从哪里获取ROS2软件包,软件包存放在 http://packages.ros.org/ros2/ubuntu。
刷新/更新本地的软件包索引缓存;
root@NanoPC-T6:/# sudo apt update2.2.3 安装ROS2

首先升级系统中所有已安装的软件包到最新版本;
root@NanoPC-T6:/# sudo apt upgrade接着安装ROS2 Humble的桌面完整版;
root@NanoPC-T6:/# sudo apt install ros-humble-desktop默认安装到/opt/ros/humble目录;
root@NanoPC-T6:/# ll /opt/ros/humbledrwxr-xr-x   2 root root4096 Dec7 09:25 bin/drwxr-xr-x   2 root root4096 Dec7 09:24 cmake/drwxr-xr-x 108 root root4096 Dec7 09:25 include/drwxr-xr-x77 root root 36864 Dec7 09:25 lib/drwxr-xr-x   3 root root4096 Dec7 09:24 local/-rw-r--r--   1 root root   373 May 212025 local_setup.bash-rw-r--r--   1 root root3902 Jul1 00:59 local_setup.sh-rw-r--r--   1 root root 15664 May 212025 _local_setup_util.py-rw-r--r--   1 root root   379 May 212025 local_setup.zshdrwxr-xr-x   3 root root4096 Dec7 09:25 opt/-rw-r--r--   1 root root   349 May 212025 setup.bash-rw-r--r--   1 root root4275 Jul1 00:59 setup.sh-rw-r--r--   1 root root   622 May 212025 setup.zshdrwxr-xr-x 283 root root 12288 Dec7 09:25 share/drwxr-xr-x   4 root root4096 Dec7 09:24 src/drwxr-xr-x   3 root root4096 Dec7 09:24 tools/桌面版是最常用的安装选项,包含:
组件包含内容用途ROS 核心ros_core、common_interfaces基础通信、消息接口GUI工具rqt、rviz2、rqt_graph可视化、调试工具开发工具ros2bag、ros2doctor数据记录、系统检查示例与教程demos、tutorials学习示例代码测试工具launch_testing、ros_testing测试框架m2.2.4 设置环境变量

在当前终端加入ROS2环境配置,可以立即使用ROS命令;
root@NanoPC-T6:/# source /opt/ros/humble/setup.bash如果要永久生效,我们需要执行:
root@NanoPC-T6:/# echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc即将ROS配置添加到.bashrc文件,每次打开新终端都会自动加载。
2.3 ROS2示例测试

为了验证ROS2安装成功,我们可以通过以下示例进行测试。
2.3.1 命令行示例

先来试试ROS2最为重要的底层通信系统DDS是否正常吧。启动第一个终端,通过以下命令启动一个数据的发布者节点:
root@NanoPC-T6:/# ros2 run demo_nodes_cpp talker : Publishing: 'Hello World: 1' : Publishing: 'Hello World: 2' : Publishing: 'Hello World: 3' : Publishing: 'Hello World: 4' : Publishing: 'Hello World: 5' : Publishing: 'Hello World: 6' : Publishing: 'Hello World: 7' : Publishing: 'Hello World: 8' : Publishing: 'Hello World: 9' : Publishing: 'Hello World: 10' : Publishing: 'Hello World: 11' : Publishing: 'Hello World: 12' : Publishing: 'Hello World: 13' : Publishing: 'Hello World: 14'...... : Publishing: 'Hello World: 34'启动第二个终端,通过以下命令启动一个数据的订阅者节点:
root@NanoPC-T6:/# ros2 run demo_nodes_py listener : I heard: : I heard: : I heard: : I heard: : I heard: : I heard: : I heard: : I heard: : I heard: : I heard: 如果Hello World字符串在两个终端中正常传输,说明通信系统没有问题。
2.3.2 小海龟仿真示例

再来试一试ROS中的经典示例——小海龟仿真器。
进入桌面系统,启动第一个终端,运行如下指令:
root@NanoPC-T6:/# ros2 run turtlesim turtlesim_node该指令将启动一个蓝色背景的海龟仿真器;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072113914.png启动第二个终端,运行如下指令:
root@NanoPC-T6:/# ros2 run turtlesim turtle_teleop_key该指令将启动一个键盘控制节点,在该终端中点击键盘上的“上下左右”按键,就可以控制小海龟运动啦。
https://gitee.com/zyly2033/blog-pic/raw/master/202512072116730.png关于小海龟中蕴藏的ROS奥义,我们在后续教程中将持续探索。至此,ROS2安装成功。
三、ROS2命令行操作

ROS2命令行的操作机制与Linux相同,不过所有操作都集成在一个ros2的总命令中,后边第一个参数表示不同的操作目的,比如node表示对节点的操作,topic表示对话题的操作,具体操作干什么,还可以在后边继续跟一系列参数内容。
root@NanoPC-T6:/# ros2 --helpusage: ros2 [-h] [--use-python-default-buffering] Call `ros2-h` for more detailed usage. ...ros2 is an extensible command-line tool for ROS 2.options:-h, --help            show this help message and exit--use-python-default-buffering                        Do not force line buffering in stdout and instead use the python default buffering, which might be affected                        by PYTHONUNBUFFERED/-u and depends on whatever stdout is interactive or notCommands:action   Various action related sub-commandsbag      Various rosbag related sub-commandscomponentVarious component related sub-commandsdaemon   Various daemon related sub-commandsdoctor   Check ROS setup and other potential issuesinterfaceShow information about ROS interfaceslaunch   Run a launch filelifecycleVarious lifecycle related sub-commandsmulticastVarious multicast related sub-commandsnode       Various node related sub-commandsparam      Various param related sub-commandspkg      Various package related sub-commandsrun      Run a package specific executablesecurity   Various security related sub-commandsservice    Various service related sub-commandstopic      Various topic related sub-commandswtf      Use `wtf` as alias to `doctor`Call `ros2-h` for more detailed usage.接下来我们就以小海龟仿真为例,一起感受下ROS2命令行的主要功能,也对ROS2中的核心概念有一个大致了解。
3.1 运行节点程序

想要运行ROS2中某个节点,我们可以使用ros2 run命令进行操作,例如我们要运行海龟仿真节点和键盘控制节点:
root@NanoPC-T6:/# ros2 run turtlesim turtlesim_noderoot@NanoPC-T6:/# ros2 run turtlesim turtle_teleop_key3.2 查看节点信息

当前运行的ROS系统中都有哪些节点呢?可以这样来查看:
root@NanoPC-T6:/# ros2 node list/teleop_turtle/turtlesim如果对某一个节点感兴趣,加上一个info子命令,就可以知道它的详细信息:
root@NanoPC-T6:/# ros2 node info /turtlesim/turtlesimSubscribers:    /parameter_events: rcl_interfaces/msg/ParameterEvent    /turtle1/cmd_vel: geometry_msgs/msg/TwistPublishers:    /parameter_events: rcl_interfaces/msg/ParameterEvent    /rosout: rcl_interfaces/msg/Log    /turtle1/color_sensor: turtlesim/msg/Color    /turtle1/pose: turtlesim/msg/PoseService Servers:    /clear: std_srvs/srv/Empty    /kill: turtlesim/srv/Kill    /reset: std_srvs/srv/Empty    /spawn: turtlesim/srv/Spawn    /turtle1/set_pen: turtlesim/srv/SetPen    /turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute    /turtle1/teleport_relative: turtlesim/srv/TeleportRelative    /turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters    /turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes    /turtlesim/get_parameters: rcl_interfaces/srv/GetParameters    /turtlesim/list_parameters: rcl_interfaces/srv/ListParameters    /turtlesim/set_parameters: rcl_interfaces/srv/SetParameters    /turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomicallyService Clients:Action Servers:    /turtle1/rotate_absolute: turtlesim/action/RotateAbsoluteAction Clients:其中:

[*]Subscribers:订阅器,节点接收的消息;

[*]/parameter_events:参数变更事件
[*]/turtle1/cmd_vel:控制小海龟运动的速度命令;

[*]Publishers:发布器,节点发送的消息;

[*]/parameter_events:参数变更信息;
[*]/turtle1/pose:小海龟的位置和姿态(x,y, 角度等);
[*]/turtle1/color_sensor:小海龟下方的颜色;
[*]/rosout:日志信息;

[*] Service Servers: 服务,节点提供的服务(可调用的函数):

[*]/spawn:生成新小海龟;
[*]/kill:删除小海龟;
[*]/reset:重置模拟;
[*]/turtle1/teleport_absolute:传送小海龟到指定位置;
[*]/set_pen:设置画笔颜色;

[*]Action Servers:动作服务器,长时间运行的任务;

[*]/turtle1/rotate_absolute:旋转小海龟到指定角度(带反馈)。

3.3 查看话题信息

话题相关命令:
root@NanoPC-T6:/# ros2 topicusage: ros2 topic [-h] [--include-hidden-topics] Call `ros2 topic-h` for more detailed usage. ...Various topic related sub-commandsoptions:-h, --help            show this help message and exit--include-hidden-topics                        Consider hidden topics as wellCommands:bw   Display bandwidth used by topicdelayDisplay delay of topic from timestamp in headerecho   Output messages from a topicfind   Output a list of available topics of a given typehz   Print the average receiving rate to screeninfo   Print information about a topiclist   Output a list of available topicspub    Publish a message to a topictype   Print a topic's typeCall `ros2 topic-h` for more detailed usage.3.3.1 话题列表

查看话题列表:
root@NanoPC-T6:/# ros2 topic list/parameter_events/rosout/turtle1/cmd_vel/turtle1/color_sensor/turtle1/pose3.3.2 话题信息

查看话题信息:
root@NanoPC-T6:/#ros2 topic info /turtle1/poseType: turtlesim/msg/PosePublisher count: 1Subscription count: 0可以看到存在一个发布者,但是并没有订阅者。查看所有发布此话题的节点:
root@NanoPC-T6:/# ros2 topic info -v /turtle1/poseType: turtlesim/msg/PosePublisher count: 1Node name: turtlesimNode namespace: /Topic type: turtlesim/msg/PoseEndpoint type: PUBLISHERGID: 01.0f.0b.0b.37.bd.b5.9e.00.00.00.00.00.00.1c.03.00.00.00.00.00.00.00.00QoS profile:Reliability: RELIABLEHistory (Depth): UNKNOWNDurability: VOLATILELifespan: InfiniteDeadline: InfiniteLiveliness: AUTOMATICLiveliness lease duration: InfiniteSubscription count: 0可以看到发布该话题的节点只有一个,名称为turtlesim。接着查看话题数据类型;
root@NanoPC-T6:/# ros2 interface show turtlesim/msg/Posefloat32 xfloat32 yfloat32 thetafloat32 linear_velocityfloat32 angular_velocity3.3.3 话题消息

还想看到某一个话题中的消息数据,加上echo子命令试一试:
root@NanoPC-T6:/# ros2 topic echo /turtle1/posex: 5.1743059158325195y: 8.063407897949219theta: -1.5647412538528442linear_velocity: 0.0angular_velocity: 0.0---x: 5.1743059158325195y: 8.063407897949219theta: -1.5647412538528442linear_velocity: 0.0angular_velocity: 0.0---x: 5.1743059158325195y: 8.063407897949219theta: -1.5647412538528442linear_velocity: 0.0angular_velocity: 0.0---.....可以看到小海龟实时的位置变化;

[*]x:小海龟的X坐标;
[*]y:小海龟的Y坐标;
[*]theta: 小海龟的角度(弧度);
[*]linear_velocity:线速度;
[*]angular_velocity:角速度。
3.3.4 发布话题消息

想要控制海龟动起来,我们还可以直接通过命令行发布话题指令:
root@NanoPC-T6:/# ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"该命令以每秒1次的频率发布速度命令:

[*]线速度:2.0(前进);
[*]角速度:1.8(逆时针旋转);
可以通过可视化界面看到小海龟在不停地绘制圆形;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072144715.png
3.4 发送服务请求

服务相关命令:
root@NanoPC-T6:/# ros2 serviceusage: ros2 service [-h] [--include-hidden-services] Call `ros2 service-h` for more detailed usage. ...Various service related sub-commandsoptions:-h, --help            show this help message and exit--include-hidden-services                        Consider hidden services as wellCommands:callCall a servicefindOutput a list of available services of a given typelistOutput a list of available servicestypeOutput a service's typeCall `ros2 service-h` for more detailed usage.3.4.1 查看服务列表

root@NanoPC-T6:/# ros2 service list/clear/kill/reset/spawn/teleop_turtle/describe_parameters/teleop_turtle/get_parameter_types/teleop_turtle/get_parameters/teleop_turtle/list_parameters/teleop_turtle/set_parameters/teleop_turtle/set_parameters_atomically/turtle1/set_pen/turtle1/teleport_absolute/turtle1/teleport_relative/turtlesim/describe_parameters/turtlesim/get_parameter_types/turtlesim/get_parameters/turtlesim/list_parameters/turtlesim/set_parameters/turtlesim/set_parameters_atomically3.4.2 生成新的小海龟

一只海龟太孤单,仿真器还提供改了一个服务——产生海龟,我们试一试服务调用,再来一只名称为turtle2的海龟:
root@NanoPC-T6:/ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: 'turtle2'}"waiting for service to become available...requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='turtle2')response:turtlesim.srv.Spawn_Response(name='turtle2')通过可视化界面可以看到两只海龟;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072148405.png3.4.3 删除小海龟

根据名称删除小海龟:
root@NanoPC-T6:/# ros2 service call /kill turtlesim/srv/Kill "{name: 'turtle2'}"waiting for service to become available...requester: making request: turtlesim.srv.Kill_Request(name='turtle2')response:turtlesim.srv.Kill_Response()3.5 发送动作目标

动作相关命令:
root@NanoPC-T6:/# ros2 actionusage: ros2 action [-h] Call `ros2 action-h` for more detailed usage. ...Various action related sub-commandsoptions:-h, --help            show this help message and exitCommands:info       Print information about an actionlist       Output a list of action namessend_goalSend an action goalCall `ros2 action-h` for more detailed usage.3.5.1 查看动作列表

root@NanoPC-T6:/# ros2 action list/turtle1/rotate_absolute可以看到只有一个动作/turtle1/rotate_absolute。
3.5.2 查看动作信息

root@NanoPC-T6:/# ros2 action info /turtle1/rotate_absoluteAction: /turtle1/rotate_absoluteAction clients: 1    /teleop_turtleAction servers: 1    /turtlesim其中:

[*]动作名称:/turtle1/rotate_absolute;
[*]动作客户端:1个 (/teleop_turtle);
[*]动作服务器:1个 (/turtlesim)。
3.5.3 查看动作接口定义

root@NanoPC-T6:/# ros2 interface show turtlesim/action/RotateAbsolute# The desired heading in radiansfloat32 theta---# The angular displacement in radians to the starting positionfloat32 delta---# The remaining rotation in radiansfloat32 remaining动作由三部分组成:

[*]目标:客户端发送给服务器的目标值,小海龟应该旋转到的目标角度(弧度);
[*]结果:动作完成后服务器返回的最终结果,实际旋转的角度变化量(弧度);
[*]反馈:动作执行过程中服务器发送的进度反馈,距离目标还有多少角度剩余(弧度)。
3.5.4 发送动作目标

想要让海龟完成一个具体动作,比如转到指定角度,仿真器中提供的这个action可以帮上忙,通过命令行这样发送动作目标:
root@NanoPC-T6:/# ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "theta: 3" --feedbackWaiting for an action server to become available...Sending goal:   theta: 3.0Goal accepted with ID: 4755f5e4fdb0477f991322bf77c8326bFeedback:    remaining: -0.13042330741882324Feedback:    remaining: -0.11442327499389648Feedback:    remaining: -0.09842324256896973Feedback:    remaining: -0.08242321014404297Feedback:    remaining: -0.06642317771911621Feedback:    remaining: -0.05042314529418945Feedback:    remaining: -0.034423112869262695Feedback:    remaining: -0.01842331886291504Result:    delta: 0.1120000034570694Goal finished with status: SUCCEEDED3.6 录制控制命令

系统运行中的数据有很多,如果想要把某段数据录制下来,回到实验室再复现这段数据如何?
可以使用数据录制和回放工具命令,ROS2中的ros bag功能还是很好用的;
root@NanoPC-T6:/# ros2 bagusage: ros2 bag [-h] Call `ros2 bag-h` for more detailed usage. ...Various rosbag related sub-commandsoptions:-h, --help            show this help message and exitCommands:convertGiven an input bag, write out a new bag with different settingsinfo   Print information about a bag to the screenlist   Print information about available plugins to the screenplay   Play back ROS data from a bagrecord   Record ROS data to a bagreindexReconstruct metadata file for a bagCall `ros2 bag-h` for more detailed usage.3.6.1 录制话题

实现指定话题的录制:
root@NanoPC-T6:/# ros2 bag record -o turtle_movement /turtle1/cmd_vel : Press SPACE for pausing/resuming : Opened database 'turtle_movement/turtle_movement_0.db3' for READ_WRITE. : Listening for topics... : Event publisher thread: Starting : Subscribed to topic '/turtle1/cmd_vel' : Recording... : All requested topics are subscribed. Stopping discovery... : Writing remaining messages from cache to the bag. It may take a while : Event publisher thread: Exiting : Recording stopped注意:在录制期间我们需要运行ros2 run turtlesim turtle_teleop_key控制小海龟运动起来。
这里我们录制了/turtle1/cmd_vel话题,该话题用于控制小海龟运动的速度命令。
3.6.2 查看录制信息

查看录制文件信息:
root@NanoPC-T6:/# ros2 bag info turtle_movementFiles:             turtle_movement_0.db3Bag size:          33.0 KiBStorage id:      sqlite3Duration:          7.387324657sStart:             Dec7 2025 14:21:59.953739314 (1765117319.953739314)End:               Dec7 2025 14:22:07.341063971 (1765117327.341063971)Messages:          112Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 112 | Serialization Format: cdr3.6.3 回放运动

接着我们进行录制的回放:
root@NanoPC-T6:/# ros2 bag play turtle_movement : Opened database 'turtle_movement/turtle_movement_0.db3' for READ_ONLY. : Set rate to 1 : Adding keyboard callbacks. : Press SPACE for Pause/Resume : Press CURSOR_RIGHT for Play Next Message : Press CURSOR_UP for Increase Rate 10% : Press CURSOR_DOWN for Decrease Rate 10% : Opened database 'turtle_movement/turtle_movement_0.db3' for READ_ONLY.以上就是ROS2中我们常用的命令啦,每一个命令的子命令还有很多,大家可以自己尝试看看。
四、ROS2开发环境配置

ROS机器人开发肯定离不开代码编写,我们课程中会给大家提供大量示例源码,这些代码如何查看、编写、编译呢?
我们需要先做一些准备,完成开发环境的配置,给大家推荐两款重要的开发工具——VS Code和git。
4.1 git

4.1.1 安装git

root@NanoPC-T6:/# sudo apt install git4.1.2 下载教程源码

首先创建工作目录:
root@NanoPC-T6:/# mkdir -p /opt/ros2root@NanoPC-T6:/# cd /opt/ros2《ROS2入门21讲》课程源码的下载方式:
root@NanoPC-T6:/opt/ros2# git clone https://gitee.com/guyuehome/ros2_21_tutorials.git下载好的课程代码是这样的,里边有很多文件夹,文件夹中还会有更多文件夹和代码文件;
root@NanoPC-T6:/opt/ros2# ll ros2_21_tutorials/drwxr-xr-x3 root root 4096 Dec7 14:37 docs/drwxr-xr-x8 root root 4096 Dec7 14:37 .git/-rw-r--r--1 root root 1255 Dec7 14:37 Humble与Foxy版本兼容性说明.md-rwxr-xr-x1 root root 4912 Dec7 14:37 install.sh*drwxr-xr-x5 root root 4096 Dec7 14:37 learning_action/drwxr-xr-x3 root root 4096 Dec7 14:37 learning_action_cpp/drwxr-xr-x6 root root 4096 Dec7 14:37 learning_cv/drwxr-xr-x9 root root 4096 Dec7 14:37 learning_gazebo/drwxr-xr-x9 root root 4096 Dec7 14:37 learning_gazebo_harmonic/drwxr-xr-x5 root root 4096 Dec7 14:37 learning_interface/drwxr-xr-x7 root root 4096 Dec7 14:37 learning_launch/drwxr-xr-x5 root root 4096 Dec7 14:37 learning_node/drwxr-xr-x3 root root 4096 Dec7 14:37 learning_node_cpp/drwxr-xr-x5 root root 4096 Dec7 14:37 learning_parameter/drwxr-xr-x3 root root 4096 Dec7 14:37 learning_parameter_cpp/drwxr-xr-x2 root root 4096 Dec7 14:37 learning_pkg_c/drwxr-xr-x5 root root 4096 Dec7 14:37 learning_pkg_python/drwxr-xr-x4 root root 4096 Dec7 14:37 learning_qos/drwxr-xr-x5 root root 4096 Dec7 14:37 learning_service/drwxr-xr-x3 root root 4096 Dec7 14:37 learning_service_cpp/drwxr-xr-x6 root root 4096 Dec7 14:37 learning_tf/drwxr-xr-x4 root root 4096 Dec7 14:37 learning_tf_cpp/drwxr-xr-x5 root root 4096 Dec7 14:37 learning_topic/drwxr-xr-x3 root root 4096 Dec7 14:37 learning_topic_cpp/drwxr-xr-x8 root root 4096 Dec7 14:37 learning_urdf/drwxr-xr-x2 root root 4096 Dec7 14:37 python/-rw-r--r--1 root root527 Dec7 14:37 README.md如果用系统自带的文件浏览器和记事本查看,就略显复杂,这里推荐另外一个集成开发环境——VS Code。
4.2 VS Code

Visual Studio code,简称VS Code,是微软在2015年推出的一个轻量但功能强大的源代码编辑器,支持 windows、Linux和 mac os操作系统,扩展组件非常丰富,可以快速搭建成为项目开发的神兵利器。
我们从官方网站(https://code.visualstudio.com/Download)下载deb安装包,注意这里我下载的是ARM64架构;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072249157.png
运行如下命令安装:
root@NanoPC-T6:/home/pi/Downloads# sudo dpkg -i code_1.106.3-1764110883_arm64.deb安装完成后我们可以通过左下角的菜单找到Visual Studio code,双击打开;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072253783.png为了便于后续ROS2的开发与调试,我们安装一系列插件,无限扩展VS Code的功能。
4.2.1 中文语言包

如果想将VS Code翻译成中文,那么就安装这个插件;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072257396.png
4.2.2 Markdown All in One

为VS Code提供增强的Markdown支持(快捷键、目录、预览等);
https://gitee.com/zyly2033/blog-pic/raw/master/202512072308275.png
4.2.3 python插件

让VS Code支持python开发,提供智能编辑和调试功能;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072258744.png
4.2.4 C++插件

让VS Code支持C/C++开发,提供智能编辑和调试功能;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072259951.png
4.2.5 CMake和CMake Tools插件

支持CMake语法,完整的构建、调试、项目管理;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072300539.png
4.2.6 vscode-icons

给VS Code的文件和文件夹添加图标,让项目结构一目了然;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072301342.png
4.2.7Robotics Developer Environment插件

这是一个VS Code机器人开发扩展包,专门为ROS2开发设计的一整套工具;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072321208.png
4.2.8 Msg Language Support

为ROS的.action、.msg、.srv文件提供语法高亮和基础支持;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072302865.png
4.2.9 GitHub Copilot

安装AI编程助手;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072306119.png
4.2.10 URDF

为VS Code添加.urdf和.xacro文件的基本支持;
https://gitee.com/zyly2033/blog-pic/raw/master/202512072307674.png
参考文章
【古月居】古月·ROS2入门21讲
古月居ROS2入门教程学习笔记
神仙级ROS2入门教程(非常详细),从零基础入门到精通,从看这篇开始
Robot Operating System
ROS问答网站
ROS论坛
ROS功能包存储的数据库
ROS各种资源的一个索引网站

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

尹心菱 发表于 7 天前

很好很强大我过来先占个楼 待编辑
页: [1]
查看完整版本: ROS2概述和环境搭建