38
38
#include < sys/stat.h>
39
39
#include < unistd.h>
40
40
41
- // #include <diagnostic_updater/diagnostic_updater.h >
41
+ #include < diagnostic_updater/diagnostic_updater.hpp >
42
42
#include < rclcpp/rclcpp.hpp>
43
43
#include < sensor_msgs/msg/joy.hpp>
44
44
#include < sensor_msgs/msg/joy_feedback_array.hpp>
@@ -65,45 +65,41 @@ class Joystick
65
65
int event_count_;
66
66
int pub_count_;
67
67
rclcpp::Publisher<sensor_msgs::msg::Joy>::SharedPtr pub_;
68
+ rclcpp::Node::SharedPtr node_;
68
69
double lastDiagTime_;
69
70
70
71
int ff_fd_;
71
72
struct ff_effect joy_effect_;
72
73
bool update_feedback_;
73
74
74
- // TODO(mikaelarguedas) commenting out diagnostic logic for now
75
-
76
- // diagnostic_updater::Updater diagnostic_;
77
-
78
- // ///\brief Publishes diagnostics and status
79
- // void diagnostics(diagnostic_updater::DiagnosticStatusWrapper& stat)
80
- // {
81
- // double now = ros::Time::now().toSec();
82
- // double interval = now - lastDiagTime_;
83
- // if (open_)
84
- // {
85
- // stat.summary(0, "OK");
86
- // }
87
- // else
88
- // {
89
- // stat.summary(2, "Joystick not open.");
90
- // }
91
-
92
- // stat.add("topic", pub_.getTopic());
93
- // stat.add("device", joy_dev_);
94
- // stat.add("device name", joy_dev_name_);
95
- // stat.add("dead zone", deadzone_);
96
- // stat.add("autorepeat rate (Hz)", autorepeat_rate_);
97
- // stat.add("coalesce interval (s)", coalesce_interval_);
98
- // stat.add("recent joystick event rate (Hz)", event_count_ / interval);
99
- // stat.add("recent publication rate (Hz)", pub_count_ / interval);
100
- // stat.add("subscribers", pub_.getNumSubscribers());
101
- // stat.add("default trig val", default_trig_val_);
102
- // stat.add("sticky buttons", sticky_buttons_);
103
- // event_count_ = 0;
104
- // pub_count_ = 0;
105
- // lastDiagTime_ = now;
106
- // }
75
+ std::shared_ptr<diagnostic_updater::Updater> diagnostic_;
76
+
77
+ // /\brief Publishes diagnostics and status
78
+ void diagnostics (diagnostic_updater::DiagnosticStatusWrapper & stat)
79
+ {
80
+ double now = node_->now ().seconds ();
81
+ double interval = now - lastDiagTime_;
82
+ if (open_) {
83
+ stat.summary (0 , " OK" );
84
+ } else {
85
+ stat.summary (2 , " Joystick not open." );
86
+ }
87
+
88
+ stat.add (" topic" , pub_->get_topic_name ());
89
+ stat.add (" device" , joy_dev_);
90
+ stat.add (" device name" , joy_dev_name_);
91
+ stat.add (" dead zone" , deadzone_);
92
+ stat.add (" autorepeat rate (Hz)" , autorepeat_rate_);
93
+ stat.add (" coalesce interval (s)" , coalesce_interval_);
94
+ stat.add (" recent joystick event rate (Hz)" , event_count_ / interval);
95
+ stat.add (" recent publication rate (Hz)" , pub_count_ / interval);
96
+ stat.add (" subscribers" , pub_->get_subscription_count ());
97
+ stat.add (" default trig val" , default_trig_val_);
98
+ stat.add (" sticky buttons" , sticky_buttons_);
99
+ event_count_ = 0 ;
100
+ pub_count_ = 0 ;
101
+ lastDiagTime_ = now;
102
+ }
107
103
108
104
/* ! \brief Returns the device path of the first joystick that matches joy_name.
109
105
* If no match is found, an empty string is returned.
@@ -192,57 +188,59 @@ class Joystick
192
188
}
193
189
}
194
190
195
- // / \brief Opens joystick port, reads from port and publishes while node is active
191
+ // / \brief Opens joystick port, reads from port and publishes while node_ is active
196
192
int main (int argc, char ** argv)
197
193
{
198
- // diagnostic_.add("Joystick Driver Status", this, &Joystick::diagnostics);
199
- // diagnostic_.setHardwareID("none");
200
194
(void )argc;
201
195
(void )argv;
202
196
203
- auto node = std::make_shared<rclcpp::Node>(" joy_node" );
197
+ node_ = std::make_shared<rclcpp::Node>(" joy_node" );
198
+
199
+ diagnostic_ = std::make_shared<diagnostic_updater::Updater>(node_);
200
+ diagnostic_->add (" Joystick Driver Status" , this , &Joystick::diagnostics);
201
+ diagnostic_->setHardwareID (" none" );
204
202
205
203
// Parameters
206
- pub_ = node ->create_publisher <sensor_msgs::msg::Joy>(" joy" , 10 );
204
+ pub_ = node_ ->create_publisher <sensor_msgs::msg::Joy>(" joy" , 10 );
207
205
rclcpp::Subscription<sensor_msgs::msg::JoyFeedbackArray>::SharedPtr sub_ =
208
- node ->create_subscription <sensor_msgs::msg::JoyFeedbackArray>(
206
+ node_ ->create_subscription <sensor_msgs::msg::JoyFeedbackArray>(
209
207
" joy/set_feedback" ,
210
208
rclcpp::QoS (10 ),
211
209
std::bind (&Joystick::set_feedback, this , std::placeholders::_1));
212
210
213
- joy_dev_ = node ->declare_parameter (" dev" , std::string (" /dev/input/js0" ));
214
- joy_dev_name_ = node ->declare_parameter (" dev_name" , std::string (" " ));
215
- joy_dev_ff_ = node ->declare_parameter (" dev_ff" , " /dev/input/event0" );
216
- deadzone_ = node ->declare_parameter (" deadzone" , 0.05 );
217
- autorepeat_rate_ = node ->declare_parameter (" autorepeat_rate" , 20.0 );
218
- coalesce_interval_ = node ->declare_parameter (" coalesce_interval" , 0.001 );
219
- default_trig_val_ = node ->declare_parameter (" default_trig_val" , false );
220
- sticky_buttons_ = node ->declare_parameter (" sticky_buttons" , false );
211
+ joy_dev_ = node_ ->declare_parameter (" dev" , std::string (" /dev/input/js0" ));
212
+ joy_dev_name_ = node_ ->declare_parameter (" dev_name" , std::string (" " ));
213
+ joy_dev_ff_ = node_ ->declare_parameter (" dev_ff" , " /dev/input/event0" );
214
+ deadzone_ = node_ ->declare_parameter (" deadzone" , 0.05 );
215
+ autorepeat_rate_ = node_ ->declare_parameter (" autorepeat_rate" , 20.0 );
216
+ coalesce_interval_ = node_ ->declare_parameter (" coalesce_interval" , 0.001 );
217
+ default_trig_val_ = node_ ->declare_parameter (" default_trig_val" , false );
218
+ sticky_buttons_ = node_ ->declare_parameter (" sticky_buttons" , false );
221
219
222
220
// Checks on parameters
223
221
if (!joy_dev_name_.empty ()) {
224
- std::string joy_dev_path = get_dev_by_joy_name (joy_dev_name_, node ->get_logger ());
222
+ std::string joy_dev_path = get_dev_by_joy_name (joy_dev_name_, node_ ->get_logger ());
225
223
if (joy_dev_path.empty ()) {
226
224
RCLCPP_ERROR (
227
- node ->get_logger (), " Couldn't find a joystick with name %s. "
225
+ node_ ->get_logger (), " Couldn't find a joystick with name %s. "
228
226
" Falling back to default device." ,
229
227
joy_dev_name_.c_str ());
230
228
} else {
231
- RCLCPP_INFO (node ->get_logger (), " Using %s as joystick device." , joy_dev_path.c_str ());
229
+ RCLCPP_INFO (node_ ->get_logger (), " Using %s as joystick device." , joy_dev_path.c_str ());
232
230
joy_dev_ = joy_dev_path;
233
231
}
234
232
}
235
233
236
234
if (autorepeat_rate_ > 1 / coalesce_interval_) {
237
235
RCLCPP_WARN (
238
- node ->get_logger (), " joy_linux_node: autorepeat_rate (%f Hz) > "
236
+ node_ ->get_logger (), " joy_linux_node: autorepeat_rate (%f Hz) > "
239
237
" 1/coalesce_interval (%f Hz) does not make sense. Timing behavior is not well defined." ,
240
238
autorepeat_rate_, 1 / coalesce_interval_);
241
239
}
242
240
243
241
if (deadzone_ >= 1 ) {
244
242
RCLCPP_WARN (
245
- node ->get_logger (), " joy_linux_node: deadzone greater than 1 was requested. "
243
+ node_ ->get_logger (), " joy_linux_node: deadzone greater than 1 was requested. "
246
244
" The semantics of deadzone have changed. It is now related to the range [-1:1] instead "
247
245
" of [-32767:32767]. For now I am dividing your deadzone by 32767, but this behavior is "
248
246
" deprecated so you need to update your launch file." );
@@ -251,27 +249,27 @@ class Joystick
251
249
252
250
if (deadzone_ > 0.9 ) {
253
251
RCLCPP_WARN (
254
- node ->get_logger (), " joy_node: deadzone (%f) greater than 0.9, setting it to 0.9" ,
252
+ node_ ->get_logger (), " joy_node: deadzone (%f) greater than 0.9, setting it to 0.9" ,
255
253
deadzone_);
256
254
deadzone_ = 0.9 ;
257
255
}
258
256
259
257
if (deadzone_ < 0 ) {
260
258
RCLCPP_WARN (
261
- node ->get_logger (), " joy_node: deadzone_ (%f) less than 0, setting to 0." , deadzone_);
259
+ node_ ->get_logger (), " joy_node: deadzone_ (%f) less than 0, setting to 0." , deadzone_);
262
260
deadzone_ = 0 ;
263
261
}
264
262
265
263
if (autorepeat_rate_ < 0 ) {
266
264
RCLCPP_WARN (
267
- node ->get_logger (), " joy_node: autorepeat_rate (%f) less than 0, setting to 0." ,
265
+ node_ ->get_logger (), " joy_node: autorepeat_rate (%f) less than 0, setting to 0." ,
268
266
autorepeat_rate_);
269
267
autorepeat_rate_ = 0 ;
270
268
}
271
269
272
270
if (coalesce_interval_ < 0 ) {
273
271
RCLCPP_WARN (
274
- node ->get_logger (), " joy_node: coalesce_interval (%f) less than 0, setting to 0." ,
272
+ node_ ->get_logger (), " joy_node: coalesce_interval (%f) less than 0, setting to 0." ,
275
273
coalesce_interval_);
276
274
coalesce_interval_ = 0 ;
277
275
}
@@ -288,12 +286,12 @@ class Joystick
288
286
289
287
event_count_ = 0 ;
290
288
pub_count_ = 0 ;
291
- lastDiagTime_ = node ->now ().seconds ();
289
+ lastDiagTime_ = node_ ->now ().seconds ();
292
290
293
291
// Big while loop opens, publishes
294
292
while (rclcpp::ok ()) {
295
293
open_ = false ;
296
- // diagnostic_. force_update();
294
+ diagnostic_-> force_update ();
297
295
bool first_fault = true ;
298
296
while (true ) {
299
297
// In the first iteration of this loop, first_fault is true so we just
@@ -310,7 +308,7 @@ class Joystick
310
308
} else {
311
309
timeout = std::chrono::milliseconds (1000 );
312
310
}
313
- rclcpp::spin_until_future_complete (node , dummy_future, timeout);
311
+ rclcpp::spin_until_future_complete (node_ , dummy_future, timeout);
314
312
if (!rclcpp::ok ()) {
315
313
goto cleanup;
316
314
}
@@ -330,11 +328,10 @@ class Joystick
330
328
}
331
329
if (first_fault) {
332
330
RCLCPP_ERROR (
333
- node ->get_logger (), " Couldn't open joystick %s. Will retry every second." ,
331
+ node_ ->get_logger (), " Couldn't open joystick %s. Will retry every second." ,
334
332
joy_dev_.c_str ());
335
333
first_fault = false ;
336
334
}
337
- // diagnostic_.update();
338
335
}
339
336
340
337
if (!joy_dev_ff_.empty ()) {
@@ -350,7 +347,7 @@ class Joystick
350
347
351
348
if (write (ff_fd_, &ie, sizeof (ie)) == -1 ) {
352
349
RCLCPP_ERROR (
353
- node ->get_logger (), " Couldn't open joystick force feedback: %s" , strerror (errno));
350
+ node_ ->get_logger (), " Couldn't open joystick force feedback: %s" , strerror (errno));
354
351
}
355
352
356
353
joy_effect_.id = -1 ;
@@ -367,9 +364,9 @@ class Joystick
367
364
}
368
365
369
366
RCLCPP_INFO (
370
- node ->get_logger (), " Opened joystick: %s. deadzone_: %f." , joy_dev_.c_str (), deadzone_);
367
+ node_ ->get_logger (), " Opened joystick: %s. deadzone_: %f." , joy_dev_.c_str (), deadzone_);
371
368
open_ = true ;
372
- // diagnostic_. force_update();
369
+ diagnostic_-> force_update ();
373
370
374
371
bool tv_set = false ;
375
372
bool publication_pending = false ;
@@ -382,7 +379,7 @@ class Joystick
382
379
joy_msg->header .frame_id = " joy" ;
383
380
384
381
while (rclcpp::ok ()) {
385
- rclcpp::spin_some (node );
382
+ rclcpp::spin_some (node_ );
386
383
387
384
bool publish_now = false ;
388
385
bool publish_soon = false ;
@@ -419,7 +416,7 @@ class Joystick
419
416
break ; // Joystick is probably closed. Definitely occurs.
420
417
}
421
418
422
- joy_msg->header .stamp = node ->now ();
419
+ joy_msg->header .stamp = node_ ->now ();
423
420
event_count_++;
424
421
switch (event.type ) {
425
422
case JS_EVENT_BUTTON:
@@ -487,21 +484,21 @@ class Joystick
487
484
}
488
485
default :
489
486
RCLCPP_WARN (
490
- node ->get_logger (), " joy_linux_node: Unknown event type. "
487
+ node_ ->get_logger (), " joy_linux_node: Unknown event type. "
491
488
" Please file a ticket. time=%u, value=%d, type=%Xh, number=%d" ,
492
489
event.time , event.value , event.type , event.number );
493
490
break ;
494
491
}
495
492
} else if (tv_set) { // Assume that the timer has expired.
496
- joy_msg->header .stamp = node ->now ();
493
+ joy_msg->header .stamp = node_ ->now ();
497
494
publish_now = true ;
498
495
}
499
496
500
497
if (publish_now) {
501
498
// Assume that all the JS_EVENT_INIT messages have arrived already.
502
499
// This should be the case as the kernel sends them along as soon as
503
500
// the device opens.
504
- joy_msg->header .stamp = node ->now ();
501
+ joy_msg->header .stamp = node_ ->now ();
505
502
pub_->publish (*joy_msg);
506
503
507
504
publish_now = false ;
@@ -531,21 +528,19 @@ class Joystick
531
528
tv.tv_sec = 1 ;
532
529
tv.tv_usec = 0 ;
533
530
}
534
-
535
- // diagnostic_.update();
536
531
} // End of joystick open loop.
537
532
538
533
close (ff_fd_);
539
534
close (joy_fd);
540
- rclcpp::spin_some (node );
535
+ rclcpp::spin_some (node_ );
541
536
if (rclcpp::ok ()) {
542
537
RCLCPP_ERROR (
543
- node ->get_logger (), " Connection to joystick device lost unexpectedly. Will reopen." );
538
+ node_ ->get_logger (), " Connection to joystick device lost unexpectedly. Will reopen." );
544
539
}
545
540
}
546
541
547
542
cleanup:
548
- RCLCPP_INFO (node ->get_logger (), " joy_node shut down." );
543
+ RCLCPP_INFO (node_ ->get_logger (), " joy_node shut down." );
549
544
550
545
return 0 ;
551
546
}
0 commit comments