ROS2概述和环境搭建

news/2025/12/7 23:38:32/文章来源:https://www.cnblogs.com/zyly/p/19318463

近期我们想实现一个功能,利用机器人实现羽绒服分拣。我们计划的硬件:宇树G1(移动底盘+躯干) + 灵巧手(末端执行器) + 摄像头/深度传感器(视觉)和力量传感器(触觉)

那么问题就来了?这些组件来自不同的厂商,使用不同的通信协议(CAN总线、EthernetUSB等),数据格式也千差万别。如何让它们“对话”?

ROS2就可以解决我们的问题,ROS2提供了一个基于“话题”、“服务”、“动作”的标准化通信中间件;

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

一、ROS2概述

1.1 ROS2的历史

ROS:英文全称Robot Operating System(机器人操作系统),但ROS本身并不是一个操作系统,而是可以安装在现在已有的操作系统上(LinuxWindowsMac)的软件库和工具集。

ROS出生于2007年,ROS的出现解决了机器人各个组件之间的通信问题,同时基于ROS完善的通信机制,越来越多的优秀的机器人算法集成到了ROS中来。

现在的ROS功能已经变得非常的丰富和强大。但随着对ROS功能上要求越来越多,一些原始的架构和设计不能够满足目前的使用需求,这也是ROS2出现的原因。

1.1.1 ROS的作用

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

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

2007ROS开发人员设计和制作ROS时,当时只想着简化机器人的开发,并没有想到过今天那么多的功能需求,比如商业化要求的稳定性、生命周期管理、多机协同、数据加密等。

随着ROS被越来越多机器人使用,受限于当初设计的局限性,ROS的问题也逐渐暴露。为了能够真正设计一款适用于所有机器人的操作系统,ROS22017年底正式发布,历经多年迭代,终于在20225月底,迎来了ROS2第一个长期支持版——ROS2 Humble

1.1.3 ROS2版本对照表

ROS2是在ROS的基础上设计开发的第二代机器人操作系统,可简化机器人开发任务,加速机器人落地的软件库和工具集;

