@@ -53,6 +53,7 @@ rplidar_node::rplidar_node(const rclcpp::NodeOptions & options)
53
53
flip_x_axis_ = this ->declare_parameter (" flip_x_axis" , false );
54
54
scan_mode_ = this ->declare_parameter (" scan_mode" , std::string ());
55
55
topic_name_ = this ->declare_parameter (" topic_name" , std::string (" scan" ));
56
+ auto_standby_ = this ->declare_parameter (" auto_standby" , false );
56
57
57
58
RCLCPP_INFO (
58
59
this ->get_logger (),
@@ -103,15 +104,9 @@ rplidar_node::rplidar_node(const rclcpp::NodeOptions & options)
103
104
return ;
104
105
}
105
106
106
- /* start motor */
107
- m_drv->startMotor ();
108
-
109
- if (!set_scan_mode ()) {
110
- /* set the scan mode */
111
- m_drv->stop ();
112
- m_drv->stopMotor ();
113
- RPlidarDriver::DisposeDriver (m_drv);
114
- exit (1 );
107
+ /* start motor and scanning */
108
+ if (!auto_standby_) {
109
+ this ->start ();
115
110
}
116
111
117
112
/* done setting up RPLIDAR stuff, now set up ROS 2 stuff */
@@ -247,24 +242,28 @@ bool rplidar_node::checkRPLIDARHealth() const
247
242
248
243
void rplidar_node::stop_motor (const EmptyRequest req, EmptyResponse res)
249
244
{
250
- if (nullptr == m_drv) {
245
+ if (auto_standby_) {
246
+ RCLCPP_INFO (
247
+ this ->get_logger (),
248
+ " Ingnoring stop_motor request because rplidar_node is in 'auto standby' mode" );
251
249
return ;
252
250
}
253
-
254
251
RCLCPP_DEBUG (this ->get_logger (), " Call to '%s'" , __FUNCTION__);
255
- m_drv-> stop ();
256
- m_drv-> stopMotor ();
252
+
253
+ this -> stop ();
257
254
}
258
255
259
256
void rplidar_node::start_motor (const EmptyRequest req, EmptyResponse res)
260
257
{
261
- if (nullptr == m_drv) {
258
+ if (auto_standby_) {
259
+ RCLCPP_INFO (
260
+ this ->get_logger (),
261
+ " Ingnoring start_motor request because rplidar_node is in 'auto standby' mode" );
262
262
return ;
263
263
}
264
-
265
264
RCLCPP_DEBUG (this ->get_logger (), " Call to '%s'" , __FUNCTION__);
266
- m_drv-> startMotor ();
267
- m_drv-> startScan ( 0 , 1 );
265
+
266
+ this -> start ( );
268
267
}
269
268
270
269
bool rplidar_node::set_scan_mode ()
@@ -332,6 +331,17 @@ void rplidar_node::publish_loop()
332
331
size_t count = 360 * 8 ;
333
332
auto nodes = std::make_unique<rplidar_response_measurement_node_hq_t []>(count);
334
333
334
+ if (auto_standby_) {
335
+ if (m_publisher->get_subscription_count () > 0 && !m_running) {
336
+ this ->start ();
337
+ } else if (m_publisher->get_subscription_count () == 0 ) {
338
+ if (m_running) {
339
+ this ->stop ();
340
+ }
341
+ return ;
342
+ }
343
+ }
344
+
335
345
start_scan_time = this ->now ();
336
346
op_result = m_drv->grabScanDataHq (nodes.get (), count);
337
347
end_scan_time = this ->now ();
@@ -394,6 +404,35 @@ void rplidar_node::publish_loop()
394
404
}
395
405
}
396
406
407
+ void rplidar_node::start ()
408
+ {
409
+ if (nullptr == m_drv) {
410
+ return ;
411
+ }
412
+
413
+ RCLCPP_INFO (this ->get_logger (), " Start" );
414
+ m_drv->startMotor ();
415
+ if (!set_scan_mode ()) {
416
+ this ->stop ();
417
+ RCLCPP_ERROR (this ->get_logger (), " Failed to set scan mode" );
418
+ RPlidarDriver::DisposeDriver (m_drv);
419
+ exit (1 );
420
+ }
421
+ m_running = true ;
422
+ }
423
+
424
+ void rplidar_node::stop ()
425
+ {
426
+ if (nullptr == m_drv) {
427
+ return ;
428
+ }
429
+
430
+ RCLCPP_INFO (this ->get_logger (), " Stop" );
431
+ m_drv->stop ();
432
+ m_drv->stopMotor ();
433
+ m_running = false ;
434
+ }
435
+
397
436
} // namespace rplidar_ros
398
437
399
438
#include " rclcpp_components/register_node_macro.hpp"
0 commit comments