-
Notifications
You must be signed in to change notification settings - Fork 2k
Support Depth Mapping Streams #2757
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
5edd3d4
4429766
7ac48da
b9b32f9
872016b
8a1e5f9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -19,6 +19,8 @@ | |
| #include <rclcpp/clock.hpp> | ||
| #include <fstream> | ||
| #include <image_publisher.h> | ||
| #include <sensor_msgs/msg/point_cloud2.hpp> | ||
| #include <sensor_msgs/point_cloud2_iterator.hpp> | ||
|
|
||
| // Header files for disabling intra-process comms for static broadcaster. | ||
| #include <rclcpp/publisher_options.hpp> | ||
|
|
@@ -520,6 +522,11 @@ void BaseRealSenseNode::frame_callback(rs2::frame frame) | |
| if (f.is<rs2::video_frame>()) | ||
| ROS_DEBUG_STREAM("frame: " << f.as<rs2::video_frame>().get_width() << " x " << f.as<rs2::video_frame>().get_height()); | ||
|
|
||
| if (f.is<rs2::labeled_points>()) | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. better change this if statement to else if - do you agree?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
| { | ||
| publishLabeledPointCloud(frame.as<rs2::labeled_points>(), t, sip); | ||
| continue; | ||
| } | ||
| if (f.is<rs2::points>()) | ||
| { | ||
| publishPointCloud(f.as<rs2::points>(), t, frameset); | ||
|
|
@@ -580,6 +587,15 @@ void BaseRealSenseNode::frame_callback(rs2::frame frame) | |
| _info_publisher, | ||
| _image_publishers); | ||
| } | ||
| else if (frame.is<rs2::labeled_points>()) | ||
| { | ||
| auto stream_type = frame.get_profile().stream_type(); | ||
| auto stream_index = frame.get_profile().stream_index(); | ||
| stream_index_pair sip{stream_type,stream_index}; | ||
| ROS_DEBUG("Single labeled point cloud frame arrived (%s, %d). frame_number: %llu ; frame_TS: %f ; ros_TS(NSec): %lu", | ||
| rs2_stream_to_string(stream_type), stream_index, frame.get_frame_number(), frame_time, t.nanoseconds()); | ||
| publishLabeledPointCloud(frame.as<rs2::labeled_points>(), t, sip); | ||
| } | ||
| _synced_imu_publisher->Resume(); | ||
| } // frame_callback | ||
|
|
||
|
|
@@ -785,6 +801,55 @@ void BaseRealSenseNode::publishPointCloud(rs2::points pc, const rclcpp::Time& t, | |
| _pc_filter->Publish(pc, t, frameset, frame_id); | ||
| } | ||
|
|
||
| void BaseRealSenseNode::publishLabeledPointCloud(rs2::labeled_points pc, const rclcpp::Time& t, const stream_index_pair& stream) | ||
| { | ||
| auto& info_publisher = _info_publisher.at(stream); | ||
| if(0 == info_publisher->get_subscription_count() && 0 == _labeled_pointcloud_publisher->get_subscription_count()) | ||
| return; | ||
|
|
||
| auto mp = _get_label_to_color3f(); | ||
|
|
||
| // Create the PointCloud message | ||
| sensor_msgs::msg::PointCloud2::UniquePtr msg_pointcloud = std::make_unique<sensor_msgs::msg::PointCloud2>(); | ||
|
|
||
| // Define the fields of the PointCloud message | ||
| sensor_msgs::PointCloud2Modifier modifier(*msg_pointcloud); | ||
|
|
||
| modifier.setPointCloud2Fields(4, "x", 1, sensor_msgs::msg::PointField::FLOAT32, | ||
| "y", 1, sensor_msgs::msg::PointField::FLOAT32, | ||
| "z", 1, sensor_msgs::msg::PointField::FLOAT32, | ||
| "label", 1, sensor_msgs::msg::PointField::FLOAT32); | ||
| modifier.resize(pc.size()); | ||
|
|
||
| // Fill the PointCloud message with data | ||
| sensor_msgs::PointCloud2Iterator<float> iter_x(*msg_pointcloud, "x"); | ||
| sensor_msgs::PointCloud2Iterator<float> iter_y(*msg_pointcloud, "y"); | ||
| sensor_msgs::PointCloud2Iterator<float> iter_z(*msg_pointcloud, "z"); | ||
| sensor_msgs::PointCloud2Iterator<float> iter_color(*msg_pointcloud, "label"); | ||
| const rs2::vertex* vertex = pc.get_vertices(); | ||
| const uint8_t* label = pc.get_labels(); | ||
| msg_pointcloud->row_step = msg_pointcloud->width * msg_pointcloud->point_step; | ||
| msg_pointcloud->data.resize(msg_pointcloud->height * msg_pointcloud->row_step); | ||
|
|
||
| for (size_t point_idx=0; point_idx < pc.size(); point_idx++, vertex++, label++) | ||
| { | ||
| bool valid_pixel(vertex->z > 0); | ||
| if (valid_pixel) | ||
| { | ||
| *iter_x = vertex->x; | ||
| *iter_y = vertex->y; | ||
| *iter_z = vertex->z; | ||
| *iter_color = mp[static_cast<rs2_point_cloud_label>(*label)].x + 256.0*mp[static_cast<rs2_point_cloud_label>(*label)].y + 256.0*256.0*mp[static_cast<rs2_point_cloud_label>(*label)].z; | ||
| ++iter_x; ++iter_y; ++iter_z; ++iter_color; | ||
| } | ||
| } | ||
| msg_pointcloud->header.stamp = t; | ||
| msg_pointcloud->header.frame_id = "camera_link"; | ||
|
|
||
| // Publish the PointCloud message | ||
| _labeled_pointcloud_publisher->publish(std::move(msg_pointcloud)); | ||
| } | ||
|
|
||
|
|
||
| Extrinsics BaseRealSenseNode::rsExtrinsicsToMsg(const rs2_extrinsics& extrinsics) const | ||
| { | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -144,7 +144,8 @@ void BaseRealSenseNode::setAvailableSensors() | |
| if (sensor.is<rs2::depth_sensor>() || | ||
| sensor.is<rs2::color_sensor>() || | ||
| sensor.is<rs2::fisheye_sensor>() || | ||
| sensor.is<rs2::safety_sensor>()) | ||
| sensor.is<rs2::safety_sensor>() || | ||
| sensor.is<rs2::depth_mapping_sensor>()) | ||
| { | ||
| ROS_DEBUG_STREAM("Set " << module_name << " as VideoSensor."); | ||
| rosSensor = std::make_unique<RosSensor>(sensor, _parameters, frame_callback_function, update_sensor_func, hardware_reset_func, _diagnostics_updater, _logger, _use_intra_process, _dev.is<playback>()); | ||
|
|
@@ -215,7 +216,17 @@ void BaseRealSenseNode::startPublishers(const std::vector<stream_profile>& profi | |
| rmw_qos_profile_t qos = sensor.getQOS(sip); | ||
| rmw_qos_profile_t info_qos = sensor.getInfoQOS(sip); | ||
|
|
||
| if (profile.is<rs2::video_stream_profile>()) | ||
| // special handling for labeled point cloud stream | ||
| if (profile.is<rs2::video_stream_profile>() && profile.stream_type() == RS2_STREAM_LABELED_POINT_CLOUD) | ||
| { | ||
| std::stringstream camera_info(stream_name + "/camera_info"); | ||
| _labeled_pointcloud_publisher = _node.create_publisher<sensor_msgs::msg::PointCloud2>("labeled_point_cloud/points", | ||
| rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(qos),qos)); | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please explain what is QoS?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Quality Of Service. Each publisher should define quality of service, regarding its Durability, Reliability, Depth, History, Queue Size, etc.. Read both parts: |
||
| _info_publisher[sip] = _node.create_publisher<sensor_msgs::msg::CameraInfo>(camera_info.str(), | ||
| rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(info_qos), info_qos)); | ||
|
|
||
| } | ||
| else if (profile.is<rs2::video_stream_profile>()) | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since the video_stream_profile happens most of the time, it should be the first condition in the code.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Changed the flow. |
||
| { | ||
| std::stringstream image_raw, camera_info; | ||
| bool rectified_image = false; | ||
|
|
@@ -289,7 +300,8 @@ void BaseRealSenseNode::startPublishers(const std::vector<stream_profile>& profi | |
| _metadata_publishers[sip] = _node.create_publisher<realsense2_camera_msgs::msg::Metadata>(topic_metadata, | ||
| rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(info_qos), info_qos)); | ||
|
|
||
| if (!((rs2::stream_profile)profile==(rs2::stream_profile)_base_profile)) | ||
| if (!((rs2::stream_profile)profile==(rs2::stream_profile)_base_profile) && | ||
| profile.stream_type() != RS2_STREAM_LABELED_POINT_CLOUD) | ||
| { | ||
|
|
||
| // intra-process do not support latched QoS, so we need to disable intra-process for this topic | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you explain why you have a specific publisher for lpc and not for pc?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Because we can turn on both Depth point cloud and Labeled Point cloud at the same time
These are two different publishers