Skip to content

Commit b06cd33

Browse files
authored
Add multiplier support to ForceTorqueSensorBroadcaster (#1647)
Signed-off-by: Edward <[email protected]>
1 parent 7ecd2db commit b06cd33

File tree

5 files changed

+120
-0
lines changed

5 files changed

+120
-0
lines changed

doc/release_notes.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,7 @@
33
Release Notes: Jazzy to Kilted
44
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
55
This list summarizes the changes between Jazzy (previous) and Kilted (current) releases.
6+
7+
force_torque_sensor_broadcaster
8+
*******************************
9+
* Multiplier support was added. Users can now specify per–axis scaling factors for both force and torque readings, applied after the existing offset logic. (`#1647 <https://github.com/ros-controls/ros2_controllers/pull/1647/files>`__.

force_torque_sensor_broadcaster/include/force_torque_sensor_broadcaster/force_torque_sensor_broadcaster.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class ForceTorqueSensorBroadcaster : public controller_interface::ChainableContr
6161

6262
protected:
6363
void apply_sensor_offset(const Params & params, geometry_msgs::msg::WrenchStamped & msg);
64+
void apply_sensor_multiplier(const Params & params, geometry_msgs::msg::WrenchStamped & msg);
6465

6566
std::shared_ptr<ParamListener> param_listener_;
6667
Params params_;

force_torque_sensor_broadcaster/src/force_torque_sensor_broadcaster.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ controller_interface::return_type ForceTorqueSensorBroadcaster::update_and_write
175175
realtime_publisher_->msg_.header.stamp = time;
176176
force_torque_sensor_->get_values_as_message(realtime_publisher_->msg_.wrench);
177177
this->apply_sensor_offset(params_, realtime_publisher_->msg_);
178+
this->apply_sensor_multiplier(params_, realtime_publisher_->msg_);
178179
realtime_publisher_->unlockAndPublish();
179180
}
180181

@@ -267,6 +268,17 @@ void ForceTorqueSensorBroadcaster::apply_sensor_offset(
267268
msg.wrench.torque.y += params.offset.torque.y;
268269
msg.wrench.torque.z += params.offset.torque.z;
269270
}
271+
272+
void ForceTorqueSensorBroadcaster::apply_sensor_multiplier(
273+
const Params & params, geometry_msgs::msg::WrenchStamped & msg)
274+
{
275+
msg.wrench.force.x *= params.multiplier.force.x;
276+
msg.wrench.force.y *= params.multiplier.force.y;
277+
msg.wrench.force.z *= params.multiplier.force.z;
278+
msg.wrench.torque.x *= params.multiplier.torque.x;
279+
msg.wrench.torque.y *= params.multiplier.torque.y;
280+
msg.wrench.torque.z *= params.multiplier.torque.z;
281+
}
270282
} // namespace force_torque_sensor_broadcaster
271283

272284
#include "pluginlib/class_list_macros.hpp"

force_torque_sensor_broadcaster/src/force_torque_sensor_broadcaster_parameters.yaml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,36 @@ force_torque_sensor_broadcaster:
7979
default_value: 0.0,
8080
description: "The offset of torque values around 'z' axis.",
8181
}
82+
multiplier:
83+
force:
84+
x: {
85+
type: double,
86+
default_value: 1.0,
87+
description: "The multiplier of force value on 'x' axis.",
88+
}
89+
y: {
90+
type: double,
91+
default_value: 1.0,
92+
description: "The multiplier of force value on 'y' axis.",
93+
}
94+
z: {
95+
type: double,
96+
default_value: 1.0,
97+
description: "The multiplier of force value on 'z' axis.",
98+
}
99+
torque:
100+
x: {
101+
type: double,
102+
default_value: 1.0,
103+
description: "The multiplier of torque value around 'x' axis.",
104+
}
105+
y: {
106+
type: double,
107+
default_value: 1.0,
108+
description: "The multiplier of torque value around 'y' axis.",
109+
}
110+
z: {
111+
type: double,
112+
default_value: 1.0,
113+
description: "The multiplier of torque value around 'z' axis.",
114+
}

force_torque_sensor_broadcaster/test/test_force_torque_sensor_broadcaster.cpp

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,76 @@ TEST_F(ForceTorqueSensorBroadcasterTest, SensorName_Publish_Success_with_Offsets
355355
}
356356
}
357357

