Skip to content

Commit 03c10aa

Browse files
Merge pull request #7 from Pliant-Energy/dz/update-synsi23b-6077-effort-feedback
Update 0x6077 effort feedback upstream PR to our forked WIP branch
2 parents 248636a + 9f72e34 commit 03c10aa

File tree

7 files changed

+44
-3
lines changed

7 files changed

+44
-3
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 & 3 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,16 +296,18 @@ 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);
294303
RCLCPP_INFO(
295304
this->node_->get_logger(),
296305
"scale_pos_to_dev_ %f\nscale_pos_from_dev_ %f\nscale_vel_to_dev_ %f\nscale_vel_from_dev_ "
306+
"%f\nscale_eff_from_dev_ "
297307
"%f\noffset_pos_to_dev_ %f\noffset_pos_from_dev_ "
298308
"%f\nhoming_timeout_seconds_ %i\n",
299309
scale_pos_to_dev_, scale_pos_from_dev_, scale_vel_to_dev_, scale_vel_from_dev_,
300-
offset_pos_to_dev_, offset_pos_from_dev_, homing_timeout_seconds_);
310+
scale_eff_from_dev_, offset_pos_to_dev_, offset_pos_from_dev_, homing_timeout_seconds_);
301311
}
302312

303313
template <>
@@ -310,6 +320,7 @@ void NodeCanopen402Driver<rclcpp::Node>::configure(bool called_from_base)
310320
std::optional<double> scale_vel_from_dev;
311321
std::optional<double> offset_pos_to_dev;
312322
std::optional<double> offset_pos_from_dev;
323+
std::optional<double> scale_eff_from_dev;
313324
std::optional<int> switching_state;
314325
std::optional<int> homing_timeout_seconds;
315326
try
@@ -355,6 +366,13 @@ void NodeCanopen402Driver<rclcpp::Node>::configure(bool called_from_base)
355366
{
356367
}
357368
try
369+
{
370+
scale_eff_from_dev = std::optional(this->config_["scale_eff_from_dev"].as<double>());
371+
}
372+
catch (...)
373+
{
374+
}
375+
try
358376
{
359377
switching_state = std::optional(this->config_["switching_state"].as<int>());
360378
}
@@ -377,16 +395,18 @@ void NodeCanopen402Driver<rclcpp::Node>::configure(bool called_from_base)
377395
scale_vel_from_dev_ = scale_vel_from_dev.value_or(0.001);
378396
offset_pos_to_dev_ = offset_pos_to_dev.value_or(0.0);
379397
offset_pos_from_dev_ = offset_pos_from_dev.value_or(0.0);
398+
scale_eff_from_dev_ = scale_eff_from_dev.value_or(0.001);
380399
switching_state_ = (ros2_canopen::State402::InternalState)switching_state.value_or(
381400
(int)ros2_canopen::State402::InternalState::Operation_Enable);
382401
homing_timeout_seconds_ = homing_timeout_seconds.value_or(10);
383402
RCLCPP_INFO(
384403
this->node_->get_logger(),
385404
"scale_pos_to_dev_ %f\nscale_pos_from_dev_ %f\nscale_vel_to_dev_ %f\nscale_vel_from_dev_ "
405+
"%f\nscale_eff_from_dev_ "
386406
"%f\noffset_pos_to_dev_ %f\noffset_pos_from_dev_ "
387407
"%f\nhoming_timeout_seconds_ %i\n",
388408
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_);
409+
scale_eff_from_dev_, offset_pos_to_dev_, offset_pos_from_dev_, homing_timeout_seconds_);
390410
}
391411

392412
template <class NODETYPE>
@@ -420,7 +440,7 @@ void NodeCanopen402Driver<NODETYPE>::publish()
420440
js_msg.name.push_back(this->node_->get_name());
421441
js_msg.position.push_back(motor_->get_position() * scale_pos_from_dev_ + offset_pos_from_dev_);
422442
js_msg.velocity.push_back(motor_->get_speed() * scale_vel_from_dev_);
423-
js_msg.effort.push_back(0.0);
443+
js_msg.effort.push_back(motor_->get_effort() * scale_eff_from_dev_);
424444
publish_joint_state->publish(js_msg);
425445
}
426446

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)