Skip to content

Commit 557fc07

Browse files
committed
Port the changes to ROS2
1 parent eec1542 commit 557fc07

File tree

9 files changed

+87
-12
lines changed

9 files changed

+87
-12
lines changed

CHANGELOG.rst

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ Changelog
55
[unreleased]
66
============
77
* [BUGFIX]: correctly align timestamps to the generated point cloud.
8-
* Added support to enable **loop** for pcap replay + other replay config.
9-
* Added a new launch file parameter ``pub_static_tf`` that allows users to turn off the braodcast
8+
* [BUGFIX]: NEAR_IR data is not populated with data for organized point clouds that have no range.
9+
* Add support to enable **loop** for pcap replay + other replay config.
10+
* Add a new launch file parameter ``pub_static_tf`` that allows users to turn off the braodcast
1011
of sensor TF transforms.
11-
* Introduced a new topic ``/ouster/telemetry`` that publishes ``ouster_ros::Telemetry`` messages,
12+
* Introduce a new topic ``/ouster/telemetry`` that publishes ``ouster_ros::Telemetry`` messages,
1213
the topic can be turned on/off by including the token ``TLM`` in the flag ``proc_mask`` launch arg.
13-
[BUGFIX]: NEAR_IR data is not populated with data for organized point clouds that have no range.
14+
* Add a new launch file parameter ``min_scan_valid_columns_ratio`` to allow users to set the minimum
15+
ratio of valid columns in a scan for it to be processed. Default value is ``0.0``.
1416

1517
ouster_ros v0.13.2
1618
==================

ouster-ros/config/driver_params.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,6 @@ ouster/os_driver:
115115
min_range: 0.0
116116
# max_range[optional]: maximum lidar range to consider (meters).
117117
max_range: 1000.0
118+
# min_scan_valid_columns_ratio[optional]: The minimum ratio of valid columns for
119+
# processing the LidarScan [0, 1]. default is 0%
120+
min_scan_valid_columns_ratio: 0.0

ouster-ros/launch/record.composite.launch.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,16 @@
7979
xyzir
8080
}"/>
8181

82+
<arg name="organized" default="true"
83+
description="generate an organzied point cloud"/>
84+
<arg name="destagger" default="true"
85+
description="enable or disable point cloud destaggering"/>
86+
87+
<arg name="min_range" default="0.0"
88+
description="minimum lidar range to consider (meters)"/>
89+
<arg name="max_range" default="100000.0"
90+
description="minimum lidar range to consider (meters)"/>
91+
8292
<arg name="azimuth_window_start" default="0" description="azimuth window start;
8393
values range [0, 360000] millidegrees"/>
8494
<arg name="azimuth_window_end" default="360000" description="azimuth window end;
@@ -99,6 +109,9 @@
99109
<arg name="auto_start" default="true"
100110
description="automatically configure and activate the node"/>
101111

112+
<arg name="min_scan_valid_columns_ratio" default="0.0"
113+
description="The minimum ratio of valid columns for processing the LidarScan [0, 1]"/>
114+
102115
<group>
103116
<push-ros-namespace namespace="$(var ouster_ns)"/>
104117
<node_container pkg="rclcpp_components" exec="component_container_mt" name="os_container" output="screen" namespace="">
@@ -136,6 +149,11 @@
136149
<param name="proc_mask" value="$(var proc_mask)"/>
137150
<param name="scan_ring" value="$(var scan_ring)"/>
138151
<param name="point_type" value="$(var point_type)"/>
152+
<param name="organized" value="$(var organized)"/>
153+
<param name="destagger" value="$(var destagger)"/>
154+
<param name="min_range" value="$(var min_range)"/>
155+
<param name="max_range" value="$(var max_range)"/>
156+
<param name="min_scan_valid_columns_ratio" value="$(var min_scan_valid_columns_ratio)"/>
139157
</composable_node>
140158
<composable_node pkg="ouster_ros" plugin="ouster_ros::OusterImage" name="os_image">
141159
<param name="use_system_default_qos" value="$(var use_system_default_qos)"/>

