8.ROS2笔记-话题

ROS2笔记-话题

学习资料参考ROS2入门教程.

背景

节点实现了机器人各种各样的功能,但这些功能并不是独立的,之间会有千丝万缕的联系,其中最重要的一种联系方式就是话题,它是节点间传递数据的桥梁。
ROS2将复杂系统分解为多个模块化节点。话题是ROS图的重要元素,充当节点交换消息的总线。
在这里插入图片描述

一个节点可以向任意数量的话题发布数据,同时订阅任意数量的话题。
在这里插入图片描述

启动话题

到目前为止,您应该可以轻松启动gurisim了。
打开新终端并运行:

ros2 run turtlesim turtlesim_node

打开另一个终端

ros2 run turtlesim turtle_teleop_key

rqt_graph

在本教程中,我们将使用rqt_graph可视化不断变化的节点和主题,以及它们之间的连接。
[guirsim教程](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html)告诉您如何安装rqt及其所有插件,包括rqt_graph。
打开一个新终端,启动rqt_graph

rqt_graph

在这里插入图片描述
您还可以打开rqt_graph,方法是打开rqt并选择Plugins>Introspection>Node graph。

您应该会看到上面的节点和主题,以及围绕图形外围的两个操作(我们暂时忽略这些操作)。如果将鼠标悬停在中心的主题上,您将看到如上图所示的颜色高亮显示。

该图描述了/turlsim节点和/teleop_turtle节点如何通过主题相互通信。/teleop_turtle节点将数据(您输入以移动龟的击键)发布到/curl1/cmd_vel主题,/curlsim节点订阅该主题以接收数据。

rqt_graph的突出显示功能在检查以多种不同方式连接的多个节点和主题的更复杂系统时非常有用。

rqt_graph是一个图形化的自省工具。现在我们来看一些用于内省主题的命令行工具。

ros2 topic list

在新终端中运行ros2主题列表命令将返回系统中当前活动的所有主题的列表:

$ ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

不清楚这些话题传输的是什么数据,没问题,这个命令试一下:
ros2 topic list -t

$ ros2 topic list -t
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]

这回我们不仅可以看到所有话题的列表,还可以清晰的看到每个话题传输的数据类型是什么。

ros2 topic echo

如果想看到节点之间的话题到底发了什么数据内容,可以这样:
ros2 topic echo <topic_name>
我们现在好奇键盘节点到底给小海龟发了什么,小海龟这么听话的动起来呢?
ros2 topic echo /turtle1/cmd_vel
输入之后可能暂时看不到任何内容,这是因为我们还没有发布数据,在运行键盘控制节点的终端中点击键盘,很快就可以看到数据啦:

$ ros2 topic echo /turtle1/cmd_vel 
linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
---
linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 2.0
---
linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
---

原来键盘控制节点将点击的键盘按键变成了线速度和角速度,通过话题发送给海龟仿真器,海龟才动起来的。

ros2 topic info

话题不必只是点对点的交流;它可以是一对多、多对一或多对多。
另一种方法是执行指令:

$ ros2 topic info /turtle1/cmd_vel

将会返回

$ ros2 topic info /turtle1/cmd_vel
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 1

ros2 interface show

节点使用消息通过主题发送数据。发布者和订阅者必须发送和接收相同类型的消息才能进行通信。

在运行ros2 topic list-t之后,我们前面看到的主题类型让我们知道每个主题上使用的消息类型。回想一下,cmd_vel主题的类型是:

geometry_msgs/msg/Twist

这意味着在geometry_msgs包中有一个名为Twist的消息。
现在,我们可以对该类型运行ros2接口show来了解其详细信息,特别是消息所需的数据结构。

ros2 interface show geometry_msgs/msg/Twist

指令返回以下输出

$ ros2 interface show geometry_msgs/msg/Twist
# This expresses velocity in free space broken into its linear and angular parts.

Vector3  linear
	float64 x
	float64 y
	float64 z
Vector3  angular
	float64 x
	float64 y
	float64 z

