目录
- 一、总体结构和功能概述
- 二、函数解析
- 1. `struct Impl`内部结构体及相关函数
- 2. `create_publisher`函数
- 3. `create_subscription`函数
- 4. `create_camera_publisher`函数
- 5. `create_camera_subscription`函数
- 6. `getDeclaredTransports`函数
- 7. `getLoadableTransports`函数
- 8. `ImageTransport`类的构造函数和析构函数
- 9. `ImageTransport::advertise`函数
- 10. `ImageTransport::advertise`函数(另一个重载版本)
- 11. `ImageTransport::subscribe`函数
- 12. `ImageTransport::subscribe`函数(另一个重载版本)
- 13. `ImageTransport::advertiseCamera`函数
- 14. `ImageTransport::subscribeCamera`函数
- 15. `ImageTransport::getDeclaredTransports`函数
- 16. `ImageTransport::getLoadableTransports`函数
- 17. `ImageTransport::getTransportOrDefault`函数
- 三、总结
一、总体结构和功能概述
这段 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
对象,并将节点指针存储在其中。
- 功能:接受一个指向 ROS2 节点的共享指针,用于初始化
- 析构函数
~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 节点上发布图像话题。它允许用户指定基础话题名称、队列大小和一个可选的锁存标志。
二、参数解释
const std::string & base_topic
:基础话题名称,图像将发布到这个话题上。uint32_t queue_size
:发布者的队列大小,决定了可以缓存的未处理消息数量。bool latch
:一个布尔值,表示是否启用锁存模式。如果启用锁存模式,当有新的订阅者连接时,将发送最后发布的消息。
三、函数体分析
// TODO(ros2) implement when resolved: https://github.com/ros2/ros2/issues/464
:- 这是一个注释,表明在特定的 ROS2 问题解决后,可能需要对这个函数进行进一步的实现。可能当前的实现存在一些未解决的问题或者需要根据 ROS2 的未来发展进行调整。
(void) latch;
:- 这行代码将
latch
参数显式地转换为void
类型,表明当前版本的函数暂时不处理锁存模式。这可能是因为在当前实现中,锁存模式的支持还不完善或者还没有被实现。
- 这行代码将
rmw_qos_profile_t custom_qos = rmw_qos_profile_default;
:- 创建一个默认的 QoS(Quality of Service)配置对象。在 ROS2 中,QoS 配置决定了消息的传输质量,包括可靠性、持久性等方面。
custom_qos.depth = queue_size;
:- 将传入的队列大小赋值给默认 QoS 配置对象的
depth
成员变量,设置发布者的队列深度。
- 将传入的队列大小赋值给默认 QoS 配置对象的
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 配置对象,而不是队列大小。
二、参数解释
const std::string & base_topic
:基础话题名称,与上一个版本相同。rmw_qos_profile_t custom_qos
:自定义的 QoS 配置对象,可以根据具体需求设置不同的 QoS 参数。bool latch
:布尔值,表示是否启用锁存模式,与上一个版本相同。
三、函数体分析
// TODO(ros2) implement when resolved: https://github.com/ros2/ros2/issues/464
:- 与上一个版本的注释相同,表明在特定的 ROS2 问题解决后,可能需要对这个函数进行进一步的实现。
(void) latch;
:- 同样将
latch
参数显式地转换为void
类型,表明当前版本的函数暂时不处理锁存模式。
- 同样将
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,则直接获取其传输方式名称。
- 如果传输提示为 nullptr,则创建一个默认的
三、总结
这段代码通过插件机制实现了灵活的图像传输功能,允许用户选择不同的传输方式来发布和订阅图像数据。同时,提供了方便的函数和类,使得用户可以轻松地管理图像的发布和订阅操作。通过对这些函数的解析,我们可以更好地理解image_transport
库的工作原理和使用方法。