Skip to content

Commit fdca444

Browse files
Merge remote-tracking branch 'syns/add-pdo-6077-effort-feedback' into dz/update-syns123b-6077-effort
2 parents e5eeb7b + c3cb00f commit fdca444

File tree

7 files changed

+44
-2
lines changed

7 files changed

+44
-2
lines changed

canopen_402_driver/include/canopen_402_driver/cia402_driver.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ class Cia402Driver : public ros2_canopen::CanopenDriver
6969
node_canopen_402_driver_->register_rpdo_cb(rpdo_cb);
7070
}
7171

72+
double get_effort() { return node_canopen_402_driver_->get_effort(); }
73+
7274
double get_speed() { return node_canopen_402_driver_->get_speed(); }
7375

7476
double get_position() { return node_canopen_402_driver_->get_position(); }

canopen_402_driver/include/canopen_402_driver/motor.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,10 @@ class Motor402 : public MotorBase
196196
registerMode<CyclicSynchronousTorqueMode>(MotorBase::Cyclic_Synchronous_Torque, driver);
197197
}
198198

199+
double get_effort() const
200+
{
201+
return (double)this->driver->universal_get_value<int16_t>(0x6077, 0);
202+
}
199203
double get_speed() const { return (double)this->driver->universal_get_value<int32_t>(0x606C, 0); }
200204
double get_position() const
201205
{

canopen_402_driver/include/canopen_402_driver/node_interfaces/node_canopen_402_driver.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class NodeCanopen402Driver : public NodeCanopenProxyDriver<NODETYPE>
6161
double scale_vel_from_dev_;
6262
double offset_pos_to_dev_;
6363
double offset_pos_from_dev_;
64+
double scale_eff_from_dev_;
6465
ros2_canopen::State402::InternalState switching_state_;
6566
int homing_timeout_seconds_;
6667

@@ -77,6 +78,8 @@ class NodeCanopen402Driver : public NodeCanopenProxyDriver<NODETYPE>
7778
virtual void deactivate(bool called_from_base) override;
7879
virtual void add_to_master() override;
7980

81+
virtual double get_effort() { return motor_->get_effort() * scale_eff_from_dev_; }
82+
8083
virtual double get_speed() { return motor_->get_speed() * scale_vel_from_dev_; }
8184

8285
virtual double get_position()

canopen_402_driver/include/canopen_402_driver/node_interfaces/node_canopen_402_driver_impl.hpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ void NodeCanopen402Driver<rclcpp_lifecycle::LifecycleNode>::configure(bool calle
221221
std::optional<double> scale_vel_from_dev;
222222
std::optional<double> offset_pos_to_dev;
223223
std::optional<double> offset_pos_from_dev;
224+
std::optional<double> scale_eff_from_dev;
224225
std::optional<int> switching_state;
225226
std::optional<int> homing_timeout_seconds;
226227
try
@@ -266,6 +267,13 @@ void NodeCanopen402Driver<rclcpp_lifecycle::LifecycleNode>::configure(bool calle
266267
{
267268
}
268269
try
270+
{
271+
scale_eff_from_dev = std::optional(this->config_["scale_eff_from_dev"].as<double>());
272+
}
273+
catch (...)
274+
{
275+
}
276+
try
269277
{
270278
switching_state = std::optional(this->config_["switching_state"].as<int>());
271279
}
@@ -288,6 +296,7 @@ void NodeCanopen402Driver<rclcpp_lifecycle::LifecycleNode>::configure(bool calle
288296
scale_vel_from_dev_ = scale_vel_from_dev.value_or(0.001);
289297
offset_pos_to_dev_ = offset_pos_to_dev.value_or(0.0);
290298
offset_pos_from_dev_ = offset_pos_from_dev.value_or(0.0);
299+
scale_eff_from_dev_ = scale_eff_from_dev.value_or(0.001);
291300
switching_state_ = (ros2_canopen::State402::InternalState)switching_state.value_or(
292301
(int)ros2_canopen::State402::InternalState::Operation_Enable);
293302
homing_timeout_seconds_ = homing_timeout_seconds.value_or(10);
@@ -310,6 +319,7 @@ void NodeCanopen402Driver<rclcpp::Node>::configure(bool called_from_base)
310319
std::optional<double> scale_vel_from_dev;
311320
std::optional<double> offset_pos_to_dev;
312321
std::optional<double> offset_pos_from_dev;
322+
std::optional<double> scale_eff_from_dev;
313323
std::optional<int> switching_state;
314324
std::optional<int> homing_timeout_seconds;
315325
try
@@ -355,6 +365,13 @@ void NodeCanopen402Driver<rclcpp::Node>::configure(bool called_from_base)
355365
{
356366
}
357367
try
368+
{
369+
scale_eff_from_dev = std::optional(this->config_["scale_eff_from_dev"].as<double>());
370+
}
371+
catch (...)
372+
{
373+
}
374+
try
358375
{
359376
switching_state = std::optional(this->config_["switching_state"].as<int>());
360377
}
@@ -377,16 +394,20 @@ void NodeCanopen402Driver<rclcpp::Node>::configure(bool called_from_base)
377394
scale_vel_from_dev_ = scale_vel_from_dev.value_or(0.001);
378395
offset_pos_to_dev_ = offset_pos_to_dev.value_or(0.0);
379396
offset_pos_from_dev_ = offset_pos_from_dev.value_or(0.0);
397+
scale_eff_from_dev_ = scale_eff_from_dev.value_or(0.001);
380398
switching_state_ = (ros2_canopen::State402::InternalState)switching_state.value_or(
381399
(int)ros2_canopen::State402::InternalState::Operation_Enable);
382400
homing_timeout_seconds_ = homing_timeout_seconds.value_or(10);
383401
RCLCPP_INFO(
384402
this->node_->get_logger(),
385403
"scale_pos_to_dev_ %f\nscale_pos_from_dev_ %f\nscale_vel_to_dev_ %f\nscale_vel_from_dev_ "
404+
"%f\nscale_eff_from_dev_ "
386405
"%f\noffset_pos_to_dev_ %f\noffset_pos_from_dev_ "
387406
"%f\nhoming_timeout_seconds_ %i\n",
388407
scale_pos_to_dev_, scale_pos_from_dev_, scale_vel_to_dev_, scale_vel_from_dev_,
389-
offset_pos_to_dev_, offset_pos_from_dev_, homing_timeout_seconds_);
408+
scale_eff_from_dev_,
409+
offset_pos_to_dev_, offset_pos_from_dev_, homing_timeout_seconds_,
410+
);
390411
}
391412

392413
template <class NODETYPE>
@@ -420,7 +441,7 @@ void NodeCanopen402Driver<NODETYPE>::publish()
420441
js_msg.name.push_back(this->node_->get_name());
421442
js_msg.position.push_back(motor_->get_position() * scale_pos_from_dev_ + offset_pos_from_dev_);
422443
js_msg.velocity.push_back(motor_->get_speed() * scale_vel_from_dev_);
423-
js_msg.effort.push_back(0.0);
444+
js_msg.effort.push_back(motor_->get_effort() * scale_eff_from_dev_);
424445
publish_joint_state->publish(js_msg);
425446
}
426447

canopen_ros2_control/include/canopen_ros2_control/cia402_data.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ struct Cia402Data
4545
// FROM MOTOR
4646
double actual_position = std::numeric_limits<double>::quiet_NaN();
4747
double actual_velocity = std::numeric_limits<double>::quiet_NaN();
48+
double actual_effort = std::numeric_limits<double>::quiet_NaN();
4849

4950
// TO MOTOR
5051
double target_position = std::numeric_limits<double>::quiet_NaN();
@@ -107,6 +108,10 @@ struct Cia402Data
107108
// actual speed
108109
state_interfaces.emplace_back(hardware_interface::StateInterface(
109110
joint_name, hardware_interface::HW_IF_VELOCITY, &actual_velocity));
111+
112+
// actual effort
113+
state_interfaces.emplace_back(hardware_interface::StateInterface(
114+
joint_name, hardware_interface::HW_IF_EFFORT, &actual_effort));
110115
}
111116

