ROS源码分析-week5

本文详细分析了ROS中topic publisher和subscriber的注册过程。通过阅读源码,了解到publisher如何通过rospy.Publisher构造函数完成注册,包括名称解析和资源分配。同时,subscriber的构造过程也进行了简单说明。总结了ROS topic注册的简洁设计,为后续理解发布和接收流程奠定了基础。

2021SC@SDUSC

1. 本周工作目标

这周继续ros通信部分的源码,侧重点在于注重"topic是怎么注册的?publisher是怎么注册的?"。结合实际情况,本周的工作目标如下:

  • 根据talker and listener样例,调试阅读ros core topic注册部分代码

2. ros里topic publisher的注册

我们先看ros_catkin_ws/install_isolated/share/rospy_tutorials/001_talker_listener/talker.py文件的内容:

 可以看到示例代码很简洁,除去开头的注释,内容只有19行。注意阅读第43行,这里往ros core里注册了一个名为chatter的topic,发布std_msgs.String类型的消息。那么,它具体是怎么进行发布的呢?这里我们用调试模式,看看消息的发布究竟干了什么。

打上断点,从43行代码开始往下一路追踪,发现它先调用了rospy.Publisher的构造函数,而后者又调用了父类Topic的构造函数,第一个关键点在Topic的构造函数里:

这里发现了一个事实:rospy允许在节点初始化之前,先初始化节点所要发布的t

Note, selecting 'ros-foxy-shape-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros2bag' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rmw-implementation' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros2cli' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-foonathan-memory-vendor' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-composition-interfaces' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-typesupport-fastrtps-cpp' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rcpputils' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-urdfdom-headers' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-unique-identifier-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-launch-xml' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-default-generators' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-urdfdom' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros2doctor' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cpplint' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rcl-interfaces' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-geometry-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-ros' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-lint-cmake' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-runtime-py' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-domain-coordinator' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rcl-logging-spdlog' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-typesupport-c' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-io-context' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-tf2-tools' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rmw-implementation-cmake' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-typesupport-cpp' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-flake8' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-sros2-cmake' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosbag2' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rcutils' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosapi-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rclcpp-lifecycle' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-nav-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosapi' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-copyright' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros2service' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-urdf' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-fastcdr' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros-workspace' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-yaml-cpp-vendor' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-lint-common' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-cppcheck' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros2node' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-stereo-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosbag2-converter-default-plugins' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-parser' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosbag2-compression' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros-environment' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rpyutils' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-gmock-vendor' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-gtest-vendor' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-typesupport-connext-c' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-zstd-vendor' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosbag2-storage-default-plugins' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-shared-queues-vendor' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cppcheck' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-tf2-py' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-pep257' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros2component' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros2launch' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-eigen3-cmake-module' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros2pkg' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-index-python' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-urg-node' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-export-targets' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-adapter' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-tracetools' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-runtime-c' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-gtest' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-xmllint' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros2run' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-statistics-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-trajectory-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-cartographer-ros-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-tf2-geometry-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-package' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-cartographer' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-tf2-bullet' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rcl-action' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-typesupport-connext-cpp' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-serial-driver' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-kdl-parser' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-launch-testing' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-generator-c' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-export-link-flags' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-fastrtps' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-typesupport-introspection-c' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosbag2-transport' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-launch-testing-ament-cmake' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-libyaml-vendor' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-default-runtime' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros2action' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-orocos-kdl' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-cartographer-ros' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-class-loader' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-diagnostic-updater' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-tf2-eigen' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosbag2-storage' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rclcpp' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-launch' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros2lifecycle' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-launch-testing-ros' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-sdl2-vendor' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-pytest' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-urg-c' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-cmake' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros2topic' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-diagnostic-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-cpplint' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-tf2-kdl' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-fastrtps-cmake-module' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-lint-cmake' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-urg-node-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-typesupport-fastrtps-c' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rclpy' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-auto' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosbridge-library' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rosidl-typesupport-introspection-cpp' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rmw-fastrtps-shared-cpp' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-example-interfaces' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-python' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-uncrustify' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-version' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-libstatistics-collector' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-sensor-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-cmake-gmock' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rclcpp-components' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ament-lint-auto' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-test-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-std-msgs' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-ros2param' for glob 'ros-foxy-*' Note, selecting 'ros-foxy-rmw-fastrtps-cpp' for glob 'ros-foxy-*' Package 'ros-foxy-rmw-connext-cpp' is not installed, so not removed Package 'ros-foxy-rosidl-typesupport-connext-c' is not installed, so not removed Package 'ros-foxy-rosidl-typesupport-connext-cpp' is not installed, so not removed E: Unable to locate package ros2-* E: Couldn't find any package by glob 'ros2-*'
最新发布
08-07
在 Ubuntu 20.04 上从 ROS2 Foxy 切换到 ROS1 Noetic 的过程中,用户可能会遇到无法找到匹配的 `ros2-*` 包的问题,提示“无法定位包”或“未安装相关包”。此类问题通常是因为 ROS2 的软件源未正确配置或已被移除,导致系统无法识别相关包名。 为了解决这一问题,首先需要确认是否仍然保留 ROS2 的源配置。如果已经执行过类似以下命令来添加 ROS2 源: ```bash echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null ``` 则仍可使用 `apt` 安装 ROS2 相关包。若已删除该源列表文件,则需重新添加 ROS2 Foxy 的源以恢复对 `ros2-*` 包的支持[^1]。 如果目标是完全切换到 ROS1 环境,则应优先卸载 ROS2 并添加 ROS1 的源。卸载 ROS2 的方式如下: ```bash sudo apt remove ros-foxy-* ros2-* -y sudo apt autoremove -y sudo rm /etc/apt/sources.list.d/ros2.list sudo apt update ``` 随后添加 ROS1 Noetic 的源: ```bash sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update ``` 然后安装 ROS1 Noetic: ```bash sudo apt install -y ros-noetic-desktop-full ``` 为确保环境变量正确加载,需执行以下命令: ```bash echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc ``` 此外,为支持 ROS1 的开发和构建,建议安装以下工具链: ```bash sudo apt install -y python3-rosinstall python3-rosinstall-generator python3-wstool build-essential ``` 通过上述步骤,可以有效解决从 ROS2 Foxy 切换到 ROS1 Noetic 时遇到的包缺失问题,并确保系统环境干净整洁,避免版本冲突。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值