Skip to content

Commit 594c6ce

Browse files
committed
Make linter happy
1 parent a56457c commit 594c6ce

File tree

5 files changed

+114
-58
lines changed

5 files changed

+114
-58
lines changed

force_torque_sensor_broadcaster/include/force_torque_sensor_broadcaster/wrench_transformer.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ class WrenchTransformer : public rclcpp::Node
4848
private:
4949
void wrench_callback(const geometry_msgs::msg::WrenchStamped::SharedPtr msg);
5050
bool transform_wrench(
51-
const geometry_msgs::msg::WrenchStamped & input_wrench,
52-
const std::string & target_frame, geometry_msgs::msg::WrenchStamped & output_wrench);
51+
const geometry_msgs::msg::WrenchStamped & input_wrench, const std::string & target_frame,
52+
geometry_msgs::msg::WrenchStamped & output_wrench);
5353

5454
void setup_subscriber();
5555
void setup_publishers();
@@ -71,4 +71,3 @@ class WrenchTransformer : public rclcpp::Node
7171
} // namespace force_torque_sensor_broadcaster
7272

7373
#endif // FORCE_TORQUE_SENSOR_BROADCASTER__WRENCH_TRANSFORMER_HPP_
74-

force_torque_sensor_broadcaster/src/wrench_transformer.cpp