原来Twist中包含了两个三维向量,分别表示线速度和角速度。

ros2 topic pub

既然您有了消息结构,就可以使用以下命令从命令行直接将数据发布到主题:

ros2 topic pub <topic_name> <msg_type> '<args>'

“”参数是您将传递给主题的实际数据,位于您在上一节中刚刚发现的结构中。

需要注意的是,这个参数需要以YAML语法输入。像这样输入完整命令:

ros2 topic pub --once /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}}"

–once是一个可选参数,表示“发布一条消息然后退出”。
您将在终端中收到以下消息:

$ ros2 topic pub --once /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}}"
publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))

同时在仿真窗口看到乌龟进行了如下运动
在这里插入图片描述

海龟(通常是它要模仿的真实机器人)需要稳定的指令流才能连续操作。所以,要让乌龟继续移动,你可以跑:

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}}"

这里的区别是删除了–once选项,增加了–rate1选项,它告诉ros2主题pub以1Hz的稳定流发布命令。

$ 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}}"
publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))

publishing #2: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))

publishing #3: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))

在这里插入图片描述

您可以刷新rqt_graph,以图形方式查看发生了什么。您将看到ros 2主题pub…节点(/_ros2cli_30358)正在/curl1/cmd_vel主题上发布,现在ros2主题echo…节点(/_ros2cl_26646)和/curlsim节点都在接收它。

ros2 topic hz

如果我们想查看某一个话题的发布频率,依然可以通过命令行来实现:

ros2 topic hz /turtle1/pose

很快就可以看到turtlesim节点发布pose话题的频率啦:

$ ros2 topic hz /turtle1/pose
average rate: 62.454
	min: 0.014s max: 0.018s std dev: 0.00073s window: 64
average rate: 62.509
	min: 0.014s max: 0.018s std dev: 0.00071s window: 127
average rate: 62.513
	min: 0.014s max: 0.018s std dev: 0.00072s window: 190
average rate: 62.496
	min: 0.014s max: 0.018s std dev: 0.00073s window: 253

回想一下,您使用ros2 topic pub–rate 1将turtle1/cmd_vel的速率设置为稳定的1 Hz。如果您使用turtle1/cm d_evel而不是turtle1/pose运行上述命令,您将看到一个反映该速率的平均值。

$ ros2 topic hz /turtle1/cmd_vel
WARNING: topic [/turtle1/cmd_vel] does not appear to be published yet
average rate: 1.000
	min: 0.999s max: 1.000s std dev: 0.00042s window: 3
average rate: 1.000
	min: 0.998s max: 1.000s std dev: 0.00077s window: 5
average rate: 1.000
	min: 0.998s max: 1.000s std dev: 0.00073s window: 7
average rate: 1.000

此时,您将有许多节点在运行。不要忘记通过在每个终端中输入Ctrl+C来停止它们。

