1 #ifndef NODE_CANOPEN_402_DRIVER_IMPL_HPP_
2 #define NODE_CANOPEN_402_DRIVER_IMPL_HPP_
10 using namespace std::placeholders;
12 template <
class NODETYPE>
18 template <
class NODETYPE>
21 RCLCPP_ERROR(this->node_->get_logger(),
"Not init implemented.");
29 this->node_->create_publisher<sensor_msgs::msg::JointState>(
"~/joint_states", 1);
30 handle_init_service = this->node_->create_service<std_srvs::srv::Trigger>(
31 std::string(this->node_->get_name()).append(
"/init").c_str(),
34 handle_halt_service = this->node_->create_service<std_srvs::srv::Trigger>(
35 std::string(this->node_->get_name()).append(
"/halt").c_str(),
38 handle_recover_service = this->node_->create_service<std_srvs::srv::Trigger>(
39 std::string(this->node_->get_name()).append(
"/recover").c_str(),
42 handle_set_mode_position_service = this->node_->create_service<std_srvs::srv::Trigger>(
43 std::string(this->node_->get_name()).append(
"/position_mode").c_str(),
46 handle_set_mode_velocity_service = this->node_->create_service<std_srvs::srv::Trigger>(
47 std::string(this->node_->get_name()).append(
"/velocity_mode").c_str(),
50 handle_set_mode_cyclic_velocity_service = this->node_->create_service<std_srvs::srv::Trigger>(
51 std::string(this->node_->get_name()).append(
"/cyclic_velocity_mode").c_str(),
54 handle_set_mode_cyclic_position_service = this->node_->create_service<std_srvs::srv::Trigger>(
55 std::string(this->node_->get_name()).append(
"/cyclic_position_mode").c_str(),
58 handle_set_mode_interpolated_position_service =
59 this->node_->create_service<std_srvs::srv::Trigger>(
60 std::string(this->node_->get_name()).append(
"/interpolated_position_mode").c_str(),
64 handle_set_mode_torque_service = this->node_->create_service<std_srvs::srv::Trigger>(
65 std::string(this->node_->get_name()).append(
"/torque_mode").c_str(),
68 handle_set_target_service = this->node_->create_service<canopen_interfaces::srv::COTargetDouble>(
69 std::string(this->node_->get_name()).append(
"/target").c_str(),
78 this->node_->create_publisher<sensor_msgs::msg::JointState>(
"~/joint_states", 10);
79 handle_init_service = this->node_->create_service<std_srvs::srv::Trigger>(
80 std::string(this->node_->get_name()).append(
"/init").c_str(),
83 handle_halt_service = this->node_->create_service<std_srvs::srv::Trigger>(
84 std::string(this->node_->get_name()).append(
"/halt").c_str(),
87 handle_recover_service = this->node_->create_service<std_srvs::srv::Trigger>(
88 std::string(this->node_->get_name()).append(
"/recover").c_str(),
92 handle_set_mode_position_service = this->node_->create_service<std_srvs::srv::Trigger>(
93 std::string(this->node_->get_name()).append(
"/position_mode").c_str(),
98 handle_set_mode_velocity_service = this->node_->create_service<std_srvs::srv::Trigger>(
99 std::string(this->node_->get_name()).append(
"/velocity_mode").c_str(),
104 handle_set_mode_cyclic_velocity_service = this->node_->create_service<std_srvs::srv::Trigger>(
105 std::string(this->node_->get_name()).append(
"/cyclic_velocity_mode").c_str(),
110 handle_set_mode_cyclic_position_service = this->node_->create_service<std_srvs::srv::Trigger>(
111 std::string(this->node_->get_name()).append(
"/cyclic_position_mode").c_str(),
116 handle_set_mode_interpolated_position_service = this->node_->create_service<
117 std_srvs::srv::Trigger>(
118 std::string(this->node_->get_name()).append(
"/interpolated_position_mode").c_str(),
123 handle_set_mode_torque_service = this->node_->create_service<std_srvs::srv::Trigger>(
124 std::string(this->node_->get_name()).append(
"/torque_mode").c_str(),
129 handle_set_target_service = this->node_->create_service<canopen_interfaces::srv::COTargetDouble>(
130 std::string(this->node_->get_name()).append(
"/target").c_str(),
139 std::optional<double> scale_pos_to_dev;
140 std::optional<double> scale_pos_from_dev;
141 std::optional<double> scale_vel_to_dev;
142 std::optional<double> scale_vel_from_dev;
143 std::optional<int> switching_state;
146 scale_pos_to_dev = std::optional(this->config_[
"scale_pos_to_dev"].as<double>());
153 scale_pos_from_dev = std::optional(this->config_[
"scale_pos_from_dev"].as<double>());
160 scale_vel_to_dev = std::optional(this->config_[
"scale_vel_to_dev"].as<double>());
167 scale_vel_from_dev = std::optional(this->config_[
"scale_vel_from_dev"].as<double>());
174 switching_state = std::optional(this->config_[
"switching_state"].as<int>());
182 scale_pos_to_dev_ = scale_pos_to_dev.value_or(1000.0);
183 scale_pos_from_dev_ = scale_pos_from_dev.value_or(0.001);
184 scale_vel_to_dev_ = scale_vel_to_dev.value_or(1000.0);
185 scale_vel_from_dev_ = scale_vel_from_dev.value_or(0.001);
187 (
int)ros2_canopen::State402::InternalState::Operation_Enable);
189 this->node_->get_logger(),
190 "scale_pos_to_dev_ %f\nscale_pos_from_dev_ %f\nscale_vel_to_dev_ %f\nscale_vel_from_dev_ %f\n",
191 scale_pos_to_dev_, scale_pos_from_dev_, scale_vel_to_dev_, scale_vel_from_dev_);
198 std::optional<double> scale_pos_to_dev;
199 std::optional<double> scale_pos_from_dev;
200 std::optional<double> scale_vel_to_dev;
201 std::optional<double> scale_vel_from_dev;
202 std::optional<int> switching_state;
205 scale_pos_to_dev = std::optional(this->config_[
"scale_pos_to_dev"].as<double>());
212 scale_pos_from_dev = std::optional(this->config_[
"scale_pos_from_dev"].as<double>());
219 scale_vel_to_dev = std::optional(this->config_[
"scale_vel_to_dev"].as<double>());
226 scale_vel_from_dev = std::optional(this->config_[
"scale_vel_from_dev"].as<double>());
233 switching_state = std::optional(this->config_[
"switching_state"].as<int>());
241 scale_pos_to_dev_ = scale_pos_to_dev.value_or(1000.0);
242 scale_pos_from_dev_ = scale_pos_from_dev.value_or(0.001);
243 scale_vel_to_dev_ = scale_vel_to_dev.value_or(1000.0);
244 scale_vel_from_dev_ = scale_vel_from_dev.value_or(0.001);
246 (
int)ros2_canopen::State402::InternalState::Operation_Enable);
248 this->node_->get_logger(),
249 "scale_pos_to_dev_ %f\nscale_pos_from_dev_ %f\nscale_vel_to_dev_ %f\nscale_vel_from_dev_ %f\n",
250 scale_pos_to_dev_, scale_pos_from_dev_, scale_vel_to_dev_, scale_vel_from_dev_);
253 template <
class NODETYPE>
257 motor_->registerDefaultModes();
260 template <
class NODETYPE>
267 template <
class NODETYPE>
271 motor_->handleRead();
272 motor_->handleWrite();
276 template <
class NODETYPE>
279 sensor_msgs::msg::JointState js_msg;
280 js_msg.name.push_back(this->node_->get_name());
281 js_msg.position.push_back(motor_->get_position() * scale_pos_from_dev_);
282 js_msg.velocity.push_back(motor_->get_speed() * scale_vel_from_dev_);
283 js_msg.effort.push_back(0.0);
284 publish_joint_state->publish(js_msg);
287 template <
class NODETYPE>
291 motor_ = std::make_shared<Motor402>(this->lely_driver_, switching_state_);
294 template <
class NODETYPE>
296 const std_srvs::srv::Trigger::Request::SharedPtr request,
297 std_srvs::srv::Trigger::Response::SharedPtr response)
299 if (this->activated_.load())
301 bool temp = motor_->handleInit();
302 response->success = temp;
305 template <
class NODETYPE>
307 const std_srvs::srv::Trigger::Request::SharedPtr request,
308 std_srvs::srv::Trigger::Response::SharedPtr response)
310 if (this->activated_.load())
312 response->success = motor_->handleRecover();
315 template <
class NODETYPE>
317 const std_srvs::srv::Trigger::Request::SharedPtr request,
318 std_srvs::srv::Trigger::Response::SharedPtr response)
320 if (this->activated_.load())
322 response->success = motor_->handleHalt();
325 template <
class NODETYPE>
327 const std_srvs::srv::Trigger::Request::SharedPtr request,
328 std_srvs::srv::Trigger::Response::SharedPtr response)
330 response->success = set_mode_position();
333 template <
class NODETYPE>
335 const std_srvs::srv::Trigger::Request::SharedPtr request,
336 std_srvs::srv::Trigger::Response::SharedPtr response)
338 response->success = set_mode_velocity();
341 template <
class NODETYPE>
343 const std_srvs::srv::Trigger::Request::SharedPtr request,
344 std_srvs::srv::Trigger::Response::SharedPtr response)
346 response->success = set_mode_cyclic_position();
349 template <
class NODETYPE>
351 const std_srvs::srv::Trigger::Request::SharedPtr request,
352 std_srvs::srv::Trigger::Response::SharedPtr response)
354 response->success = set_mode_interpolated_position();
357 template <
class NODETYPE>
359 const std_srvs::srv::Trigger::Request::SharedPtr request,
360 std_srvs::srv::Trigger::Response::SharedPtr response)
362 response->success = set_mode_cyclic_velocity();
364 template <
class NODETYPE>
366 const std_srvs::srv::Trigger::Request::SharedPtr request,
367 std_srvs::srv::Trigger::Response::SharedPtr response)
369 response->success = set_mode_torque();
372 template <
class NODETYPE>
374 const canopen_interfaces::srv::COTargetDouble::Request::SharedPtr request,
375 canopen_interfaces::srv::COTargetDouble::Response::SharedPtr response)
377 if (this->activated_.load())
379 auto mode = motor_->getMode();
385 target = request->target * scale_pos_to_dev_;
391 target = request->target * scale_vel_to_dev_;
395 target = request->target;
398 response->success = motor_->setTarget(target);
402 template <
class NODETYPE>
405 if (this->activated_.load())
407 bool temp = motor_->handleInit();
412 RCLCPP_INFO(this->node_->get_logger(),
"Initialisation failed.");
417 template <
class NODETYPE>
420 if (this->activated_.load())
422 return motor_->handleRecover();
430 template <
class NODETYPE>
433 if (this->activated_.load())
435 return motor_->handleHalt();
443 template <
class NODETYPE>
446 if (this->activated_.load())
448 return motor_->enterModeAndWait(mode);
453 template <
class NODETYPE>
456 if (this->activated_.load())
473 template <
class NODETYPE>
476 if (this->activated_.load())
493 template <
class NODETYPE>
496 if (this->activated_.load())
513 template <
class NODETYPE>
516 if (this->activated_.load())
533 template <
class NODETYPE>
536 if (this->activated_.load())
553 template <
class NODETYPE>
556 if (this->activated_.load())
573 template <
class NODETYPE>
576 if (this->activated_.load())
578 auto mode = motor_->getMode();
579 double scaled_target;
584 scaled_target = target * scale_pos_to_dev_;
590 scaled_target = target * scale_vel_to_dev_;
594 scaled_target = target;
597 return motor_->setTarget(scaled_target);
@ Profiled_Velocity
Definition: base.hpp:26
@ Cyclic_Synchronous_Velocity
Definition: base.hpp:32
@ Cyclic_Synchronous_Position
Definition: base.hpp:31
@ Profiled_Position
Definition: base.hpp:24
@ Profiled_Torque
Definition: base.hpp:27
@ Interpolated_Position
Definition: base.hpp:30
@ Velocity
Definition: base.hpp:25
InternalState
Definition: state.hpp:33
Definition: node_canopen_402_driver.hpp:17
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:358
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:316
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:295
bool set_target(double target)
Method to set target.
Definition: node_canopen_402_driver_impl.hpp:574
bool set_mode_velocity()
Method to set profiled velocity mode.
Definition: node_canopen_402_driver_impl.hpp:494
bool set_mode_torque()
Method to set profiled torque mode.
Definition: node_canopen_402_driver_impl.hpp:554
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:373
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:334
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:350
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:365
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:342
virtual void poll_timer_callback() override
Definition: node_canopen_402_driver_impl.hpp:268
bool set_mode_interpolated_position()
Method to set interpolated position mode.
Definition: node_canopen_402_driver_impl.hpp:474
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:326
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:306
bool halt_motor()
Method to halt device.
Definition: node_canopen_402_driver_impl.hpp:431
bool set_mode_position()
Method to set profiled position mode.
Definition: node_canopen_402_driver_impl.hpp:454
bool init_motor()
Method to initialise device.
Definition: node_canopen_402_driver_impl.hpp:403
bool recover_motor()
Method to recover device.
Definition: node_canopen_402_driver_impl.hpp:418
NodeCanopen402Driver(NODETYPE *node)
Definition: node_canopen_402_driver_impl.hpp:13
void publish()
Definition: node_canopen_402_driver_impl.hpp:277
bool set_operation_mode(uint16_t mode)
Definition: node_canopen_402_driver_impl.hpp:444
bool set_mode_cyclic_velocity()
Method to set cyclic velocity mode.
Definition: node_canopen_402_driver_impl.hpp:534
bool set_mode_cyclic_position()
Method to set cyclic position mode.
Definition: node_canopen_402_driver_impl.hpp:514
virtual void add_to_master() override
Add the driver to master.
Definition: node_canopen_402_driver_impl.hpp:288
virtual void add_to_master()
Add the driver to master.
Definition: node_canopen_base_driver_impl.hpp:111
virtual void poll_timer_callback()
Definition: node_canopen_base_driver_impl.hpp:243
void deactivate()
Deactivate the driver.
Definition: node_canopen_driver.hpp:251
void activate()
Activate the driver.
Definition: node_canopen_driver.hpp:209
void init()
Initialise the driver.
Definition: node_canopen_driver.hpp:113
void configure()
Configure the driver.
Definition: node_canopen_driver.hpp:161
Definition: node_canopen_proxy_driver.hpp:12
Definition: node_canopen_driver.hpp:32
Definition: configuration_manager.hpp:28