近期我们想实现一个功能,利用机器人实现羽绒服分拣。我们计划的硬件:宇树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 2020N/AN/ALyrical LuthMay 2026N/AN/AN/AKilted Kaiju23 May 2025November 20261.5 yearsJazzy Jalisco23 May 2024May 20295 yearsIron Irwini23 May 2023November 20241.5 yearsHumble Hawksbill23 May 2022May 20275 yearsGalactic Geochelone23 May 2021December 20221.5 yearsFoxy Fitzroy5 June 2020June 20233 yearsEloquent Elusor22 November 2019November 20201 yearDashing Diademata31 May 2019May 20212 yearsCrystal Clemmys14 December 2018December 20191 yearBouncy Bolson2 July 2018July 20191 yearArdent Apalone8 December 2017December 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 系统架构
在这张图中,左侧是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通信
ROS2相比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,这样可以减少开发成本。
总之,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开发板介绍》;
稍等片刻即可完成烧写,完成后设备会自动重启, 并从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,打开后如下:
其中:
- 开启Remote Desktop,可以使用windows的Remote Desktop Connection远程连接到ubuntu桌面了;
- 开启Remote Control,可以使用远程连接软件进行操作控制;
- 勾选Enable Legacy VNC Protocol,就可以使用VNC客户端进行远程桌面了;另外,VNC最好是我们选择使用密码连接,因为这样方便一些:
账号密码是可以自定义设置的 ,在此设置页面的Authentication一栏。
在windows电脑上打开远程桌面连接,输入开发板IP地址和连接账号,效果如下图所示;
2.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-8
复制代码 2.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 [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] 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 [arch=arm64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu jammy main
复制代码 这么做的目的是让系统知道从哪里获取ROS2软件包,软件包存放在 http://packages.ros.org/ros2/ubuntu。
刷新/更新本地的软件包索引缓存;- root@NanoPC-T6:/# sudo apt update
复制代码 2.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 root 4096 Dec 7 09:25 bin/drwxr-xr-x 2 root root 4096 Dec 7 09:24 cmake/drwxr-xr-x 108 root root 4096 Dec 7 09:25 include/drwxr-xr-x 77 root root 36864 Dec 7 09:25 lib/drwxr-xr-x 3 root root 4096 Dec 7 09:24 local/-rw-r--r-- 1 root root 373 May 21 2025 local_setup.bash-rw-r--r-- 1 root root 3902 Jul 1 00:59 local_setup.sh-rw-r--r-- 1 root root 15664 May 21 2025 _local_setup_util.py-rw-r--r-- 1 root root 379 May 21 2025 local_setup.zshdrwxr-xr-x 3 root root 4096 Dec 7 09:25 opt/-rw-r--r-- 1 root root 349 May 21 2025 setup.bash-rw-r--r-- 1 root root 4275 Jul 1 00:59 setup.sh-rw-r--r-- 1 root root 622 May 21 2025 setup.zshdrwxr-xr-x 283 root root 12288 Dec 7 09:25 share/drwxr-xr-x 4 root root 4096 Dec 7 09:24 src/drwxr-xr-x 3 root root 4096 Dec 7 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[INFO] [1765099988.639758914] [talker]: Publishing: 'Hello World: 1'[INFO] [1765099989.639592339] [talker]: Publishing: 'Hello World: 2'[INFO] [1765099990.639552066] [talker]: Publishing: 'Hello World: 3'[INFO] [1765099991.639481059] [talker]: Publishing: 'Hello World: 4'[INFO] [1765099992.639438565] [talker]: Publishing: 'Hello World: 5'[INFO] [1765099993.639349797] [talker]: Publishing: 'Hello World: 6'[INFO] [1765099994.639361081] [talker]: Publishing: 'Hello World: 7'[INFO] [1765099995.639306466] [talker]: Publishing: 'Hello World: 8'[INFO] [1765099996.639262949] [talker]: Publishing: 'Hello World: 9'[INFO] [1765099997.639224113] [talker]: Publishing: 'Hello World: 10'[INFO] [1765099998.639152544] [talker]: Publishing: 'Hello World: 11'[INFO] [1765099999.639141444] [talker]: Publishing: 'Hello World: 12'[INFO] [1765100000.639086904] [talker]: Publishing: 'Hello World: 13'[INFO] [1765100001.639033336] [talker]: Publishing: 'Hello World: 14'......[INFO] [1765100021.638076944] [talker]: Publishing: 'Hello World: 34'
复制代码 启动第二个终端,通过以下命令启动一个数据的订阅者节点:- root@NanoPC-T6:/# ros2 run demo_nodes_py listener[INFO] [1765100012.671677724] [listener]: I heard: [Hello World: 25][INFO] [1765100013.642795834] [listener]: I heard: [Hello World: 26][INFO] [1765100014.642725664] [listener]: I heard: [Hello World: 27][INFO] [1765100015.641885253] [listener]: I heard: [Hello World: 28][INFO] [1765100016.642587618] [listener]: I heard: [Hello World: 29][INFO] [1765100017.642557448] [listener]: I heard: [Hello World: 30][INFO] [1765100018.642854527] [listener]: I heard: [Hello World: 31][INFO] [1765100019.642466610] [listener]: I heard: [Hello World: 32][INFO] [1765100020.642431608] [listener]: I heard: [Hello World: 33][INFO] [1765100021.642455534] [listener]: I heard: [Hello World: 34]
复制代码 如果Hello World字符串在两个终端中正常传输,说明通信系统没有问题。
2.3.2 小海龟仿真示例
再来试一试ROS中的经典示例——小海龟仿真器。
进入桌面系统,启动第一个终端,运行如下指令:- root@NanoPC-T6:/# ros2 run turtlesim turtlesim_node
复制代码 该指令将启动一个蓝色背景的海龟仿真器;
启动第二个终端,运行如下指令:- root@NanoPC-T6:/# ros2 run turtlesim turtle_teleop_key
复制代码 该指令将启动一个键盘控制节点,在该终端中点击键盘上的“上下左右”按键,就可以控制小海龟运动啦。
关于小海龟中蕴藏的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-commands bag Various rosbag related sub-commands component Various component related sub-commands daemon Various daemon related sub-commands doctor Check ROS setup and other potential issues interface Show information about ROS interfaces launch Run a launch file lifecycle Various lifecycle related sub-commands multicast Various multicast related sub-commands node Various node related sub-commands param Various param related sub-commands pkg Various package related sub-commands run Run a package specific executable security Various security related sub-commands service Various service related sub-commands topic Various topic related sub-commands wtf 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_key
复制代码 3.2 查看节点信息
当前运行的ROS系统中都有哪些节点呢?可以这样来查看:- root@NanoPC-T6:/# ros2 node list/teleop_turtle/turtlesim
复制代码 如果对某一个节点感兴趣,加上一个info子命令,就可以知道它的详细信息:- root@NanoPC-T6:/# ros2 node info /turtlesim/turtlesim Subscribers: /parameter_events: rcl_interfaces/msg/ParameterEvent /turtle1/cmd_vel: geometry_msgs/msg/Twist Publishers: /parameter_events: rcl_interfaces/msg/ParameterEvent /rosout: rcl_interfaces/msg/Log /turtle1/color_sensor: turtlesim/msg/Color /turtle1/pose: turtlesim/msg/Pose Service 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/SetParametersAtomically Service Clients: Action Servers: /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute Action 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 topic delay Display delay of topic from timestamp in header echo Output messages from a topic find Output a list of available topics of a given type hz Print the average receiving rate to screen info Print information about a topic list Output a list of available topics pub Publish a message to a topic type Print a topic's type Call `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/pose
复制代码 3.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: RELIABLE History (Depth): UNKNOWN Durability: VOLATILE Lifespan: Infinite Deadline: Infinite Liveliness: AUTOMATIC Liveliness lease duration: InfiniteSubscription count: 0
复制代码 可以看到发布该话题的节点只有一个,名称为turtlesim。接着查看话题数据类型;- root@NanoPC-T6:/# ros2 interface show turtlesim/msg/Posefloat32 xfloat32 yfloat32 thetafloat32 linear_velocityfloat32 angular_velocity
复制代码 3.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(逆时针旋转);
可以通过可视化界面看到小海龟在不停地绘制圆形;
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: call Call a service find Output a list of available services of a given type list Output a list of available services type Output a service's type Call `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_atomically
复制代码 3.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')
复制代码 通过可视化界面可以看到两只海龟;
3.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 action list Output a list of action names send_goal Send an action goal Call `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: SUCCEEDED
复制代码 3.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: convert Given an input bag, write out a new bag with different settings info Print information about a bag to the screen list Print information about available plugins to the screen play Play back ROS data from a bag record Record ROS data to a bag reindex Reconstruct metadata file for a bag Call `ros2 bag -h` for more detailed usage.
复制代码 3.6.1 录制话题
实现指定话题的录制:- root@NanoPC-T6:/# ros2 bag record -o turtle_movement /turtle1/cmd_vel[INFO] [1765117313.984092061] [rosbag2_recorder]: Press SPACE for pausing/resuming[INFO] [1765117313.986623324] [rosbag2_storage]: Opened database 'turtle_movement/turtle_movement_0.db3' for READ_WRITE.[INFO] [1765117313.988058552] [rosbag2_recorder]: Listening for topics...[INFO] [1765117313.988076051] [rosbag2_recorder]: Event publisher thread: Starting[INFO] [1765117313.990551900] [rosbag2_recorder]: Subscribed to topic '/turtle1/cmd_vel'[INFO] [1765117313.990713768] [rosbag2_recorder]: Recording...[INFO] [1765117313.991410237] [rosbag2_recorder]: All requested topics are subscribed. Stopping discovery...[INFO] [1765117328.404318762] [rosbag2_cpp]: Writing remaining messages from cache to the bag. It may take a while[INFO] [1765117328.405801822] [rosbag2_recorder]: Event publisher thread: Exiting[INFO] [1765117328.406032520] [rosbag2_recorder]: 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: Dec 7 2025 14:21:59.953739314 (1765117319.953739314)End: Dec 7 2025 14:22:07.341063971 (1765117327.341063971)Messages: 112Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 112 | Serialization Format: cdr
复制代码 3.6.3 回放运动
接着我们进行录制的回放:- root@NanoPC-T6:/# ros2 bag play turtle_movement[INFO] [1765117535.778685765] [rosbag2_storage]: Opened database 'turtle_movement/turtle_movement_0.db3' for READ_ONLY.[INFO] [1765117535.778798635] [rosbag2_player]: Set rate to 1[INFO] [1765117535.785041192] [rosbag2_player]: Adding keyboard callbacks.[INFO] [1765117535.785139479] [rosbag2_player]: Press SPACE for Pause/Resume[INFO] [1765117535.785159895] [rosbag2_player]: Press CURSOR_RIGHT for Play Next Message[INFO] [1765117535.785179144] [rosbag2_player]: Press CURSOR_UP for Increase Rate 10%[INFO] [1765117535.785197810] [rosbag2_player]: Press CURSOR_DOWN for Decrease Rate 10%[INFO] [1765117535.786004233] [rosbag2_storage]: 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 git
复制代码 4.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-x 3 root root 4096 Dec 7 14:37 docs/drwxr-xr-x 8 root root 4096 Dec 7 14:37 .git/-rw-r--r-- 1 root root 1255 Dec 7 14:37 Humble与Foxy版本兼容性说明.md-rwxr-xr-x 1 root root 4912 Dec 7 14:37 install.sh*drwxr-xr-x 5 root root 4096 Dec 7 14:37 learning_action/drwxr-xr-x 3 root root 4096 Dec 7 14:37 learning_action_cpp/drwxr-xr-x 6 root root 4096 Dec 7 14:37 learning_cv/drwxr-xr-x 9 root root 4096 Dec 7 14:37 learning_gazebo/drwxr-xr-x 9 root root 4096 Dec 7 14:37 learning_gazebo_harmonic/drwxr-xr-x 5 root root 4096 Dec 7 14:37 learning_interface/drwxr-xr-x 7 root root 4096 Dec 7 14:37 learning_launch/drwxr-xr-x 5 root root 4096 Dec 7 14:37 learning_node/drwxr-xr-x 3 root root 4096 Dec 7 14:37 learning_node_cpp/drwxr-xr-x 5 root root 4096 Dec 7 14:37 learning_parameter/drwxr-xr-x 3 root root 4096 Dec 7 14:37 learning_parameter_cpp/drwxr-xr-x 2 root root 4096 Dec 7 14:37 learning_pkg_c/drwxr-xr-x 5 root root 4096 Dec 7 14:37 learning_pkg_python/drwxr-xr-x 4 root root 4096 Dec 7 14:37 learning_qos/drwxr-xr-x 5 root root 4096 Dec 7 14:37 learning_service/drwxr-xr-x 3 root root 4096 Dec 7 14:37 learning_service_cpp/drwxr-xr-x 6 root root 4096 Dec 7 14:37 learning_tf/drwxr-xr-x 4 root root 4096 Dec 7 14:37 learning_tf_cpp/drwxr-xr-x 5 root root 4096 Dec 7 14:37 learning_topic/drwxr-xr-x 3 root root 4096 Dec 7 14:37 learning_topic_cpp/drwxr-xr-x 8 root root 4096 Dec 7 14:37 learning_urdf/drwxr-xr-x 2 root root 4096 Dec 7 14:37 python/-rw-r--r-- 1 root root 527 Dec 7 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架构;
运行如下命令安装:- root@NanoPC-T6:/home/pi/Downloads# sudo dpkg -i code_1.106.3-1764110883_arm64.deb
复制代码 安装完成后我们可以通过左下角的菜单找到Visual Studio code,双击打开;
为了便于后续ROS2的开发与调试,我们安装一系列插件,无限扩展VS Code的功能。
4.2.1 中文语言包
如果想将VS Code翻译成中文,那么就安装这个插件;
4.2.2 Markdown All in One
为VS Code提供增强的Markdown支持(快捷键、目录、预览等);
4.2.3 python插件
让VS Code支持python开发,提供智能编辑和调试功能;
4.2.4 C++插件
让VS Code支持C/C++开发,提供智能编辑和调试功能;
4.2.5 CMake和CMake Tools插件
支持CMake语法,完整的构建、调试、项目管理;
4.2.6 vscode-icons
给VS Code的文件和文件夹添加图标,让项目结构一目了然;
4.2.7 Robotics Developer Environment插件
这是一个VS Code机器人开发扩展包,专门为ROS2开发设计的一整套工具;
4.2.8 Msg Language Support
为ROS的.action、.msg、.srv文件提供语法高亮和基础支持;
4.2.9 GitHub Copilot
安装AI编程助手;
4.2.10 URDF
为VS Code添加.urdf和.xacro文件的基本支持;
参考文章
[1] 【古月居】古月·ROS2入门21讲
[2] 古月居ROS2入门教程学习笔记
[3] 神仙级ROS2入门教程(非常详细),从零基础入门到精通,从看这篇开始
[4] Robot Operating System
[5] ROS问答网站
[6] ROS论坛
[7] ROS功能包存储的数据库
[8] ROS各种资源的一个索引网站
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |