〖image_common源码解析〗image_transport/src/image_transport.cpp

一、总体结构和功能概述

这段 C++代码定义了一个名为image_transport的命名空间,其中包含了一系列用于图像传输的功能。主要包括创建图像发布者和订阅者的函数,以及一个ImageTransport类,用于更方便地管理图像的发布和订阅。代码通过插件机制实现了不同的图像传输方式,并提供了获取可用传输方式的功能。

二、函数解析

1. struct Impl内部结构体及相关函数

  • Impl结构体:
    • PubLoaderPtr pub_loader_:一个指向发布者插件加载器的智能指针,用于加载不同的图像发布者插件。
    • SubLoaderPtr sub_loader_:一个指向订阅者插件加载器的智能指针,用于加载不同的图像订阅者插件。
  • Impl()构造函数:
    • 创建了发布者插件加载器和订阅者插件加载器,并指定了插件的命名空间和基类名称。
  • static Impl * kImpl = new Impl();
    • 创建了一个静态的Impl实例,用于在整个命名空间中共享插件加载器。

2. create_publisher函数

Publisher create_publisher(
  rclcpp::Node * node,
  const std::string & base_topic,
  rmw_qos_profile_t custom_qos,
  rclcpp::PublisherOptions options)
{
  return Publisher(node, base_topic, kImpl->pub_loader_, custom_qos, options);
}

  • 功能:创建一个图像发布者。
  • 参数:
    • rclcpp::Node * node:指向 ROS2 节点的指针,用于在该节点上创建发布者。
    • const std::string & base_topic:基础话题名称,图像将发布到这个话题上。
    • rmw_qos_profile_t custom_qos:自定义的 QoS(Quality of Service)配置。
    • rclcpp::PublisherOptions options:发布者选项,可以用于进一步定制发布者的行为。
  • 返回值:返回一个Publisher对象,代表创建的图像发布者。
  • 实现:调用Publisher的构造函数,传入节点指针、基础话题名称、静态Impl实例中的发布者插件加载器、自定义 QoS 配置和发布者选项。

3. create_subscription函数

  • 功能:创建一个图像订阅者。
  • 参数:
    • rclcpp::Node * node:指向 ROS2 节点的指针,用于在该节点上创建订阅者。
    • const std::string & base_topic:基础话题名称,订阅者将订阅这个话题上的图像数据。
    • const Subscriber::Callback & callback:回调函数,当有新的图像数据到达时,将调用这个函数进行处理。
    • const std::string & transport:指定使用的传输方式,例如“compressed”表示使用压缩传输。
    • rmw_qos_profile_t custom_qos:自定义的 QoS 配置。
    • rclcpp::SubscriptionOptions options:订阅者选项。
  • 返回值:返回一个Subscriber对象,代表创建的图像订阅者。
  • 实现:调用Subscriber的构造函数,传入节点指针、基础话题名称、回调函数、静态Impl实例中的订阅者插件加载器、传输方式、自定义 QoS 配置和订阅者选项。

4. create_camera_publisher函数

  • 功能:创建一个相机发布者。
  • 参数:
    • rclcpp::Node * node:指向 ROS2 节点的指针,用于在该节点上创建发布者。
    • const std::string & base_topic:基础话题名称,相机图像和信息将发布到这个话题上。
    • rmw_qos_profile_t custom_qos:自定义的 QoS 配置。
    • rclcpp::PublisherOptions pub_options:发布者选项,可以用于进一步定制发布者的行为。
  • 返回值:返回一个CameraPublisher对象,代表创建的相机发布者。
  • 实现:调用CameraPublisher的构造函数,传入节点指针、基础话题名称、自定义 QoS 配置和发布者选项。

5. create_camera_subscription函数

  • 功能:创建一个相机订阅者。
  • 参数:
    • rclcpp::Node * node:指向 ROS2 节点的指针,用于在该节点上创建订阅者。
    • const std::string & base_topic:基础话题名称,订阅者将订阅这个话题上的相机图像和信息数据。
    • const CameraSubscriber::Callback & callback:回调函数,当有新的相机图像和信息数据到达时,将调用这个函数进行处理。
    • const std::string & transport:指定使用的传输方式,例如“compressed”表示使用压缩传输。
    • rmw_qos_profile_t custom_qos:自定义的 QoS 配置。
  • 返回值:返回一个CameraSubscriber对象,代表创建的相机订阅者。
  • 实现:调用CameraSubscriber的构造函数,传入节点指针、基础话题名称、回调函数、传输方式和自定义 QoS 配置。

6. getDeclaredTransports函数

  • 功能:获取系统中声明的所有传输方式的名称。
  • 返回值:返回一个std::vector<std::string>,其中包含了传输方式的名称列表。
  • 实现:
    • 从静态Impl实例中的订阅者插件加载器获取声明的插件类名称列表。
    • 对于每个类名称,去除末尾的“_sub”,得到传输方式的名称。

7. getLoadableTransports函数

  • 功能:获取系统中可加载的所有传输方式的名称。
  • 返回值:返回一个std::vector<std::string>,其中包含了可加载的传输方式的名称列表。
  • 实现:
    • 遍历静态Impl实例中的订阅者插件加载器声明的所有插件类名称。
    • 尝试加载每个插件,如果加载成功,去除类名称末尾的“_sub”,并将其添加到可加载传输方式列表中。如果加载失败,则忽略该插件。

8. ImageTransport类的构造函数和析构函数

```cpp
ImageTransport::ImageTransport(rclcpp::Node::SharedPtr node)
: impl_(std::make_unique<ImageTransport::Impl>())
{
  impl_->node_ = node;
}
```
  • 构造函数ImageTransport(rclcpp::Node::SharedPtr node)
    • 功能:接受一个指向 ROS2 节点的共享指针,用于初始化ImageTransport对象。
    • 实现:创建一个ImageTransport::Impl对象,并将节点指针存储在其中。
  • 析构函数~ImageTransport() = default;
    • 功能:默认析构函数,由编译器自动生成。

9. ImageTransport::advertise函数

  • 功能:发布图像话题。
  • 参数:
    • const std::string & base_topic:基础话题名称。
    • uint32_t queue_size:发布者的队列大小。
    • bool latch:是否启用锁存模式。
  • 返回值:返回一个Publisher对象,代表创建的图像发布者。
  • 实现:
    • 如果启用了锁存模式,暂时不做处理(TODO)。
    • 创建一个默认的 QoS 配置,并设置队列大小。
    • 调用create_publisher函数,传入节点指针、基础话题名称、自定义 QoS 配置。

10. ImageTransport::advertise函数(另一个重载版本)

  • 功能:发布图像话题,使用自定义的 QoS 配置。
  • 参数:
    • const std::string & base_topic:基础话题名称。
    • rmw_qos_profile_t custom_qos:自定义的 QoS 配置。
    • bool latch:是否启用锁存模式。
  • 返回值:返回一个Publisher对象,代表创建的图像发布者。
  • 实现:
    • 如果启用了锁存模式,暂时不做处理(TODO)。
    • 调用create_publisher函数,传入节点指针、基础话题名称、自定义 QoS 配置。

11. ImageTransport::subscribe函数

Publisher ImageTransport::advertise(const std::string & base_topic, uint32_t queue_size, bool latch)
{
  // TODO(ros2) implement when resolved: https://github.com/ros2/ros2/issues/464
  (void) latch;
  rmw_qos_profile_t custom_qos = rmw_qos_profile_default;
  custom_qos.depth = queue_size;
  return create_publisher(impl_->node_.get(), base_topic, custom_qos);
}
一、函数功能概述

这个函数是ImageTransport类的成员函数,用于在关联的 ROS2 节点上发布图像话题。它允许用户指定基础话题名称、队列大小和一个可选的锁存标志。

二、参数解释
  1. const std::string & base_topic:基础话题名称,图像将发布到这个话题上。
  2. uint32_t queue_size:发布者的队列大小,决定了可以缓存的未处理消息数量。
  3. bool latch:一个布尔值,表示是否启用锁存模式。如果启用锁存模式,当有新的订阅者连接时,将发送最后发布的消息。
三、函数体分析
  1. // TODO(ros2) implement when resolved: https://github.com/ros2/ros2/issues/464
    • 这是一个注释,表明在特定的 ROS2 问题解决后,可能需要对这个函数进行进一步的实现。可能当前的实现存在一些未解决的问题或者需要根据 ROS2 的未来发展进行调整。
  2. (void) latch;
    • 这行代码将latch参数显式地转换为void类型,表明当前版本的函数暂时不处理锁存模式。这可能是因为在当前实现中,锁存模式的支持还不完善或者还没有被实现。
  3. rmw_qos_profile_t custom_qos = rmw_qos_profile_default;
    • 创建一个默认的 QoS(Quality of Service)配置对象。在 ROS2 中,QoS 配置决定了消息的传输质量,包括可靠性、持久性等方面。
  4. custom_qos.depth = queue_size;
    • 将传入的队列大小赋值给默认 QoS 配置对象的depth成员变量,设置发布者的队列深度。
  5. return create_publisher(impl_->node_.get(), base_topic, custom_qos);
    • 调用create_publisher函数,传入内部实现结构中的节点指针、基础话题名称和自定义的 QoS 配置对象,创建一个图像发布者,并返回这个发布者对象。
四、总结

这个函数提供了一种方便的方式来在ImageTransport对象关联的 ROS2 节点上发布图像话题。通过指定基础话题名称和队列大小,可以控制发布者的行为。然而,目前函数暂不支持锁存模式,并且依赖于默认的 QoS 配置,除了队列大小外没有其他可定制的 QoS 参数。

12. ImageTransport::subscribe函数(另一个重载版本)

Publisher ImageTransport::advertise(
const std::string & base_topic, rmw_qos_profile_t custom_qos,
bool latch)
{
// TODO(ros2) implement when resolved: https://github.com/ros2/ros2/issues/464
(void) latch;
return create_publisher(impl_->node_.get(), base_topic, custom_qos);
}
一、函数功能概述

这个函数也是ImageTransport类的成员函数,同样用于发布图像话题,但与上一个版本不同的是,它接受一个自定义的 QoS 配置对象,而不是队列大小。

二、参数解释
  1. const std::string & base_topic:基础话题名称,与上一个版本相同。
  2. rmw_qos_profile_t custom_qos:自定义的 QoS 配置对象,可以根据具体需求设置不同的 QoS 参数。
  3. bool latch:布尔值,表示是否启用锁存模式,与上一个版本相同。
三、函数体分析
  1. // TODO(ros2) implement when resolved: https://github.com/ros2/ros2/issues/464
    • 与上一个版本的注释相同,表明在特定的 ROS2 问题解决后,可能需要对这个函数进行进一步的实现。
  2. (void) latch;
    • 同样将latch参数显式地转换为void类型,表明当前版本的函数暂时不处理锁存模式。
  3. return create_publisher(impl_->node_.get(), base_topic, custom_qos);
    • 直接调用create_publisher函数,传入内部实现结构中的节点指针、基础话题名称和传入的自定义 QoS 配置对象,创建一个图像发布者,并返回这个发布者对象。
四、总结

这个版本的函数提供了更大的灵活性,允许用户传入自定义的 QoS 配置对象来控制图像发布的质量。与上一个版本相比,它不依赖于默认的 QoS 配置,除了基础话题名称外,完全由用户自定义的 QoS 配置决定发布者的行为。然而,和上一个版本一样,目前也暂不支持锁存模式。

13. ImageTransport::advertiseCamera函数

  • 功能:发布同步的相机图像和信息话题对。
  • 参数:
    • const std::string & base_topic:基础话题名称。
    • uint32_t queue_size:发布者的队列大小。
    • bool latch:是否启用锁存模式。
  • 返回值:返回一个CameraPublisher对象,代表创建的相机发布者。
  • 实现:
    • 如果启用了锁存模式,暂时不做处理(TODO)。
    • 创建一个默认的 QoS 配置,并设置队列大小。
    • 调用create_camera_publisher函数,传入节点指针、基础话题名称、自定义 QoS 配置。

14. ImageTransport::subscribeCamera函数

  • 功能:订阅同步的相机图像和信息话题对。
  • 参数:
    • const std::string & base_topic:基础话题名称。
    • uint32_t queue_size:订阅者的队列大小。
    • const CameraSubscriber::Callback & callback:回调函数,当有新的相机图像和信息数据到达时,将调用这个函数进行处理。
    • const VoidPtr & tracked_object:跟踪对象,可以用于在回调函数中访问特定的状态或数据。
    • const TransportHints * transport_hints:传输提示,可以用于指定使用的传输方式或其他参数。
  • 返回值:返回一个CameraSubscriber对象,代表创建的相机订阅者。
  • 实现:
    • 忽略跟踪对象参数。
    • 创建一个默认的 QoS 配置,并设置队列大小。
    • 根据传输提示获取传输方式名称,如果没有传输提示,则使用默认的传输方式。
    • 调用create_camera_subscription函数,传入节点指针、基础话题名称、回调函数、传输方式、自定义 QoS 配置。