ouster-ros/launch/replay.composite.launch.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@
7676
<arg name="max_range" default="100000.0"
7777
description="minimum lidar range to consider (meters)"/>
7878

79+
<arg name="min_scan_valid_columns_ratio" default="0.0"
80+
description="The minimum ratio of valid columns for processing the LidarScan [0, 1]"/>
81+
7982
<group>
8083
<push-ros-namespace namespace="$(var ouster_ns)"/>
8184
<node if="$(var _use_metadata_file)" pkg="ouster_ros" exec="os_replay" name="os_replay" output="screen">
@@ -102,6 +105,7 @@
102105
<param name="destagger" value="$(var destagger)"/>
103106
<param name="min_range" value="$(var min_range)"/>
104107
<param name="max_range" value="$(var max_range)"/>
108+
<param name="min_scan_valid_columns_ratio" value="$(var min_scan_valid_columns_ratio)"/>
105109
</composable_node>
106110
<composable_node pkg="ouster_ros" plugin="ouster_ros::OusterImage" name="os_image">
107111
<remap from="/os_node/metadata" to="/ouster/metadata"/>

ouster-ros/launch/replay_pcap.launch.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@
7272
<arg name="max_range" default="10000.0"
7373
description="minimum lidar range to consider (meters)"/>
7474

75+
<arg name="min_scan_valid_columns_ratio" default="0.0"
76+
description="The minimum ratio of valid columns for processing the LidarScan [0, 1]"/>
77+
7578
<group>
7679
<push-ros-namespace namespace="$(var ouster_ns)"/>
7780
<node if="$(var _use_metadata_file)" pkg="ouster_ros" exec="os_pcap" name="os_pcap"
@@ -99,6 +102,7 @@
99102
<param name="destagger" value="$(var destagger)"/>
100103
<param name="min_range" value="$(var min_range)"/>
101104
<param name="max_range" value="$(var max_range)"/>
105+
<param name="min_scan_valid_columns_ratio" value="$(var min_scan_valid_columns_ratio)"/>
102106
</composable_node>
103107
<composable_node pkg="ouster_ros" plugin="ouster_ros::OusterImage" name="os_image">
104108
<param name="use_system_default_qos" value="$(var use_system_default_qos)"/>