Distribution Release date Poster EOL date Support duration
Rolling Ridley
(rolling release with latest features)
progressing since June 2020 N/A N/A
Lyrical Luth May 2026 N/A N/A N/A
Kilted Kaiju 23 May 2025 November 2026 1.5 years
Jazzy Jalisco 23 May 2024 May 2029 5 years
Iron Irwini 23 May 2023 November 2024 1.5 years
Humble Hawksbill 23 May 2022 May 2027 5 years
Galactic Geochelone 23 May 2021 December 2022 1.5 years
Foxy Fitzroy 5 June 2020 June 2023 3 years
Eloquent Elusor 22 November 2019 November 2020 1 year
Dashing Diademata 31 May 2019 May 2021 2 years
Crystal Clemmys 14 December 2018 December 2019 1 year
Bouncy Bolson 2 July 2018 July 2019 1 year
Ardent Apalone 8 December 2017 December 2018 1 year
beta3 13 September 2017 N/A December 2017 4 months
beta2 5 July 2017 N/A September 2017 2 months
beta1 19 December 2016 N/A July 2017 7 months
(ROS 2 real-time proposal) 7 January 2016 N/A N/A N/A
alpha1 (Anchor) - alpha8 (Hook-and-Loop) 31 August 2015 - 5 October 2016 N/A December 2016 total: 16 months
("Why ROS 2?") 20 July 2015 N/A N/A N/A
(batch CI jobs for ROS 2 and http://design.ros2.org) referenced in Q&A 6 May 2015 N/A N/A N/A
(first commits to ROS 2 repository) February 2015 N/A N/A N/A
ROSCon 2014:"Next-generation ROS: Building on DDS", "ROS 2.0: Developer preview" 12 September 2014 N/A N/A N/A

1.2 ROSROS2对比

1.2.1 系统架构

在这张图中,左侧是ROS1,右侧是ROS2,大家注意看两者最明显的变化,那就是Master

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

通过这样对比的方式,我们了解了ROS2的整体架构,如果大家有接触过ROS1,这个框架应该并不难理解,如果大家是从ROS2开始学习,先大致有一个印象,通过后续的学习,就会有更加深入的理解。

1.2.2 DDS通信

ROS2相比ROS1最大的变化,除了省略了Master之外,应该就是通信系统的变化了。ROS1中基于TCP/UDP的通信系统,频繁诟病于延迟、丢数据、无法加密等问题,ROS2中的DDS在通信层面的功能就丰富多了。

DDS其实是物联网中广泛应用的一种通信协议,类似于我们常听说的5G通信一样,DDS是一个国际标准,能够实现该标准的软件系统并不是唯一的,所以我们可以选择多个厂家提供的DDS系统,比如这里的OpenSpliceFastRTPS,还有更多厂家提供的,每一家的性能不同,适用的场景也不同。

不过这就带来一个问题,每个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远程连接工具连接我们的开发板,这里我使用的是MobaXtermubuntu系统默认账号密码如下:

普通用户:用户名: pi密码: piRoot用户:默认没有设置root密码,可通过sudo passwd root命令配置root密码

这里我们使用Mobaxterm工具以pi用户登录,通过sudo passwd root命令配置root密码:

pi@NanoPC-T6:~$ sudo passwd root
New password:
Retype new password:
passwd: password updated successfully

这里我将root密码设置为123456,我们可以使用su命令切换到root用户:

pi@NanoPC-T6:~$ su root
Password:
root@NanoPC-T6:/home/pi#
2.1.2 查看操作系统

运行如下命令:

root@NanoPC-T6:/home/pi# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_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,可以使用windowsRemote 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 update
root@NanoPC-T6:/# locale
LANG=
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 locales
root@NanoPC-T6:/# sudo locale-gen en_US en_US.UTF-8
root@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:/# locale
LANG=en_US.UTF-8
LANGUAGE=
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 -a
C
C.utf8
en_US
en_US.iso88591
en_US.utf8
POSIX

查看系统配置文件:

root@NanoPC-T6:/# cat /etc/default/locale
#  File generated by update-locale
LANG=en_US.UTF-8
LC_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.list
deb [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/humble
drwxr-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.zsh
drwxr-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.zsh
drwxr-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_corecommon_interfaces 基础通信、消息接口
GUI工具 rqtrviz2rqt_graph 可视化、调试工具
开发工具 ros2bagros2doctor 数据记录、系统检查
示例与教程 demostutorials 学习示例代码
测试工具 launch_testingros_testing 测试框架m
2.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 --help
usage: ros2 [-h] [--use-python-default-buffering] Call `ros2 <command> -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-bufferingDo not force line buffering in stdout and instead use the python default buffering, which might be affectedby PYTHONUNBUFFERED/-u and depends on whatever stdout is interactive or notCommands:action     Various action related sub-commandsbag        Various rosbag related sub-commandscomponent  Various component related sub-commandsdaemon     Various daemon related sub-commandsdoctor     Check ROS setup and other potential issuesinterface  Show information about ROS interfaceslaunch     Run a launch filelifecycle  Various lifecycle related sub-commandsmulticast  Various 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 <command> -h` for more detailed usage.

接下来我们就以小海龟仿真为例,一起感受下ROS2命令行的主要功能,也对ROS2中的核心概念有一个大致了解。

3.1 运行节点程序

想要运行ROS2中某个节点,我们可以使用ros2 run命令进行操作,例如我们要运行海龟仿真节点和键盘控制节点:

root@NanoPC-T6:/# ros2 run turtlesim turtlesim_node
root@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
/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 topic
usage: ros2 topic [-h] [--include-hidden-topics] Call `ros2 topic <command> -h` for more detailed usage. ...Various topic related sub-commandsoptions:-h, --help            show this help message and exit--include-hidden-topicsConsider hidden topics as wellCommands:bw     Display bandwidth used by topicdelay  Display 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 <command> -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/pose
Type: turtlesim/msg/Pose
Publisher count: 1
Subscription count: 0

可以看到存在一个发布者,但是并没有订阅者。查看所有发布此话题的节点:

root@NanoPC-T6:/# ros2 topic info -v /turtle1/pose
Type: turtlesim/msg/PosePublisher count: 1Node name: turtlesim
Node namespace: /
Topic type: turtlesim/msg/Pose
Endpoint type: PUBLISHER
GID: 01.0f.0b.0b.37.bd.b5.9e.00.00.00.00.00.00.1c.03.00.00.00.00.00.00.00.00
QoS profile:Reliability: RELIABLEHistory (Depth): UNKNOWNDurability: VOLATILELifespan: InfiniteDeadline: InfiniteLiveliness: AUTOMATICLiveliness lease duration: InfiniteSubscription count: 0

可以看到发布该话题的节点只有一个,名称为turtlesim。接着查看话题数据类型;

root@NanoPC-T6:/# ros2 interface show turtlesim/msg/Pose
float32 x
float32 y
float32 thetafloat32 linear_velocity
float32 angular_velocity
3.3.3 话题消息

还想看到某一个话题中的消息数据,加上echo子命令试一试:

root@NanoPC-T6:/# ros2 topic echo /turtle1/pose
x: 5.1743059158325195
y: 8.063407897949219
theta: -1.5647412538528442
linear_velocity: 0.0
angular_velocity: 0.0
---
x: 5.1743059158325195
y: 8.063407897949219
theta: -1.5647412538528442
linear_velocity: 0.0
angular_velocity: 0.0
---
x: 5.1743059158325195
y: 8.063407897949219
theta: -1.5647412538528442
linear_velocity: 0.0
angular_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 service
usage: ros2 service [-h] [--include-hidden-services] Call `ros2 service <command> -h` for more detailed usage. ...Various service related sub-commandsoptions:-h, --help            show this help message and exit--include-hidden-servicesConsider hidden services as wellCommands:call  Call a servicefind  Output a list of available services of a given typelist  Output a list of available servicestype  Output a service's typeCall `ros2 service <command> -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 action
usage: ros2 action [-h] Call `ros2 action <command> -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_goal  Send an action goalCall `ros2 action <command> -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_absolute
Action: /turtle1/rotate_absolute
Action clients: 1/teleop_turtle
Action 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 radians
float32 theta
---
# The angular displacement in radians to the starting position
float32 delta
---
# The remaining rotation in radians
float32 remaining

动作由三部分组成:

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

想要让海龟完成一个具体动作,比如转到指定角度,仿真器中提供的这个action可以帮上忙,通过命令行这样发送动作目标:

root@NanoPC-T6:/# ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "theta: 3" --feedback
Waiting 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 bag
usage: ros2 bag [-h] Call `ros2 bag <command> -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 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 bagreindex  Reconstruct metadata file for a bagCall `ros2 bag <command> -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.db3
Bag size:          33.0 KiB
Storage id:        sqlite3
Duration:          7.387324657s
Start:             Dec  7 2025 14:21:59.953739314 (1765117319.953739314)
End:               Dec  7 2025 14:22:07.341063971 (1765117327.341063971)
Messages:          112
Topic 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 Codegit

4.1 git

4.1.1 安装git
root@NanoPC-T6:/# sudo apt install git
4.1.2 下载教程源码

首先创建工作目录:

root@NanoPC-T6:/# mkdir -p /opt/ros2
root@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年推出的一个轻量但功能强大的源代码编辑器,支持 windowsLinuxmac 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 CMakeCMake 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各种资源的一个索引网站

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/991907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

solid设计原则

一. solid原则 solid设计原则是面向对象的建议性原则,包括单一职责原则、开闭原则、里氏替换原则、接口隔离原则、依赖倒置原则。 二.单一职责原则 三.开闭原则 四.里氏替换原则 五.接口隔离原则 六.依赖倒置原则

SGLang 分布式集群模式概览 - -银光

SGLang 分布式集群模式概览本文已于2025.09.14 发表于知乎和公众号。计算加速是推理系统优化的终极目标,并行计算是实现该目标的核心手段,而分布式集群则是支撑并行计算落地的底层基础设施。本文概括性的介绍 SGLang…

20232426 2025-2026-1 《网络与系统攻防技术》实验八实验报告

20232426 2025-2026-1 《网络与系统攻防技术》实验八实验报告 Web安全 一、 实验内容Web前端HTML:能安装启停Apache,编写含表单的HTML网页。 Web前端JavaScript:能用JS验证表单并回显欢迎信息,测试XSS注入。 Web后…

2025.12.7总结

今天尝试用ai生成爬取京东评论的程序,但是怎么整也不行,这反扒机制太强了,然后参考舍友的一篇博客的代码。里面有一项新的技术DrissionPage,这种是完全模拟用户行为来获取想要的数据 优点是能完美解决反爬问题,因…

20251207 新同学培训有感

今年开始给新同学进行科研培训,也是一种全新的尝试。大家的周报里反映了下面问题,我也记录一下:网课看完了,实践因为谷歌登录问题和时间关系尚未上手,课中有些新概念比较难理解,有些还涉及到线代的内容,需要提前…

2025 最新锂电池服务商 / 厂家 TOP5 评测!技术创新 + 品质保障权威榜单发布,赋能新能源产业高质量发展

随着新能源产业的蓬勃发展,锂电池作为核心能源部件,其性能与品质直接关系到下游应用的安全与效能。本榜单基于技术研发实力、行业适配能力、服务效能表现三大维度,结合市场反馈与行业数据,权威解析2025年五大锂电池…

OI 带给了我什么

观前提醒:本文有一定的负面情绪,不建议在心情不好时阅读。认真阅读了抑郁症治疗指南和支离破碎发言(七)。 我学 OI 时给自己定了个要求:不要在博客里写消极的东西。因为我认为,文章发出来一定是要给人看的。如果…

2025最新锂电池组装服务商/厂家TOP5评测!技术沉淀+定制方案权威榜单发布,赋能新能源产业升级发展

随着新能源产业的蓬勃发展,锂电池组装作为核心环节,其技术实力与服务品质直接关系到下游应用的性能与安全。本榜单基于技术研发实力、定制化服务能力、生产规模与品控体系三大维度,结合行业权威数据与客户反馈,对2…

text-embedding-3是什么?大模型Embedding技术科普

text-embedding-3是什么?大模型Embedding技术科普Embedding(嵌入向量)是现代 NLP 和 AI 系统的基础能力之一,它将文本转换为一组可计算的高维向量,用于捕捉语义关系。 随着 GPT 系列模型的升级,OpenAI 发布了全新…

博客园去除评论下面的广告

当前博客园的博客页面 ,“提交评论”下面有广告,如下。在页面定制css中添加以下代码: /*屏蔽底层广告*/.under-post-card,#under_post_card1,#under_post_card2{display:none; !important}即可去掉广告。

2025最新宁德锂电池组装服务商/厂家TOP5评测!技术创新+定制方案权威榜单发布,赋能新能源动力生态升级

随着新能源产业的蓬勃发展,宁德锂电池组装作为核心环节,其技术实力与生产能力直接关系到终端产品的性能表现。本榜单基于技术研发、定制方案、生产规模、质量管控四大维度,结合行业案例数据与客户反馈,权威解析202…

HRSword_v5.0.1.1 sysdiag.sys

HRSword_v5.0.1.1 sysdiag.sys sysdiag.sys 通过rsa 验证验证用户层程序 __int64 __fastcall check_file_140031E40(_UNICODE_STRING *path,unsigned __int64 *fsize,_QWORD *a3,_DWORD *a4,void *p_index,__int64 sha…

12.5 MyBatis

MyBatis用于快速连接数据库。使得数据库的操作更加简便

新同学培训有感

今年开始给新同学进行科研培训,也是一种全新的尝试。大家的周报里反映了下面问题,我也记录一下:网课看完了,实践因为谷歌登录问题和时间关系尚未上手,课中有些新概念比较难理解,有些还涉及到线代的内容,需要提前…

NAS 部署 OmniBox:全聚合一站式观影解决方案,轻松打造家庭影院

🐳部署指南 🎯 方案一:Docker 单容器 docker run -d \--restart unless-stopped \--name omnibox \-p 7023:7023 \-v $PWD/data:/app/data \lampon/omnibox:latest​$PWD​​: 当前终端命令所在目录。例如:/opt…

2025最新储能电池组装厂家TOP5评测!技术创新+定制方案权威榜单发布,赋能新能源产业高质量发展

随着新能源产业的蓬勃发展,储能电池组装作为关键环节,其技术实力与产品质量直接影响着下游应用的效能与安全。本榜单基于技术研发实力、行业适配能力、服务效能表现三大核心维度,结合行业权威数据与客户反馈,对202…

DFAT—Dual Focus-Attention Transformer for Robust Point Cloud Registration

创新点 (1)提出新框架,采用双层焦点注意力特征交互机制提升性能 (2)提出双空间一致性匹配模块,充分利用几何一致性来提升supperPoint匹配的质量。 (3)引入线性注意力模块,用于优化点特征。 流程 首先使用局部…

20232419 2025-2026-1 《网络与系统攻防技术》实验八实验报告

1.实验内容 (1)Web前端HTML 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。 (2)Web前端javascipt 理解JavaScript的基本功能,理解DOM。 在(1)的基础上,编写JavaScript…

某中心语音AI前沿技术在SLT会议的研究突破

本文概述了某研究机构在IEEE口语语言技术研讨会上展示的多项语音AI研究成果,涵盖了模型量化、对比预测编码迁移学习、满足差分隐私的教师集成方法、跨语言注意力优化以及针对关键词唤醒和设备导向语音检测的改进技术。…

性能jmeter常用注意事项

性能jmeter常用注意事项jmeter容易混淆的概念: 线程组并不是并发数量:1.线程组不是并发数量,这个一定要知道,是代表用户数量。2.100个线程组,Ramp-up时间和性能结果没有关系,这个也要清楚100以内可以设置为1秒。…