15. ImageTransport::getDeclaredTransports函数

  • 功能:获取系统中声明的所有传输方式的名称。
  • 返回值:返回一个std::vector<std::string>,其中包含了传输方式的名称列表。
  • 实现:调用命名空间中的getDeclaredTransports函数。

16. ImageTransport::getLoadableTransports函数

  • 功能:获取系统中可加载的所有传输方式的名称。
  • 返回值:返回一个std::vector<std::string>,其中包含了可加载的传输方式的名称列表。
  • 实现:调用命名空间中的getLoadableTransports函数。

17. ImageTransport::getTransportOrDefault函数

  • 功能:根据传输提示获取传输方式名称,如果没有传输提示,则使用默认的传输方式。
  • 参数:
    • const TransportHints * transport_hints:指向传输提示的指针,如果为 nullptr,则使用默认的传输方式。
  • 返回值:返回一个字符串,表示传输方式的名称。
  • 实现:
    • 如果传输提示为 nullptr,则创建一个默认的TransportHints对象,并获取其传输方式名称。
    • 如果传输提示不为 nullptr,则直接获取其传输方式名称。

三、总结

这段代码通过插件机制实现了灵活的图像传输功能,允许用户选择不同的传输方式来发布和订阅图像数据。同时,提供了方便的函数和类,使得用户可以轻松地管理图像的发布和订阅操作。通过对这些函数的解析,我们可以更好地理解image_transport库的工作原理和使用方法。

### ROS `sensor_msgs` Package Message Definitions #### Overview of the Sensor Messages Package The `sensor_msgs` package contains standard messages for common sensors used in robotics applications. This includes cameras, lasers, IMUs (Inertial Measurement Units), and more[^1]. The package provides a set of message types that are widely adopted across various robotic platforms to ensure interoperability. #### Commonly Used Messages within `sensor_msgs` ##### Image Data Representation For handling image data from cameras or other imaging devices, the following messages are available: - **Image**: Encapsulates raw pixel data along with metadata such as encoding type, width, height, etc. ```cpp std::string encoding; uint32_t width; uint32_t height; bool is_bigendian; uint32_t step; // Full row length in bytes uint8[] data; // Actual pixel data ``` This structure allows efficient transmission of images between nodes while preserving necessary information about how they should be interpreted. ##### Point Cloud Data Structures To manage point cloud data generated by LiDARs or stereo vision systems, two primary structures exist: - **PointCloud2** A flexible format supporting multi-dimensional arrays of points where each point can carry multiple properties like position, color, intensity, etc., all packed into one binary blob for compactness and efficiency during transport over networks. ```cpp Header header int32 height int32 width Fields[] fields bool is_bigendian=false int32 point_step=0 int32 row_step=0 byte[] data bool is_dense=true ``` Each field describes an attribute associated with every single point inside this dataset. ##### Laser Scan Information Laser scans produced by range finders typically use the **LaserScan** message which holds angular ranges alongside distance measurements at regular intervals around its axis. ```cpp Header header float32 angle_min float32 angle_max float32 angle_increment float32 time_increment float32 scan_time float32 range_min float32 range_max float32[] ranges float32[] intensities ``` These parameters define the configuration settings under which the laser scanner operates including minimum/maximum angles covered per sweep cycle plus resolution details regarding both spatial extent and temporal sampling rate. #### Installation Instructions for Additional Dependencies When working specifically with PCL (Point Cloud Library) related functionalities, it might become essential also installing additional packages not bundled directly within core ROS distributions but rather provided separately through repositories maintained outside official channels. For instance, ```bash sudo apt-get install ros-$ROS_DISTRO-pcl-msgs ``` Here `$ROS_DISTRO` needs replacement according to current distribution being utilized on system level environment setup context e.g., noetic instead of melodic depending upon what has been installed previously.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值