Skip to content

Commit eb9af5f

Browse files
authored
Add QoS profile query parameters (#133)
1 parent c23b907 commit eb9af5f

File tree

7 files changed

+81
-3
lines changed

7 files changed

+81
-3
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ add_executable(${PROJECT_NAME}
5151
src/ros_compressed_streamer.cpp
5252
src/jpeg_streamers.cpp
5353
src/png_streamers.cpp
54+
src/utils.cpp
5455
)
5556

5657
ament_target_dependencies(${PROJECT_NAME}

include/web_video_server/image_streamer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <image_transport/image_transport.hpp>
66
#include <image_transport/transport_hints.hpp>
77
#include <opencv2/opencv.hpp>
8+
#include "web_video_server/utils.h"
89
#include "async_web_server_cpp/http_server.hpp"
910
#include "async_web_server_cpp/http_request.hpp"
1011

@@ -66,6 +67,7 @@ class ImageTransportImageStreamer : public ImageStreamer
6667
int output_height_;
6768
bool invert_;
6869
std::string default_transport_;
70+
std::string qos_profile_name_;
6971

7072
rclcpp::Time last_frame;
7173
cv::Mat output_size_image;

include/web_video_server/ros_compressed_streamer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class RosCompressedStreamer : public ImageStreamer
2929
rclcpp::Time last_frame;
3030
sensor_msgs::msg::CompressedImage::ConstSharedPtr last_msg;
3131
boost::mutex send_mutex_;
32+
std::string qos_profile_name_;
3233
};
3334

3435
class RosCompressedStreamerType : public ImageStreamerType

include/web_video_server/utils.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#pragma once
2+
3+
#include <string>
4+
#include <optional>
5+
#include "rmw/qos_profiles.h"
6+
7+
namespace web_video_server
8+
{
9+
10+
/**
11+
* @brief Gets a QoS profile given an input name, if valid.
12+
* @param name The name of the QoS profile name.
13+
* @return An optional containing the matching QoS profile.
14+
*/
15+
std::optional<rmw_qos_profile_t> get_qos_profile_from_name(const std::string name);
16+
17+
} // namespace web_video_server

src/image_streamer.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ ImageTransportImageStreamer::ImageTransportImageStreamer(const async_web_server_
2424
output_height_ = request.get_query_param_value_or_default<int>("height", -1);
2525
invert_ = request.has_query_param("invert");
2626
default_transport_ = request.get_query_param_value_or_default("default_transport", "raw");
27+
qos_profile_name_ = request.get_query_param_value_or_default("qos_profile", "default");
2728
}
2829

2930
ImageTransportImageStreamer::~ImageTransportImageStreamer()
@@ -46,7 +47,22 @@ void ImageTransportImageStreamer::start()
4647
break;
4748
}
4849
}
49-
image_sub_ = it_.subscribe(topic_, 1, &ImageTransportImageStreamer::imageCallback, this, &hints);
50+
51+
// Get QoS profile from query parameter
52+
RCLCPP_INFO(nh_->get_logger(), "Streaming topic %s with QoS profile %s", topic_.c_str(), qos_profile_name_.c_str());
53+
auto qos_profile = get_qos_profile_from_name(qos_profile_name_);
54+
if (!qos_profile) {
55+
qos_profile = rmw_qos_profile_default;
56+
RCLCPP_ERROR(
57+
nh_->get_logger(),
58+
"Invalid QoS profile %s specified. Using default profile.",
59+
qos_profile_name_.c_str());
60+
}
61+
62+
// Create subscriber
63+
image_sub_ = image_transport::create_subscription(
64+
nh_.get(), topic_, std::bind(&ImageTransportImageStreamer::imageCallback, this, std::placeholders::_1),
65+
default_transport_, qos_profile.value());
5066
}
5167

5268
void ImageTransportImageStreamer::initialize(const cv::Mat &)

src/ros_compressed_streamer.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ RosCompressedStreamer::RosCompressedStreamer(const async_web_server_cpp::HttpReq
88
ImageStreamer(request, connection, nh), stream_(std::bind(&rclcpp::Node::now, nh), connection)
99
{
1010
stream_.sendInitialHeader();
11+
qos_profile_name_ = request.get_query_param_value_or_default("qos_profile", "default");
1112
}
1213

1314
RosCompressedStreamer::~RosCompressedStreamer()
@@ -17,9 +18,23 @@ RosCompressedStreamer::~RosCompressedStreamer()
1718
}
1819

1920
void RosCompressedStreamer::start() {
20-
std::string compressed_topic = topic_ + "/compressed";
21+
const std::string compressed_topic = topic_ + "/compressed";
22+
23+
// Get QoS profile from query parameter
24+
RCLCPP_INFO(nh_->get_logger(), "Streaming topic %s with QoS profile %s", compressed_topic.c_str(), qos_profile_name_.c_str());
25+
auto qos_profile = get_qos_profile_from_name(qos_profile_name_);
26+
if (!qos_profile) {
27+
qos_profile = rmw_qos_profile_default;
28+
RCLCPP_ERROR(
29+
nh_->get_logger(),
30+
"Invalid QoS profile %s specified. Using default profile.",
31+
qos_profile_name_.c_str());
32+
}
33+
34+
// Create subscriber
35+
const auto qos = rclcpp::QoS(rclcpp::QoSInitialization(qos_profile.value().history, 1), qos_profile.value());
2136
image_sub_ = nh_->create_subscription<sensor_msgs::msg::CompressedImage>(
22-
compressed_topic, 1, std::bind(&RosCompressedStreamer::imageCallback, this, std::placeholders::_1));
37+
compressed_topic, qos, std::bind(&RosCompressedStreamer::imageCallback, this, std::placeholders::_1));
2338
}
2439

2540
void RosCompressedStreamer::restreamFrame(double max_age)

src/utils.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include "web_video_server/utils.h"
2+
3+
namespace web_video_server
4+
{
5+
6+
std::optional<rmw_qos_profile_t> get_qos_profile_from_name(const std::string name)
7+
{
8+
if (name == "default")
9+
{
10+
return rmw_qos_profile_default;
11+
}
12+
else if (name == "system_default")
13+
{
14+
return rmw_qos_profile_system_default;
15+
}
16+
else if (name == "sensor_data")
17+
{
18+
return rmw_qos_profile_sensor_data;
19+
}
20+
else
21+
{
22+
return std::nullopt;
23+
}
24+
}
25+
26+
} // namespace web_video_server

0 commit comments

Comments
 (0)