ouster-ros/src/lidar_packet_handler.h

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,12 @@ class LidarPacketHandler {
6969
LidarPacketHandler(const sensor::sensor_info& info,
7070
const std::vector<LidarScanProcessor>& handlers,
7171
const std::string& timestamp_mode,
72-
int64_t ptp_utc_tai_offset)
72+
int64_t ptp_utc_tai_offset,
73+
float min_scan_valid_columns_ratio)
7374
: ring_buffer(LIDAR_SCAN_COUNT),
7475
lidar_scan_handlers{handlers},
75-
ptp_utc_tai_offset_(ptp_utc_tai_offset) {
76+
ptp_utc_tai_offset_(ptp_utc_tai_offset),
77+
min_scan_valid_columns_ratio_(min_scan_valid_columns_ratio) {
7678
// initialize lidar_scan processor and buffer
7779
scan_batcher = std::make_unique<ouster::ScanBatcher>(info);
7880

@@ -130,6 +132,19 @@ class LidarPacketHandler {
130132
*(mutexes[ring_buffer.write_head()]));
131133
auto& lidar_scan = *lidar_scans[ring_buffer.write_head()];
132134
result = lidar_handler(*this, pf, lidar_packet, lidar_scan);
135+
if (result) {
136+
// count the number of valid columns in the scan
137+
auto status = lidar_scan.status();
138+
size_t valid_cols = std::count_if(status.data(), status.data() + status.size(),
139+
[](const uint32_t s) { return (s & 0x01); });
140+
if (valid_cols < static_cast<size_t>(min_scan_valid_columns_ratio_ * status.size())) {
141+
RCLCPP_WARN_STREAM(rclcpp::get_logger(getName()), "number of valid columns per scan "
142+
<< valid_cols << "/" << status.size()
143+
<<" which is below the ratio " << std::setprecision(4) << (100 * min_scan_valid_columns_ratio_)
144+
<< "%, SKIPPING SCAN");
145+
result = false;
146+
}
147+
}
133148
}
134149
if (result) {
135150
ring_buffer.write();
@@ -159,9 +174,11 @@ class LidarPacketHandler {
159174
static HandlerType create(
160175
const sensor::sensor_info& info,
161176
const std::vector<LidarScanProcessor>& handlers,
162-
const std::string& timestamp_mode, int64_t ptp_utc_tai_offset) {
177+
const std::string& timestamp_mode, int64_t ptp_utc_tai_offset,
178+
float min_scan_valid_columns_ratio) {
163179
auto handler = std::make_shared<LidarPacketHandler>(
164-
info, handlers, timestamp_mode, ptp_utc_tai_offset);
180+
info, handlers, timestamp_mode, ptp_utc_tai_offset,
181+
min_scan_valid_columns_ratio);
165182
return [handler](const sensor::LidarPacket& lidar_packet) {
166183
if (handler->lidar_packet_accumlator(lidar_packet)) {
167184
handler->ring_buffer_has_elements.notify_one();
@@ -339,7 +356,7 @@ class LidarPacketHandler {
339356
private:
340357
std::unique_ptr<ouster::ScanBatcher> scan_batcher;
341358
const int LIDAR_SCAN_COUNT = 10;
342-
const double THROTTLE_PERCENT = 0.7;
359+
const float THROTTLE_PERCENT = 0.7f;
343360
LockFreeRingBuffer ring_buffer;
344361
std::mutex ring_buffer_mutex;
345362
std::vector<std::unique_ptr<ouster::LidarScan>> lidar_scans;
@@ -368,6 +385,8 @@ class LidarPacketHandler {
368385
std::condition_variable ring_buffer_has_elements;
369386

370387
int64_t ptp_utc_tai_offset_;
388+
389+
float min_scan_valid_columns_ratio_ = 0.0f;
371390
};
372391

373392
} // namespace ouster_ros

ouster-ros/src/os_cloud_node.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class OusterCloud : public OusterProcessingNodeBase {
6666
declare_parameter("min_range", 0.0);
6767
declare_parameter("max_range", 1000.0);
6868
declare_parameter("rows_step", 1);
69+
declare_parameter("min_scan_valid_columns_ratio", 0.0);
6970
}
7071

7172
void metadata_handler(
@@ -115,9 +116,16 @@ class OusterCloud : public OusterProcessingNodeBase {
115116
});
116117
}
117118

119+
auto min_scan_valid_columns_ratio = get_parameter("min_scan_valid_columns_ratio").as_double();
120+
if (min_scan_valid_columns_ratio < 0.0f || min_scan_valid_columns_ratio > 1.0f) {
121+
RCLCPP_FATAL(get_logger(), "min_scan_valid_columns_ratio needs to be in the range [0, 1]");
122+
throw std::runtime_error("min_scan_valid_columns_ratio out of bounds!");
123+
}
124+
118125
int num_returns = get_n_returns(info);
119126

120127
std::vector<LidarScanProcessor> processors;
128+
121129
if (impl::check_token(tokens, "PCL")) {
122130
lidar_pubs.resize(num_returns);
123131
for (int i = 0; i < num_returns; ++i) {
@@ -192,7 +200,8 @@ class OusterCloud : public OusterProcessingNodeBase {
192200
if (impl::check_token(tokens, "PCL") || impl::check_token(tokens, "SCAN")) {
193201
lidar_packet_handler = LidarPacketHandler::create(
194202
info, processors, timestamp_mode,
195-
static_cast<int64_t>(ptp_utc_tai_offset * 1e+9));
203+
static_cast<int64_t>(ptp_utc_tai_offset * 1e+9),
204+
min_scan_valid_columns_ratio);
196205
}
197206

198207
if (impl::check_token(tokens, "TLM")) {

ouster-ros/src/os_driver_node.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class OusterDriver : public OusterSensor {
4747
declare_parameter("min_range", 0.0);
4848
declare_parameter("max_range", 1000.0);
4949
declare_parameter("rows_step", 1);
50+
declare_parameter("min_scan_valid_columns_ratio", 0.0);
5051
}
5152

5253
~OusterDriver() override {
@@ -83,6 +84,12 @@ class OusterDriver : public OusterSensor {
8384
static_cast<int64_t>(ptp_utc_tai_offset * 1e+9));
8485
}
8586

87+
auto min_scan_valid_columns_ratio = get_parameter("min_scan_valid_columns_ratio").as_double();
88+
if (min_scan_valid_columns_ratio < 0.0f || min_scan_valid_columns_ratio > 1.0f) {
89+
RCLCPP_FATAL(get_logger(), "min_scan_valid_columns_ratio needs to be in the range [0, 1]");
90+
throw std::runtime_error("min_scan_valid_columns_ratio out of bounds!");
91+
}
92+
8693
int num_returns = get_n_returns(info);
8794

8895
std::vector<LidarScanProcessor> processors;
@@ -202,7 +209,8 @@ class OusterDriver : public OusterSensor {
202209
impl::check_token(tokens, "IMG"))
203210
lidar_packet_handler = LidarPacketHandler::create(
204211
info, processors, timestamp_mode,
205-
static_cast<int64_t>(ptp_utc_tai_offset * 1e+9));
212+
static_cast<int64_t>(ptp_utc_tai_offset * 1e+9),
213+
min_scan_valid_columns_ratio);
206214

207215
if (impl::check_token(tokens, "TLM")) {
208216
telemetry_pub =

ouster-ros/src/os_image_node.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class OusterImage : public OusterProcessingNodeBase {
4242
declare_parameter("timestamp_mode", "");
4343
declare_parameter("ptp_utc_tai_offset", -37.0);
4444
declare_parameter("use_system_default_qos", false);
45+
declare_parameter("min_scan_valid_columns_ratio", 0.0);
4546
create_metadata_subscriber(
4647
[this](const auto& msg) { metadata_handler(msg); });
4748
RCLCPP_INFO(get_logger(), "OusterImage: node initialized!");
@@ -94,6 +95,12 @@ class OusterImage : public OusterProcessingNodeBase {
9495
selected_qos);
9596
}
9697

98+
auto min_scan_valid_columns_ratio = get_parameter("min_scan_valid_columns_ratio").as_double();
99+
if (min_scan_valid_columns_ratio < 0.0f || min_scan_valid_columns_ratio > 1.0f) {
100+
RCLCPP_FATAL(get_logger(), "min_scan_valid_columns_ratio needs to be in the range [0, 1]");
101+
throw std::runtime_error("min_scan_valid_columns_ratio out of bounds!");
102+
}
103+
97104
std::vector<LidarScanProcessor> processors {
98105
ImageProcessor::create(
99106
info, "os_lidar", /*TODO: tf_bcast.point_cloud_frame_id()*/
@@ -106,7 +113,8 @@ class OusterImage : public OusterProcessingNodeBase {
106113

107114
lidar_packet_handler = LidarPacketHandler::create(
108115
info, processors, timestamp_mode,
109-
static_cast<int64_t>(ptp_utc_tai_offset * 1e+9));
116+
static_cast<int64_t>(ptp_utc_tai_offset * 1e+9),
117+
min_scan_valid_columns_ratio);
110118
lidar_packet_sub = create_subscription<PacketMsg>(
111119
"lidar_packets", selected_qos,
112120
[this](const PacketMsg::ConstSharedPtr msg) {

0 commit comments

Comments
 (0)