19 #ifndef NODE_CANOPEN_402_DRIVER_IMPL_HPP_
20 #define NODE_CANOPEN_402_DRIVER_IMPL_HPP_
28 using namespace std::placeholders;
30 template <
class NODETYPE>
36 template <
class NODETYPE>
39 RCLCPP_ERROR(this->node_->get_logger(),
"Not init implemented.");
47 this->node_->create_publisher<sensor_msgs::msg::JointState>(
"~/joint_states", 1);
48 handle_init_service = this->node_->create_service<std_srvs::srv::Trigger>(
49 std::string(this->node_->get_name()).append(
"/init").c_str(),
52 std::placeholders::_2));
54 handle_halt_service = this->node_->create_service<std_srvs::srv::Trigger>(
55 std::string(this->node_->get_name()).append(
"/halt").c_str(),
58 std::placeholders::_2));
60 handle_recover_service = this->node_->create_service<std_srvs::srv::Trigger>(
61 std::string(this->node_->get_name()).append(
"/recover").c_str(),
64 std::placeholders::_2));
66 handle_set_mode_position_service = this->node_->create_service<std_srvs::srv::Trigger>(
67 std::string(this->node_->get_name()).append(
"/position_mode").c_str(),
70 std::placeholders::_2));
72 handle_set_mode_velocity_service = this->node_->create_service<std_srvs::srv::Trigger>(
73 std::string(this->node_->get_name()).append(
"/velocity_mode").c_str(),
76 std::placeholders::_2));
78 handle_set_mode_cyclic_velocity_service = this->node_->create_service<std_srvs::srv::Trigger>(
79 std::string(this->node_->get_name()).append(
"/cyclic_velocity_mode").c_str(),
82 std::placeholders::_1, std::placeholders::_2));
84 handle_set_mode_cyclic_position_service = this->node_->create_service<std_srvs::srv::Trigger>(
85 std::string(this->node_->get_name()).append(
"/cyclic_position_mode").c_str(),
88 std::placeholders::_1, std::placeholders::_2));
90 handle_set_mode_interpolated_position_service =
91 this->node_->create_service<std_srvs::srv::Trigger>(
92 std::string(this->node_->get_name()).append(
"/interpolated_position_mode").c_str(),
95 std::placeholders::_1, std::placeholders::_2));
97 handle_set_mode_torque_service = this->node_->create_service<std_srvs::srv::Trigger>(
98 std::string(this->node_->get_name()).append(
"/torque_mode").c_str(),
101 std::placeholders::_2));
103 handle_set_target_service = this->node_->create_service<canopen_interfaces::srv::COTargetDouble>(
104 std::string(this->node_->get_name()).append(
"/target").c_str(),
107 std::placeholders::_2));
114 publish_joint_state =
115 this->node_->create_publisher<sensor_msgs::msg::JointState>(
"~/joint_states", 10);
116 handle_init_service = this->node_->create_service<std_srvs::srv::Trigger>(
117 std::string(this->node_->get_name()).append(
"/init").c_str(),
120 std::placeholders::_1, std::placeholders::_2));
122 handle_halt_service = this->node_->create_service<std_srvs::srv::Trigger>(
123 std::string(this->node_->get_name()).append(
"/halt").c_str(),
126 std::placeholders::_1, std::placeholders::_2));
128 handle_recover_service = this->node_->create_service<std_srvs::srv::Trigger>(
129 std::string(this->node_->get_name()).append(
"/recover").c_str(),
132 std::placeholders::_1, std::placeholders::_2));
134 handle_set_mode_position_service = this->node_->create_service<std_srvs::srv::Trigger>(
135 std::string(this->node_->get_name()).append(
"/position_mode").c_str(),
138 std::placeholders::_1, std::placeholders::_2));
140 handle_set_mode_velocity_service = this->node_->create_service<std_srvs::srv::Trigger>(
141 std::string(this->node_->get_name()).append(
"/velocity_mode").c_str(),
144 std::placeholders::_1, std::placeholders::_2));
146 handle_set_mode_cyclic_velocity_service = this->node_->create_service<std_srvs::srv::Trigger>(
147 std::string(this->node_->get_name()).append(
"/cyclic_velocity_mode").c_str(),
150 std::placeholders::_1, std::placeholders::_2));
152 handle_set_mode_cyclic_position_service = this->node_->create_service<std_srvs::srv::Trigger>(
153 std::string(this->node_->get_name()).append(
"/cyclic_position_mode").c_str(),
156 std::placeholders::_1, std::placeholders::_2));
158 handle_set_mode_interpolated_position_service = this->node_->create_service<
159 std_srvs::srv::Trigger>(
160 std::string(this->node_->get_name()).append(
"/interpolated_position_mode").c_str(),
163 this, std::placeholders::_1, std::placeholders::_2));
165 handle_set_mode_torque_service = this->node_->create_service<std_srvs::srv::Trigger>(
166 std::string(this->node_->get_name()).append(
"/torque_mode").c_str(),
169 std::placeholders::_1, std::placeholders::_2));
171 handle_set_target_service = this->node_->create_service<canopen_interfaces::srv::COTargetDouble>(
172 std::string(this->node_->get_name()).append(
"/target").c_str(),
175 std::placeholders::_1, std::placeholders::_2));
182 std::optional<double> scale_pos_to_dev;
183 std::optional<double> scale_pos_from_dev;
184 std::optional<double> scale_vel_to_dev;
185 std::optional<double> scale_vel_from_dev;
186 std::optional<int> switching_state;
189 scale_pos_to_dev = std::optional(this->config_[
"scale_pos_to_dev"].as<double>());
196 scale_pos_from_dev = std::optional(this->config_[
"scale_pos_from_dev"].as<double>());
203 scale_vel_to_dev = std::optional(this->config_[
"scale_vel_to_dev"].as<double>());
210 scale_vel_from_dev = std::optional(this->config_[
"scale_vel_from_dev"].as<double>());
217 switching_state = std::optional(this->config_[
"switching_state"].as<int>());
225 scale_pos_to_dev_ = scale_pos_to_dev.value_or(1000.0);
226 scale_pos_from_dev_ = scale_pos_from_dev.value_or(0.001);
227 scale_vel_to_dev_ = scale_vel_to_dev.value_or(1000.0);
228 scale_vel_from_dev_ = scale_vel_from_dev.value_or(0.001);
230 (
int)ros2_canopen::State402::InternalState::Operation_Enable);
232 this->node_->get_logger(),
233 "scale_pos_to_dev_ %f\nscale_pos_from_dev_ %f\nscale_vel_to_dev_ %f\nscale_vel_from_dev_ %f\n",
234 scale_pos_to_dev_, scale_pos_from_dev_, scale_vel_to_dev_, scale_vel_from_dev_);
241 std::optional<double> scale_pos_to_dev;
242 std::optional<double> scale_pos_from_dev;
243 std::optional<double> scale_vel_to_dev;
244 std::optional<double> scale_vel_from_dev;
245 std::optional<int> switching_state;
248 scale_pos_to_dev = std::optional(this->config_[
"scale_pos_to_dev"].as<double>());
255 scale_pos_from_dev = std::optional(this->config_[
"scale_pos_from_dev"].as<double>());
262 scale_vel_to_dev = std::optional(this->config_[
"scale_vel_to_dev"].as<double>());
269 scale_vel_from_dev = std::optional(this->config_[
"scale_vel_from_dev"].as<double>());
276 switching_state = std::optional(this->config_[
"switching_state"].as<int>());
284 scale_pos_to_dev_ = scale_pos_to_dev.value_or(1000.0);
285 scale_pos_from_dev_ = scale_pos_from_dev.value_or(0.001);
286 scale_vel_to_dev_ = scale_vel_to_dev.value_or(1000.0);
287 scale_vel_from_dev_ = scale_vel_from_dev.value_or(0.001);
289 (
int)ros2_canopen::State402::InternalState::Operation_Enable);
291 this->node_->get_logger(),
292 "scale_pos_to_dev_ %f\nscale_pos_from_dev_ %f\nscale_vel_to_dev_ %f\nscale_vel_from_dev_ %f\n",
293 scale_pos_to_dev_, scale_pos_from_dev_, scale_vel_to_dev_, scale_vel_from_dev_);
296 template <
class NODETYPE>
300 motor_->registerDefaultModes();
301 motor_->set_diagnostic_status_msgs(this->diagnostic_collector_, this->diagnostic_enabled_);
304 template <
class NODETYPE>
311 template <
class NODETYPE>
315 motor_->handleRead();
316 motor_->handleWrite();
320 template <
class NODETYPE>
323 sensor_msgs::msg::JointState js_msg;
324 js_msg.name.push_back(this->node_->get_name());
325 js_msg.position.push_back(motor_->get_position() * scale_pos_from_dev_);
326 js_msg.velocity.push_back(motor_->get_speed() * scale_vel_from_dev_);
327 js_msg.effort.push_back(0.0);
328 publish_joint_state->publish(js_msg);
331 template <
class NODETYPE>
335 motor_ = std::make_shared<Motor402>(this->lely_driver_, switching_state_);
338 template <
class NODETYPE>
340 const std_srvs::srv::Trigger::Request::SharedPtr request,
341 std_srvs::srv::Trigger::Response::SharedPtr response)
343 if (this->activated_.load())
345 bool temp = motor_->handleInit();
346 response->success = temp;
349 template <
class NODETYPE>
351 const std_srvs::srv::Trigger::Request::SharedPtr request,
352 std_srvs::srv::Trigger::Response::SharedPtr response)
354 if (this->activated_.load())
356 response->success = motor_->handleRecover();
359 template <
class NODETYPE>
361 const std_srvs::srv::Trigger::Request::SharedPtr request,
362 std_srvs::srv::Trigger::Response::SharedPtr response)
364 if (this->activated_.load())
366 response->success = motor_->handleHalt();
369 template <
class NODETYPE>
371 const std_srvs::srv::Trigger::Request::SharedPtr request,
372 std_srvs::srv::Trigger::Response::SharedPtr response)
374 response->success = set_mode_position();
377 template <
class NODETYPE>
379 const std_srvs::srv::Trigger::Request::SharedPtr request,
380 std_srvs::srv::Trigger::Response::SharedPtr response)
382 response->success = set_mode_velocity();
385 template <
class NODETYPE>
387 const std_srvs::srv::Trigger::Request::SharedPtr request,
388 std_srvs::srv::Trigger::Response::SharedPtr response)
390 response->success = set_mode_cyclic_position();
393 template <
class NODETYPE>
395 const std_srvs::srv::Trigger::Request::SharedPtr request,
396 std_srvs::srv::Trigger::Response::SharedPtr response)
398 response->success = set_mode_interpolated_position();
401 template <
class NODETYPE>
403 const std_srvs::srv::Trigger::Request::SharedPtr request,
404 std_srvs::srv::Trigger::Response::SharedPtr response)
406 response->success = set_mode_cyclic_velocity();
408 template <
class NODETYPE>
410 const std_srvs::srv::Trigger::Request::SharedPtr request,
411 std_srvs::srv::Trigger::Response::SharedPtr response)
413 response->success = set_mode_torque();
416 template <
class NODETYPE>
418 const canopen_interfaces::srv::COTargetDouble::Request::SharedPtr request,
419 canopen_interfaces::srv::COTargetDouble::Response::SharedPtr response)
421 if (this->activated_.load())
423 auto mode = motor_->getMode();
429 target = request->target * scale_pos_to_dev_;
435 target = request->target * scale_vel_to_dev_;
439 target = request->target;
442 response->success = motor_->setTarget(target);
446 template <
class NODETYPE>
449 if (this->activated_.load())
451 bool temp = motor_->handleInit();
456 RCLCPP_INFO(this->node_->get_logger(),
"Initialisation failed.");
461 template <
class NODETYPE>
464 if (this->activated_.load())
466 return motor_->handleRecover();
474 template <
class NODETYPE>
477 if (this->activated_.load())
479 return motor_->handleHalt();
487 template <
class NODETYPE>
490 if (this->activated_.load())
492 return motor_->enterModeAndWait(mode);
497 template <
class NODETYPE>
500 if (this->activated_.load())
517 template <
class NODETYPE>
520 if (this->activated_.load())
537 template <
class NODETYPE>
540 if (this->activated_.load())
557 template <
class NODETYPE>
560 if (this->activated_.load())
577 template <
class NODETYPE>
580 if (this->activated_.load())
597 template <
class NODETYPE>
600 if (this->activated_.load())
617 template <
class NODETYPE>
620 if (this->activated_.load())
622 auto mode = motor_->getMode();
623 double scaled_target;
628 scaled_target = target * scale_pos_to_dev_;
634 scaled_target = target * scale_vel_to_dev_;
638 scaled_target = target;
641 return motor_->setTarget(scaled_target);
649 template <
class NODETYPE>
651 diagnostic_updater::DiagnosticStatusWrapper & stat)
653 this->motor_->handleDiag();
655 stat.summary(this->diagnostic_collector_->getLevel(), this->diagnostic_collector_->getMessage());
656 stat.add(
"device_state", this->diagnostic_collector_->getValue(
"DEVICE"));
657 stat.add(
"nmt_state", this->diagnostic_collector_->getValue(
"NMT"));
658 stat.add(
"emcy_state", this->diagnostic_collector_->getValue(
"EMCY"));
659 stat.add(
"cia402_mode", this->diagnostic_collector_->getValue(
"cia402_mode"));
660 stat.add(
"cia402_state", this->diagnostic_collector_->getValue(
"cia402_state"));
@ Profiled_Velocity
Definition: base.hpp:42
@ Cyclic_Synchronous_Velocity
Definition: base.hpp:48
@ Cyclic_Synchronous_Position
Definition: base.hpp:47
@ Profiled_Position
Definition: base.hpp:40
@ Profiled_Torque
Definition: base.hpp:43
@ Interpolated_Position
Definition: base.hpp:46
@ Velocity
Definition: base.hpp:41
InternalState
Definition: state.hpp:50
Definition: node_canopen_402_driver.hpp:35
void handle_set_mode_cyclic_velocity(const std_srvs::srv::Trigger::Request::SharedPtr request, std_srvs::srv::Trigger::Response::SharedPtr response)
Service Callback to set cyclic velocity mode.
Definition: node_canopen_402_driver_impl.hpp:402
void handle_halt(const std_srvs::srv::Trigger::Request::SharedPtr request, std_srvs::srv::Trigger::Response::SharedPtr response)
Service Callback to halt device.
Definition: node_canopen_402_driver_impl.hpp:360
void handle_init(const std_srvs::srv::Trigger::Request::SharedPtr request, std_srvs::srv::Trigger::Response::SharedPtr response)
Service Callback to initialise device.
Definition: node_canopen_402_driver_impl.hpp:339
bool set_target(double target)
Method to set target.
Definition: node_canopen_402_driver_impl.hpp:618
bool set_mode_velocity()
Method to set profiled velocity mode.
Definition: node_canopen_402_driver_impl.hpp:538
bool set_mode_torque()
Method to set profiled torque mode.
Definition: node_canopen_402_driver_impl.hpp:598
void handle_set_target(const canopen_interfaces::srv::COTargetDouble::Request::SharedPtr request, canopen_interfaces::srv::COTargetDouble::Response::SharedPtr response)
Service Callback to set target.
Definition: node_canopen_402_driver_impl.hpp:417
void handle_set_mode_velocity(const std_srvs::srv::Trigger::Request::SharedPtr request, std_srvs::srv::Trigger::Response::SharedPtr response)
Service Callback to set profiled velocity mode.
Definition: node_canopen_402_driver_impl.hpp:378
void handle_set_mode_interpolated_position(const std_srvs::srv::Trigger::Request::SharedPtr request, std_srvs::srv::Trigger::Response::SharedPtr response)
Service Callback to set interpolated position mode.
Definition: node_canopen_402_driver_impl.hpp:394
void handle_set_mode_torque(const std_srvs::srv::Trigger::Request::SharedPtr request, std_srvs::srv::Trigger::Response::SharedPtr response)
Service Callback to set profiled torque mode.
Definition: node_canopen_402_driver_impl.hpp:409
void handle_set_mode_cyclic_position(const std_srvs::srv::Trigger::Request::SharedPtr request, std_srvs::srv::Trigger::Response::SharedPtr response)
Service Callback to set cyclic position mode.
Definition: node_canopen_402_driver_impl.hpp:386
virtual void poll_timer_callback() override
Definition: node_canopen_402_driver_impl.hpp:312
bool set_mode_interpolated_position()
Method to set interpolated position mode.
Definition: node_canopen_402_driver_impl.hpp:518
void handle_set_mode_position(const std_srvs::srv::Trigger::Request::SharedPtr request, std_srvs::srv::Trigger::Response::SharedPtr response)
Service Callback to set profiled position mode.
Definition: node_canopen_402_driver_impl.hpp:370
void handle_recover(const std_srvs::srv::Trigger::Request::SharedPtr request, std_srvs::srv::Trigger::Response::SharedPtr response)
Service Callback to recover device.
Definition: node_canopen_402_driver_impl.hpp:350
void diagnostic_callback(diagnostic_updater::DiagnosticStatusWrapper &stat) override
Definition: node_canopen_402_driver_impl.hpp:650
bool halt_motor()
Method to halt device.
Definition: node_canopen_402_driver_impl.hpp:475
bool set_mode_position()
Method to set profiled position mode.
Definition: node_canopen_402_driver_impl.hpp:498
bool init_motor()
Method to initialise device.
Definition: node_canopen_402_driver_impl.hpp:447
bool recover_motor()
Method to recover device.
Definition: node_canopen_402_driver_impl.hpp:462
NodeCanopen402Driver(NODETYPE *node)
Definition: node_canopen_402_driver_impl.hpp:31
void publish()
Definition: node_canopen_402_driver_impl.hpp:321
bool set_operation_mode(uint16_t mode)
Definition: node_canopen_402_driver_impl.hpp:488
bool set_mode_cyclic_velocity()
Method to set cyclic velocity mode.
Definition: node_canopen_402_driver_impl.hpp:578
bool set_mode_cyclic_position()
Method to set cyclic position mode.
Definition: node_canopen_402_driver_impl.hpp:558
virtual void add_to_master() override
Add the driver to master.
Definition: node_canopen_402_driver_impl.hpp:332
virtual void add_to_master()
Add the driver to master.
Definition: node_canopen_base_driver_impl.hpp:245
virtual void poll_timer_callback()
Definition: node_canopen_base_driver_impl.hpp:403
void deactivate()
Deactivate the driver.
Definition: node_canopen_driver.hpp:265
void activate()
Activate the driver.
Definition: node_canopen_driver.hpp:223
void init()
Initialise the driver.
Definition: node_canopen_driver.hpp:127
void configure()
Configure the driver.
Definition: node_canopen_driver.hpp:175
Definition: node_canopen_proxy_driver.hpp:26
Definition: node_canopen_driver.hpp:46
Definition: configuration_manager.hpp:28