112117
void export_command_interface(
@@ -144,6 +149,7 @@ struct Cia402Data
144149
{
145150
actual_position = driver->get_position();
146151
actual_velocity = driver->get_speed();
152+
actual_effort = driver->get_effort();
147153
}
148154

149155
void write_target()

canopen_ros2_control/include/canopen_ros2_control/cia402_system.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ struct MotorNodeData
6161
// feedback
6262
double actual_position;
6363
double actual_speed;
64+
double actual_effort;
6465

6566
// basic control
6667
MotorTriggerCommand init;

canopen_ros2_control/src/cia402_system.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ std::vector<hardware_interface::StateInterface> Cia402System::export_state_inter
136136
state_interfaces.emplace_back(hardware_interface::StateInterface(
137137
info_.joints[i].name, hardware_interface::HW_IF_VELOCITY,
138138
&motor_data_[node_id].actual_speed));
139+
// actual effort
140+
state_interfaces.emplace_back(hardware_interface::StateInterface(
141+
info_.joints[i].name, hardware_interface::HW_IF_EFFORT, &motor_data_[node_id].actual_effort));
139142
}
140143

141144
return state_interfaces;
@@ -253,6 +256,8 @@ hardware_interface::return_type Cia402System::read(
253256
motor_data_[it->first].actual_position = motion_controller_driver->get_position();
254257
// get speed
255258
motor_data_[it->first].actual_speed = motion_controller_driver->get_speed();
259+
// get effort
260+
motor_data_[it->first].actual_effort = motion_controller_driver->get_effort();
256261
}
257262

258263
return ret_val;

0 commit comments

Comments
 (0)