ros2[jazzy] mage_transport::ImageTransport 详细范例
摘要:ROS2 Jazzy的image_transport::ImageTransport模块通过懒订阅、QoS深度集成和多传输策略动态选择等特性,显著优化图像传输性能。其支持压缩传输(如JPEG/PNG)减少50%-90%带宽占用,结合实时内核和OpenCV并行处理降低延迟至毫秒级。示例代码展示了发布/订阅节点的实现,包括动态QoS配置和cv_bridge图像转换。该模块适用于机器人视觉等场景,
·
ROS2 Jazzy 中 image_transport::ImageTransport 特性与优越性
核心特性
-
懒订阅(Lazy Subscriber)
- 订阅者仅在有消费者时才激活传输,减少不必要的资源消耗。例如,通过
image_transport::TransportHints指定"compressed"传输策略时,订阅者会动态选择最优压缩格式(如 JPEG/PNG),避免固定格式的带宽浪费。
- 订阅者仅在有消费者时才激活传输,减少不必要的资源消耗。例如,通过
-
QoS 深度集成
- 支持 ROS2 的服务质量(QoS)配置,如
rmw_qos_profile_sensor_data,确保图像传输的可靠性和实时性。例如,订阅者可设置Depth和Reliability参数,适应高带宽或低延迟场景。
- 支持 ROS2 的服务质量(QoS)配置,如
-
多传输策略动态选择
- 通过参数服务器动态调整压缩参数(如 JPEG 质量、PNG 压缩比),支持运行时切换传输方式。例如,发布者可通过
set_parameterAPI 修改压缩格式,订阅者自动适配。
- 通过参数服务器动态调整压缩参数(如 JPEG 质量、PNG 压缩比),支持运行时切换传输方式。例如,发布者可通过
-
与 Gazebo 深度集成
- 推荐搭配 Gazebo Harmonic 版本,通过
gz_*_vendor包简化仿真环境中的图像传输,提升开发效率。
- 推荐搭配 Gazebo Harmonic 版本,通过
-
实时性优化
- 结合 ROS2 的实时内核(如 RT-Preempt)和 OpenCV 的 TBB 并行处理,减少图像传输延迟。例如,通过
cv::setNumThreads(4)启用多线程处理,提升处理速度。
- 结合 ROS2 的实时内核(如 RT-Preempt)和 OpenCV 的 TBB 并行处理,减少图像传输延迟。例如,通过
优越性
- 带宽优化:压缩传输减少 50%-90% 带宽占用,适合远程传输和带宽受限场景。
- 延迟降低:懒订阅和 QoS 配置减少无效传输,延迟降低至毫秒级。
- 灵活性:支持多种传输策略(如原始、压缩、视频流),适应不同应用需求。
- 易用性:与 OpenCV 无缝集成,通过
cv_bridge快速转换图像格式,简化开发流程。 - 可扩展性:通过插件机制支持自定义传输方式,如 ZED 相机专用压缩算法。
完整应用范例
1. 发布者节点 (image_publisher.cpp)
#include <rclcpp/rclcpp.hpp>
#include <image_transport/image_transport.hpp>
#include <cv_bridge/cv_bridge.hpp>
#include <opencv2/opencv.hpp>
using namespace std::chrono_literals;
class ImagePublisher : public rclcpp::Node {
public:
ImagePublisher() : Node("image_publisher") {
image_transport::ImageTransport it(*this);
pub_ = it.advertise("camera/image_raw", 1); // 原始图像主题
cv::Mat image = cv::imread("/path/to/image.jpg", cv::IMREAD_COLOR);
if (image.empty()) {
RCLCPP_ERROR(get_logger(), "Failed to load image!");
return;
}
sensor_msgs::msg::Image::SharedPtr msg = cv_bridge::cvImageToMsg(
cv_bridge::cvImage(std_msgs::msg::Header(), "bgr8", image));
timer_ = create_wall_timer(100ms, [this, msg]() {
pub_.publish(msg); // 定时发布
});
}
private:
image_transport::Publisher pub_;
rclcpp::TimerBase::SharedPtr timer_;
};
int main(int argc, char * argv[]) {
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<ImagePublisher>());
rclcpp::shutdown();
return 0;
}
2. 订阅者节点 (image_subscriber.cpp)
#include <rclcpp/rclcpp.hpp>
#include <image_transport/image_transport.hpp>
#include <cv_bridge/cv_bridge.hpp>
#include <opencv2/opencv.hpp>
class ImageSubscriber : public rclcpp::Node {
public:
ImageSubscriber() : Node("image_subscriber") {
image_transport::ImageTransport it(*this);
// 启用懒订阅和 QoS 配置
image_transport::TransportHints hints("compressed", rmw_qos_profile_sensor_data);
sub_ = it.subscribe("camera/image_raw", 1,
&ImageSubscriber::imageCallback, this, hints);
cv::namedWindow("Received Image", cv::WINDOW_AUTOSIZE);
}
private:
void imageCallback(const sensor_msgs::msg::Image::ConstSharedPtr& msg) {
try {
cv::Mat image = cv_bridge::toCvShare(msg, "bgr8")->image;
cv::imshow("Received Image", image);
cv::waitKey(1);
} catch (cv_bridge::Exception& e) {
RCLCPP_ERROR(get_logger(), "Image conversion failed: %s", e.what());
}
}
image_transport::Subscriber sub_;
};
int main(int argc, char * argv[]) {
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<ImageSubscriber>());
rclcpp::shutdown();
return 0;
}
3. CMakeLists.txt 配置
cmake_minimum_required(VERSION 3.5)
project(image_transport_example)
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(image_transport REQUIRED)
find_package(cv_bridge REQUIRED)
find_package(OpenCV REQUIRED COMPONENTS core imgproc highgui)
add_executable(image_publisher src/image_publisher.cpp)
ament_target_dependencies(image_publisher
rclcpp
image_transport
cv_bridge
OpenCV
)
add_executable(image_subscriber src/image_subscriber.cpp)
ament_target_dependencies(image_subscriber
rclcpp
image_transport
cv_bridge
OpenCV
)
install(TARGETS
image_publisher
image_subscriber
DESTINATION lib/${PROJECT_NAME}
)
ament_package()
运行步骤
-
环境配置
sudo apt install ros-jazzy-image-transport ros-jazzy-cv-bridge -
编译与运行
colcon build --packages-select image_transport_example source install/setup.bash ros2 run image_transport_example image_publisher # 启动发布者 ros2 run image_transport_example image_subscriber # 启动订阅者 -
验证效果
- 使用
rqt_image_view查看原始图像和压缩图像主题(如/camera/image_raw/compressed)。 - 通过
ros2 topic list确认压缩主题是否生成。
- 使用
性能优化建议
- 带宽敏感场景:启用 JPEG 压缩(质量 80),减少带宽占用。
- 实时性场景:设置 QoS 为
rmw_qos_profile_sensor_data,降低传输延迟。 - 多摄像头系统:通过
image_transport::CameraPublisher同步发布图像和相机参数。
通过上述范例,可全面展示 ROS2 Jazzy 中 image_transport 的特性、优越性及完整应用流程,适用于机器人视觉、远程监控等场景。
更多推荐
所有评论(0)