Lines changed: 47 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ void WrenchTransformer::init()
3939
{
4040
try
4141
{
42-
param_listener_ = std::make_shared<force_torque_wrench_transformer::ParamListener>(
43-
shared_from_this());
42+
param_listener_ =
43+
std::make_shared<force_torque_wrench_transformer::ParamListener>(shared_from_this());
4444
params_ = param_listener_->get_params();
4545
}
4646
catch (const std::exception & e)
@@ -56,25 +56,32 @@ void WrenchTransformer::init()
5656

5757
void WrenchTransformer::wrench_callback(const geometry_msgs::msg::WrenchStamped::SharedPtr msg)
5858
{
59-
60-
if (!msg || msg->header.frame_id.empty()) {
61-
RCLCPP_ERROR_THROTTLE(this->get_logger(), *this->get_clock(), 5000, "Invalid wrench message or frame_id is empty");
59+
if (!msg || msg->header.frame_id.empty())
60+
{
61+
RCLCPP_ERROR_THROTTLE(
62+
this->get_logger(), *this->get_clock(), 5000, "Invalid wrench message or frame_id is empty");
6263
return;
6364
}
64-
65-
for (const auto & target_frame : params_.target_frames) {
65+
66+
for (const auto & target_frame : params_.target_frames)
67+
{
6668
geometry_msgs::msg::WrenchStamped output_wrench;
6769
// preserve timestamp
6870
output_wrench.header.stamp = msg->header.stamp;
6971
output_wrench.header.frame_id = target_frame;
70-
if (transform_wrench(*msg, target_frame, output_wrench)) {
72+
if (transform_wrench(*msg, target_frame, output_wrench))
73+
{
7174
auto publisher = transformed_wrench_publishers_[target_frame];
72-
if (publisher) {
75+
if (publisher)
76+
{
7377
publisher->publish(output_wrench);
7478
}
7579
}
76-
else {
77-
RCLCPP_WARN_THROTTLE(this->get_logger(), *this->get_clock(), 5000, "Failed to transform wrench for frame %s, skipping publication", target_frame.c_str());
80+
else
81+
{
82+
RCLCPP_WARN_THROTTLE(
83+
this->get_logger(), *this->get_clock(), 5000,
84+
"Failed to transform wrench for frame %s, skipping publication", target_frame.c_str());
7885
}
7986
}
8087
}
@@ -83,48 +90,62 @@ bool WrenchTransformer::transform_wrench(
8390
const geometry_msgs::msg::WrenchStamped & input_wrench, const std::string & target_frame,
8491
geometry_msgs::msg::WrenchStamped & output_wrench)
8592
{
86-
try {
87-
auto transform = tf_buffer_->lookupTransform(target_frame, input_wrench.header.frame_id, rclcpp::Time(0), rclcpp::Duration::from_seconds(params_.tf_timeout));
93+
try
94+
{
95+
auto transform = tf_buffer_->lookupTransform(
96+
target_frame, input_wrench.header.frame_id, rclcpp::Time(0),
97+
rclcpp::Duration::from_seconds(params_.tf_timeout));
8898
output_wrench.header.frame_id = target_frame;
8999
tf2::doTransform(input_wrench, output_wrench, transform);
90100
// Preserve original timestamp after transform (doTransform may modify it)
91101
output_wrench.header.stamp = input_wrench.header.stamp;
92102
return true;
93103
}
94-
catch (const tf2::TransformException & e) {
95-
RCLCPP_ERROR_THROTTLE(this->get_logger(), *this->get_clock(), 5000, "Transform exception: %s", e.what());
104+
catch (const tf2::TransformException & e)
105+
{
106+
RCLCPP_ERROR_THROTTLE(
107+
this->get_logger(), *this->get_clock(), 5000, "Transform exception: %s", e.what());
96108
return false;
97109
}
98110
return false;
99111
}
100112

101113
void WrenchTransformer::setup_subscriber()
102114
{
103-
input_topic_ = params_.broadcaster_namespace.empty() ? "~/wrench" : params_.broadcaster_namespace + "/wrench";
104-
if (params_.use_filtered_input) {
115+
input_topic_ =
116+
params_.broadcaster_namespace.empty() ? "~/wrench" : params_.broadcaster_namespace + "/wrench";
117+
if (params_.use_filtered_input)
118+
{
105119
input_topic_ += "_filtered";
106120
}
107121
wrench_subscriber_ = this->create_subscription<geometry_msgs::msg::WrenchStamped>(
108-
input_topic_, rclcpp::SystemDefaultsQoS(), std::bind(&WrenchTransformer::wrench_callback, this, std::placeholders::_1));
109-
if (wrench_subscriber_ == nullptr) {
110-
RCLCPP_ERROR_THROTTLE(this->get_logger(), *this->get_clock(), 5000, "Failed to create wrench subscriber");
122+
input_topic_, rclcpp::SystemDefaultsQoS(),
123+
std::bind(&WrenchTransformer::wrench_callback, this, std::placeholders::_1));
124+
if (wrench_subscriber_ == nullptr)
125+
{
126+
RCLCPP_ERROR_THROTTLE(
127+
this->get_logger(), *this->get_clock(), 5000, "Failed to create wrench subscriber");
111128
return;
112129
}
113130
}
114131

115132
void WrenchTransformer::setup_publishers()
116133
{
117-
for (const auto & target_frame : params_.target_frames) {
134+
for (const auto & target_frame : params_.target_frames)
135+
{
118136
std::string topic_name = params_.output_topic_prefix + "_" + target_frame;
119-
transformed_wrench_publishers_[target_frame] = this->create_publisher<geometry_msgs::msg::WrenchStamped>(
120-
topic_name, rclcpp::SystemDefaultsQoS());
121-
if (transformed_wrench_publishers_[target_frame] == nullptr) {
122-
RCLCPP_ERROR_THROTTLE(this->get_logger(), *this->get_clock(), 5000, "Failed to create publisher for target frame %s", target_frame.c_str());
137+
transformed_wrench_publishers_[target_frame] =
138+
this->create_publisher<geometry_msgs::msg::WrenchStamped>(
139+
topic_name, rclcpp::SystemDefaultsQoS());
140+
if (transformed_wrench_publishers_[target_frame] == nullptr)
141+
{
142+
RCLCPP_ERROR_THROTTLE(
143+
this->get_logger(), *this->get_clock(), 5000,
144+
"Failed to create publisher for target frame %s", target_frame.c_str());
123145
return;
124146
}
125147
RCLCPP_INFO(this->get_logger(), "Created publisher for target frame %s", target_frame.c_str());
126148
}
127149
}
128150

129151
} // namespace force_torque_sensor_broadcaster
130-

force_torque_sensor_broadcaster/src/wrench_transformer_main.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,3 @@ int main(int argc, char ** argv)
2929
rclcpp::shutdown();
3030
return 0;
3131
}
32-
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
force_torque_wrench_transformer:
2+
broadcaster_namespace: {
3+
type: string,
4+
default_value: "",
5+
description: "Full namespace path to the force_torque_sensor_broadcaster controller node. The broadcaster publishes geometry_msgs::msg::WrenchStamped messages to topics 'wrench' (raw) and 'wrench_filtered' (filtered). Input topics will be constructed as '<broadcaster_namespace>/wrench' or '<broadcaster_namespace>/wrench_filtered'. If empty, assumes the broadcaster is in the same namespace as this node and uses '~/wrench'.",
6+
}
7+
use_filtered_input: {
8+
type: bool,
9+
default_value: false,
10+
description: "If true, subscribes to the filtered WrenchStamped topic ('<broadcaster_namespace>/wrench_filtered'), otherwise subscribes to the raw WrenchStamped topic ('<broadcaster_namespace>/wrench'). The filtered topic is only available if the broadcaster has a sensor_filter_chain configured.",
11+
}
12+
target_frames: {
13+
type: string_array,
14+
default_value: [],
15+
description: "Array of target frame names to transform the input wrench to. For each frame, a separate output topic will be published.",
16+
validation: {
17+
not_empty<>: null
18+
}
19+
}
20+
output_topic_prefix: {
21+
type: string,
22+
default_value: "~/wrench_transformed",
23+
description: "Prefix for output topic names. Each output topic publishes transformed WrenchStamped messages in a different frame. Output topics will be named as '<output_topic_prefix>_<frame_name>'. Default uses node namespace.",
24+
}
25+
tf_timeout: {
26+
type: double,
27+
default_value: 0.1,
28+
description: "Timeout in seconds for TF lookups when transforming wrenches between frames.",
29+
}
30+

force_torque_sensor_broadcaster/test/test_wrench_transformer.cpp

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ class TestWrenchTransformer : public ::testing::Test
4545
std::shared_ptr<rclcpp::executors::SingleThreadedExecutor> executor_;
4646

4747
void setup_static_transform(
48-
const std::string & parent_frame, const std::string & child_frame,
49-
double x = 0.0, double y = 0.0, double z = 0.0, double qx = 0.0, double qy = 0.0,
50-
double qz = 0.0, double qw = 1.0)
48+
const std::string & parent_frame, const std::string & child_frame, double x = 0.0,
49+
double y = 0.0, double z = 0.0, double qx = 0.0, double qy = 0.0, double qz = 0.0,
50+
double qw = 1.0)
5151
{
5252
auto tf_node = std::make_shared<rclcpp::Node>("static_tf_broadcaster");
5353
executor_->add_node(tf_node);
@@ -71,11 +71,9 @@ class TestWrenchTransformer : public ::testing::Test
7171
}
7272

7373
std::shared_ptr<force_torque_sensor_broadcaster::WrenchTransformer> create_transformer_node(
74-
const std::string & broadcaster_namespace = "test_broadcaster",
75-
bool use_filtered_input = false,
74+
const std::string & broadcaster_namespace = "test_broadcaster", bool use_filtered_input = false,
7675
const std::vector<std::string> & target_frames = {"base_link"},
77-
const std::string & output_topic_prefix = "~/wrench_transformed",
78-
double tf_timeout = 0.1)
76+
const std::string & output_topic_prefix = "~/wrench_transformed", double tf_timeout = 0.1)
7977
{
8078
rclcpp::NodeOptions options;
8179
std::vector<rclcpp::Parameter> parameters;
@@ -130,7 +128,7 @@ TEST_F(TestWrenchTransformer, NodeInitialization)
130128
rclcpp::NodeOptions options;
131129
std::vector<rclcpp::Parameter> parameters;
132130
parameters.emplace_back("target_frames", std::vector<std::string>{"base_link"});
133-
131+
134132
options.parameter_overrides(parameters);
135133

136134
auto node = std::make_shared<force_torque_sensor_broadcaster::WrenchTransformer>(options);
@@ -144,13 +142,15 @@ TEST_F(TestWrenchTransformer, NodeInitialization)
144142
TEST_F(TestWrenchTransformer, ParameterLoadingFromYamlFile)
145143
{
146144
rclcpp::NodeOptions options;
147-
options.arguments({"--ros-args", "--params-file", std::string(TEST_FILES_DIRECTORY) + "/test_wrench_transformer.yaml"});
145+
options.arguments(
146+
{"--ros-args", "--params-file",
147+
std::string(TEST_FILES_DIRECTORY) + "/test_wrench_transformer.yaml"});
148148
auto node = std::make_shared<force_torque_sensor_broadcaster::WrenchTransformer>(options);
149149
executor_->add_node(node);
150150
node->init();
151-
151+
152152
ASSERT_NE(node, nullptr);
153-
153+
154154
// Verify parameters were loaded from YAML
155155
EXPECT_EQ(node->get_parameter("broadcaster_namespace").as_string(), "test_broadcaster");
156156
EXPECT_EQ(node->get_parameter("use_filtered_input").as_bool(), false);
@@ -164,9 +164,7 @@ TEST_F(TestWrenchTransformer, ParameterLoadingFromYamlFile)
164164

165165
TEST_F(TestWrenchTransformer, MultipleTargetFrames)
166166
{
167-
auto node = create_transformer_node(
168-
"test_broadcaster", false,
169-
{"base_link", "end_effector"});
167+
auto node = create_transformer_node("test_broadcaster", false, {"base_link", "end_effector"});
170168

171169
executor_->spin_some(std::chrono::milliseconds(100));
172170

@@ -188,8 +186,10 @@ TEST_F(TestWrenchTransformer, MultipleTargetFrames)
188186
wait_for_publisher(end_effector_sub);
189187

190188
ASSERT_NE(node, nullptr);
191-
EXPECT_GT(base_link_sub->get_publisher_count(), 0u) << "Publisher not found on /fts_wrench_transformer/wrench_transformed_base_link";
192-
EXPECT_GT(end_effector_sub->get_publisher_count(), 0u) << "Publisher not found on /fts_wrench_transformer/wrench_transformed_end_effector";
189+
EXPECT_GT(base_link_sub->get_publisher_count(), 0u)
190+
<< "Publisher not found on /fts_wrench_transformer/wrench_transformed_base_link";
191+
EXPECT_GT(end_effector_sub->get_publisher_count(), 0u)
192+
<< "Publisher not found on /fts_wrench_transformer/wrench_transformed_end_effector";
193193
}
194194

195195
TEST_F(TestWrenchTransformer, PublishSubscribeFlow)
@@ -216,7 +216,8 @@ TEST_F(TestWrenchTransformer, PublishSubscribeFlow)
216216
auto subscriber_node = std::make_shared<rclcpp::Node>("test_subscriber");
217217
auto output_subscriber = subscriber_node->create_subscription<geometry_msgs::msg::WrenchStamped>(
218218
"/fts_wrench_transformer/wrench_transformed_base_link", rclcpp::SystemDefaultsQoS(),
219-
[&received_msg](const geometry_msgs::msg::WrenchStamped::SharedPtr msg) { received_msg = msg; });
219+
[&received_msg](const geometry_msgs::msg::WrenchStamped::SharedPtr msg)
220+
{ received_msg = msg; });
220221
executor_->add_node(subscriber_node);
221222

222223
wait_for_discovery();
@@ -252,8 +253,8 @@ TEST_F(TestWrenchTransformer, PublishSubscribeFlow)
252253
TEST_F(TestWrenchTransformer, PublishSubscribeMultipleFrames)
253254
{
254255
// Create transformer node first so its TF listener can receive transforms
255-
auto transformer_node = create_transformer_node(
256-
"test_broadcaster", false, {"base_link", "end_effector"});
256+
auto transformer_node =
257+
create_transformer_node("test_broadcaster", false, {"base_link", "end_effector"});
257258
executor_->spin_some(std::chrono::milliseconds(100));
258259

259260
// Setup static transforms
@@ -273,14 +274,18 @@ TEST_F(TestWrenchTransformer, PublishSubscribeMultipleFrames)
273274
// Create subscriber nodes to receive output messages for both frames
274275
geometry_msgs::msg::WrenchStamped::SharedPtr received_base_link;
275276
geometry_msgs::msg::WrenchStamped::SharedPtr received_end_effector;
276-
277+
277278
auto subscriber_node = std::make_shared<rclcpp::Node>("test_subscriber");
278-
auto base_link_subscriber = subscriber_node->create_subscription<geometry_msgs::msg::WrenchStamped>(
279-
"/fts_wrench_transformer/wrench_transformed_base_link", rclcpp::SystemDefaultsQoS(),
280-
[&received_base_link](const geometry_msgs::msg::WrenchStamped::SharedPtr msg) { received_base_link = msg; });
281-
auto end_effector_subscriber = subscriber_node->create_subscription<geometry_msgs::msg::WrenchStamped>(
282-
"/fts_wrench_transformer/wrench_transformed_end_effector", rclcpp::SystemDefaultsQoS(),
283-
[&received_end_effector](const geometry_msgs::msg::WrenchStamped::SharedPtr msg) { received_end_effector = msg; });
279+
auto base_link_subscriber =
280+
subscriber_node->create_subscription<geometry_msgs::msg::WrenchStamped>(
281+
"/fts_wrench_transformer/wrench_transformed_base_link", rclcpp::SystemDefaultsQoS(),
282+
[&received_base_link](const geometry_msgs::msg::WrenchStamped::SharedPtr msg)
283+
{ received_base_link = msg; });
284+
auto end_effector_subscriber =
285+
subscriber_node->create_subscription<geometry_msgs::msg::WrenchStamped>(
286+
"/fts_wrench_transformer/wrench_transformed_end_effector", rclcpp::SystemDefaultsQoS(),
287+
[&received_end_effector](const geometry_msgs::msg::WrenchStamped::SharedPtr msg)
288+
{ received_end_effector = msg; });
284289
executor_->add_node(subscriber_node);
285290

286291
wait_for_discovery();
@@ -299,8 +304,10 @@ TEST_F(TestWrenchTransformer, PublishSubscribeMultipleFrames)
299304

300305
// Verify messages were received and transformed
301306
ASSERT_NE(transformer_node, nullptr);
302-
ASSERT_TRUE(received_base_link != nullptr) << "Transformed message for base_link was not received";
303-
ASSERT_TRUE(received_end_effector != nullptr) << "Transformed message for end_effector was not received";
307+
ASSERT_TRUE(received_base_link != nullptr)
308+
<< "Transformed message for base_link was not received";
309+
ASSERT_TRUE(received_end_effector != nullptr)
310+
<< "Transformed message for end_effector was not received";
304311
EXPECT_EQ(received_base_link->header.frame_id, "base_link");
305312
EXPECT_EQ(received_end_effector->header.frame_id, "end_effector");
306313
}

0 commit comments

Comments
 (0)