358+
TEST_F(ForceTorqueSensorBroadcasterTest, SensorName_Publish_Success_with_Multipliers)
359+
{
360+
SetUpFTSBroadcaster();
361+
362+
// some non‐trivial multipliers
363+
std::array<double, 3> force_multipliers = {{2.0, 0.5, -1.0}};
364+
std::array<double, 3> torque_multipliers = {{-2.0, 3.0, 0.0}};
365+
366+
// Set the required params
367+
fts_broadcaster_->get_node()->set_parameter({"sensor_name", sensor_name_});
368+
fts_broadcaster_->get_node()->set_parameter({"frame_id", frame_id_});
369+
370+
// Set all multiplier parameters
371+
fts_broadcaster_->get_node()->set_parameter({"multiplier.force.x", force_multipliers[0]});
372+
fts_broadcaster_->get_node()->set_parameter({"multiplier.force.y", force_multipliers[1]});
373+
fts_broadcaster_->get_node()->set_parameter({"multiplier.force.z", force_multipliers[2]});
374+
fts_broadcaster_->get_node()->set_parameter({"multiplier.torque.x", torque_multipliers[0]});
375+
fts_broadcaster_->get_node()->set_parameter({"multiplier.torque.y", torque_multipliers[1]});
376+
fts_broadcaster_->get_node()->set_parameter({"multiplier.torque.z", torque_multipliers[2]});
377+
378+
// Configure & activate
379+
ASSERT_EQ(fts_broadcaster_->on_configure(rclcpp_lifecycle::State()), NODE_SUCCESS);
380+
ASSERT_EQ(fts_broadcaster_->on_activate(rclcpp_lifecycle::State()), NODE_SUCCESS);
381+
382+
// Publish & grab the message
383+
geometry_msgs::msg::WrenchStamped wrench_msg;
384+
subscribe_and_get_message(wrench_msg);
385+
386+
// Check header
387+
ASSERT_EQ(wrench_msg.header.frame_id, frame_id_);
388+
389+
// Check that each field was scaled accordingly
390+
ASSERT_EQ(wrench_msg.wrench.force.x, sensor_values_[0] * force_multipliers[0]);
391+
ASSERT_EQ(wrench_msg.wrench.force.y, sensor_values_[1] * force_multipliers[1]);
392+
ASSERT_EQ(wrench_msg.wrench.force.z, sensor_values_[2] * force_multipliers[2]);
393+
ASSERT_EQ(wrench_msg.wrench.torque.x, sensor_values_[3] * torque_multipliers[0]);
394+
ASSERT_EQ(wrench_msg.wrench.torque.y, sensor_values_[4] * torque_multipliers[1]);
395+
ASSERT_EQ(wrench_msg.wrench.torque.z, sensor_values_[5] * torque_multipliers[2]);
396+
397+
// the exported state interfaces reflect the same scaled values
398+
const auto exported_state_interfaces = fts_broadcaster_->export_state_interfaces();
399+
ASSERT_EQ(exported_state_interfaces.size(), 6u);
400+
401+
const std::string controller_name = fts_broadcaster_->get_node()->get_name();
402+
ASSERT_EQ(
403+
exported_state_interfaces[0]->get_name(), controller_name + "/" + sensor_name_ + "/force.x");
404+
ASSERT_EQ(
405+
exported_state_interfaces[1]->get_name(), controller_name + "/" + sensor_name_ + "/force.y");
406+
ASSERT_EQ(
407+
exported_state_interfaces[2]->get_name(), controller_name + "/" + sensor_name_ + "/force.z");
408+
ASSERT_EQ(
409+
exported_state_interfaces[3]->get_name(), controller_name + "/" + sensor_name_ + "/torque.x");
410+
ASSERT_EQ(
411+
exported_state_interfaces[4]->get_name(), controller_name + "/" + sensor_name_ + "/torque.y");
412+
ASSERT_EQ(
413+
exported_state_interfaces[5]->get_name(), controller_name + "/" + sensor_name_ + "/torque.z");
414+
ASSERT_EQ(exported_state_interfaces[0]->get_interface_name(), "force.x");
415+
ASSERT_EQ(exported_state_interfaces[1]->get_interface_name(), "force.y");
416+
ASSERT_EQ(exported_state_interfaces[2]->get_interface_name(), "force.z");
417+
ASSERT_EQ(exported_state_interfaces[3]->get_interface_name(), "torque.x");
418+
ASSERT_EQ(exported_state_interfaces[4]->get_interface_name(), "torque.y");
419+
ASSERT_EQ(exported_state_interfaces[5]->get_interface_name(), "torque.z");
420+
for (size_t i = 0; i < 6; ++i)
421+
{
422+
ASSERT_EQ(
423+
exported_state_interfaces[i]->get_value(),
424+
sensor_values_[i] * (i < 3 ? force_multipliers[i] : torque_multipliers[i - 3]));
425+
}
426+
}
427+
358428
TEST_F(ForceTorqueSensorBroadcasterTest, InterfaceNames_Publish_Success)
359429
{
360430
SetUpFTSBroadcaster();

0 commit comments

Comments
 (0)