sudo apt install --fix-missing ros-galactic-usb-cam Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: ffmpeg ros-galactic-image-transport-plugins ros-galactic-theora-image-transport Suggested packages: ffmpeg-doc The following NEW packages will be installed: ffmpeg ros-galactic-image-transport-plugins ros-galactic-theora-image-transport ros-galactic-usb-cam 0 upgraded, 4 newly installed, 0 to remove and 150 not upgraded. Need to get 1,754 kB of archives. After this operation, 3,864 kB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://mirrors.aliyun.com/ubuntu focal-security/universe amd64 ffmpeg amd64 7:4.2.7-0ubuntu0.1 [1,453 kB] Err:2 http://packages.ros.org/ros2/ubuntu focal/main amd64 ros-galactic-theora-image-transport amd64 2.3.3-1focal.20220430.143745 404 Not Found [IP: 64.50.233.100 80] Err:3 http://packages.ros.org/ros2/ubuntu focal/main amd64 ros-galactic-image-transport-plugins amd64 2.3.3-1focal.20220430.172112 404 Not Found [IP: 64.50.233.100 80] Err:4 http://packages.ros.org/ros2/ubuntu focal/main amd64 ros-galactic-usb-cam amd64 0.4.2-1focal.20220430.172301 404 Not Found [IP: 64.50.233.100 80] Fetched 1,453 kB in 1s (1,062 kB/s) Unable to correct missing packages. E: Failed to fetch http://packages.ros.org/ros2/ubuntu/pool/main/r/ros-galactic-theora-image-transport/ros-galactic-theora-image-transport_2.3.3-1focal.20220430.143745_amd64.deb 404 Not Found [IP: 64.50.233.100 80] E: Failed to fetch http://packages.ros.org/ros2/ubuntu/pool/main/r/ros-galactic-image-transport-plugins/ros-galactic-image-transport-plugins_2.3.3-1focal.20220430.172112_amd64.deb 404 Not Found [IP: 64.50.233.100 80] E: Failed to fetch http://packages.ros.org/ros2/ubuntu/pool/main/r/ros-galactic-usb-cam/ros-galactic-usb-cam_0.4.2-1focal.20220430.172301_amd64.deb 404 Not Found [IP: 64.50.233.100 80] E: Aborting install.
07-11
<think>我们正在解决用户尝试安装ROS Galactic版本的`ros-galactic-usb-cam`时遇到的404错误。404错误通常表示软件包在指定的仓库中不存在或路径错误。根据引用[2]和引用[3]中的信息,用户可能混淆了ROS版本(Humble和Galactic)。用户之前尝试安装Humble版本的usb-cam,现在又提到Galactic版本。我们需要明确: 1. 用户是否确实在使用Galactic版本?因为引用[3]中提到了Galactic,但用户之前的问题是关于Humble的。 2. 如果用户确实在使用Galactic,那么我们需要提供针对Galactic的解决方案。 根据ROS官方仓库,`usb_cam`包在Galactic版本中也是可用的。但是,如果用户遇到404错误,可能是由于以下原因: - 没有正确设置ROS仓库源(特别是Galactic的源) - 包名拼写错误 - 该包在Galactic中确实不存在(但根据资料,它是存在的) 解决方案步骤: ### 1. 确认ROS版本 首先,用户需要确认自己正在使用的ROS 2版本是Galactic。可以通过以下命令查看: ```bash printenv ROS_DISTRO ``` 或者 ```bash source /opt/ros/galactic/setup.bash ``` ### 2. 更新系统包索引 确保系统包索引是最新的: ```bash sudo apt update ``` ### 3. 安装`ros-galactic-usb-cam` 尝试安装: ```bash sudo apt install ros-galactic-usb-cam ``` ### 4. 如果仍然404,检查仓库源 检查是否已添加正确的ROS 2 Galactic仓库源。通常,安装ROS Galactic时会自动设置,但可以检查: ```bash grep -r "packages.ros.org" /etc/apt/sources.list.d/ ``` 应该看到类似这样的行: ``` deb http://packages.ros.org/ros2/ubuntu jammy main ``` 注意:Galactic默认支持Ubuntu 20.04(Focal),如果用户使用的是Ubuntu 22.04(Jammy),可能需要确认Galactic是否支持Jammy。实际上,Galactic官方支持Focal,但也可以在Jammy上运行,但需要确保仓库源设置正确。 ### 5. 添加ROS仓库密钥(如果之前没有) 如果之前没有添加过密钥,可以添加: ```bash sudo apt install curl gnupg curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - ``` ### 6. 如果包仍然不存在,考虑源码安装 如果APT安装仍然失败,可以尝试从源码构建。步骤与Humble类似,但使用Galactic分支。 ```bash # 创建工作空间 mkdir -p ~/usb_cam_ws/src cd ~/usb_cam_ws/src # 克隆usb_cam仓库,指定Galactic分支 git clone https://github.com/ros-drivers/usb_cam -b galactic cd .. # 安装依赖 sudo apt update sudo apt install ros-galactic-ament-cmake ros-galactic-rclcpp ros-galactic-sensor-msgs ros-galactic-camera-info-manager ros-galactic-image-transport ros-galactic-camera-calibration-parsers rosdep install --from-paths src --ignore-src -y # 编译 colcon build --symlink-install ``` ### 7. 验证安装 编译完成后,可以运行: ```bash source install/setup.bash ros2 run usb_cam usb_cam_node_exe ``` ### 常见问题 - **Ubuntu版本不匹配**:ROS Galactic官方支持Ubuntu 20.04(Focal)。如果用户使用的是Ubuntu 22.04(Jammy),则可能需要考虑使用ROS Humble(支持Jammy)。如果用户坚持在Jammy上使用Galactic,可能需要自行解决依赖问题。 - **分支错误**:源码安装时确保分支正确(Galactic)。 ### 建议 如果用户使用的是Ubuntu 22.04,建议使用ROS Humble,因为这是官方支持的版本。在Humble中安装`ros-humble-usb-cam`的方法已经在之前的回答中给出。 如果用户确实需要使用Galactic,并且Ubuntu版本是20.04,那么按照上述步骤应该可以安装。 §§相关问题§§ 1. 如何检查ROS 2的版本? 2. 在Ubuntu 22.04上安装ROS Galactic有哪些注意事项? 3. 如何解决ROS包安装时的404错误? 4. 源码编译ROS包的基本步骤是什么? 5. 如何配置ROS 2的软件源?</think>### 解决 `ros-galactic-usb-cam` 安装的404错误 #### 问题分析 404错误表明软件源中不存在该包,通常由以下原因导致: 1. ROS Galactic软件源未正确配置 2. 包名拼写错误或版本不匹配 3. 系统架构不兼容(如ARM设备) 4. 软件源缓存过期 --- #### 解决方案 ##### 1. **验证ROS软件源配置** ```bash # 检查Galactic源是否存在 grep "packages.ros.org" /etc/apt/sources.list.d/ros2.list # 若无输出,添加官方源: sudo sh -c 'echo "deb http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2.list' sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 ``` ##### 2. **更新软件源缓存** ```bash sudo apt update && sudo apt upgrade -y ``` ##### 3. **尝试替代安装方式** ```bash # 方法1:安装完整桌面版(包含usb_cam) sudo apt install ros-galactic-desktop # 方法2:源码编译安装 mkdir -p ~/usb_cam_ws/src cd ~/usb_cam_ws/src git clone https://github.com/ros-drivers/usb_cam -b galactic cd .. rosdep install --from-paths src --ignore-src -y colcon build --symlink-install ``` ##### 4. **验证安装** ```bash # 加载环境 source install/setup.bash # 启动节点 ros2 run usb_cam usb_cam_node_exe ``` ##### 5. **依赖问题处理** 若编译报错,安装核心依赖: ```bash sudo apt install \ ros-galactic-camera-info-manager \ ros-galactic-image-transport \ ros-galactic-camera-calibration-parsers \ libv4l-dev v4l-utils ``` --- #### 常见问题处理 - **Ubuntu版本不匹配**: ROS Galactic需要Ubuntu 20.04 (Focal)。若使用22.04,需改用ROS Humble: ```bash sudo apt install ros-humble-usb-cam ``` - **分支错误**: 源码编译时确认分支: ```bash git clone -b galactic https://github.com/ros-drivers/usb_cam.git ``` - **权限问题**: 将用户加入video组: ```bash sudo usermod -aG video $USER ``` > 关键提示:根据引用[3][^3],源码编译时出现的YAML文件警告可忽略,不影响基本功能。图像模糊问题需在代码中修改分辨率参数(通常位于`usb_cam.cpp`的62-63行)。 --- #### 验证摄像头工作 ```bash # 查看图像话题 ros2 topic list | grep image # 实时显示图像 ros2 run usb_cam demo_launch.py ``` [^1]: ROS学习笔记(四):使用 `ros2 run usb_cam usb_cam_node_exe` 启动 USB 摄像头 [^2]: Maintaining a source checkout of ROS 2 Galactic [^3]: usb_cam编译运行及图像调试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Galaxy_Robot

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值