Skip to content

Commit 254c53e

Browse files
committed
Make linter happy
1 parent a56457c commit 254c53e

File tree

7 files changed

+123
-63
lines changed

7 files changed

+123
-63
lines changed

force_torque_sensor_broadcaster/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ if(BUILD_TESTING)
112112
)
113113

114114
ament_add_gmock(test_wrench_transformer test/test_wrench_transformer.cpp)
115+
target_compile_features(test_wrench_transformer PUBLIC cxx_std_17)
115116
target_include_directories(test_wrench_transformer PRIVATE include)
116117
target_compile_definitions(test_wrench_transformer PRIVATE
117118
TEST_FILES_DIRECTORY="${CMAKE_CURRENT_SOURCE_DIR}/test")

force_torque_sensor_broadcaster/doc/userdoc.rst

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,3 @@ The node subscribes to:
6666

6767
The node publishes:
6868
- ``<output_topic_prefix>_<target_frame>`` for each target frame specified in ``target_frames``
69-
70-
Example parameter file:
71-
72-
.. literalinclude:: ../test/test_wrench_transformer.yaml
73-
:language: yaml

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: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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+
}

force_torque_sensor_broadcaster/test/test_wrench_transformer.cpp

Lines changed: 44 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
#include <gmock/gmock.h>
2020
#include <chrono>
21+
#include <filesystem>
22+
#include <fstream>
2123
#include <memory>
2224
#include <string>
2325
#include <thread>
@@ -45,9 +47,9 @@ class TestWrenchTransformer : public ::testing::Test
4547
std::shared_ptr<rclcpp::executors::SingleThreadedExecutor> executor_;
4648

4749
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)
50+
const std::string & parent_frame, const std::string & child_frame, double x = 0.0,
51+
double y = 0.0, double z = 0.0, double qx = 0.0, double qy = 0.0, double qz = 0.0,
52+
double qw = 1.0)
5153
{
5254
auto tf_node = std::make_shared<rclcpp::Node>("static_tf_broadcaster");
5355
executor_->add_node(tf_node);
@@ -71,11 +73,9 @@ class TestWrenchTransformer : public ::testing::Test
7173
}
7274

7375
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,
76+
const std::string & broadcaster_namespace = "test_broadcaster", bool use_filtered_input = false,
7677
const std::vector<std::string> & target_frames = {"base_link"},
77-
const std::string & output_topic_prefix = "~/wrench_transformed",
78-
double tf_timeout = 0.1)
78+
const std::string & output_topic_prefix = "~/wrench_transformed", double tf_timeout = 0.1)
7979
{
8080
rclcpp::NodeOptions options;
8181
std::vector<rclcpp::Parameter> parameters;
@@ -130,7 +130,7 @@ TEST_F(TestWrenchTransformer, NodeInitialization)
130130
rclcpp::NodeOptions options;
131131
std::vector<rclcpp::Parameter> parameters;
132132
parameters.emplace_back("target_frames", std::vector<std::string>{"base_link"});
133-
133+
134134
options.parameter_overrides(parameters);
135135

136136
auto node = std::make_shared<force_torque_sensor_broadcaster::WrenchTransformer>(options);
@@ -143,14 +143,23 @@ TEST_F(TestWrenchTransformer, NodeInitialization)
143143

144144
TEST_F(TestWrenchTransformer, ParameterLoadingFromYamlFile)
145145
{
146+
// Construct absolute path to YAML file
147+
std::filesystem::path yaml_path =
148+
std::filesystem::path(TEST_FILES_DIRECTORY) / "test_wrench_transformer.yaml";
149+
yaml_path = std::filesystem::canonical(yaml_path);
150+
const std::string yaml_file_path = yaml_path.string();
151+
152+
// Verify file exists before trying to load it
153+
ASSERT_TRUE(std::filesystem::exists(yaml_path)) << "YAML file not found at: " << yaml_file_path;
154+
146155
rclcpp::NodeOptions options;
147-
options.arguments({"--ros-args", "--params-file", std::string(TEST_FILES_DIRECTORY) + "/test_wrench_transformer.yaml"});
156+
options.arguments({"--ros-args", "--params-file", yaml_file_path});
148157
auto node = std::make_shared<force_torque_sensor_broadcaster::WrenchTransformer>(options);
149158
executor_->add_node(node);
150159
node->init();
151-
160+
152161
ASSERT_NE(node, nullptr);
153-
162+
154163
// Verify parameters were loaded from YAML
155164
EXPECT_EQ(node->get_parameter("broadcaster_namespace").as_string(), "test_broadcaster");
156165
EXPECT_EQ(node->get_parameter("use_filtered_input").as_bool(), false);
@@ -164,9 +173,7 @@ TEST_F(TestWrenchTransformer, ParameterLoadingFromYamlFile)
164173

165174
TEST_F(TestWrenchTransformer, MultipleTargetFrames)
166175
{
167-
auto node = create_transformer_node(
168-
"test_broadcaster", false,
169-
{"base_link", "end_effector"});
176+
auto node = create_transformer_node("test_broadcaster", false, {"base_link", "end_effector"});
170177

171178
executor_->spin_some(std::chrono::milliseconds(100));
172179

@@ -188,8 +195,10 @@ TEST_F(TestWrenchTransformer, MultipleTargetFrames)
188195
wait_for_publisher(end_effector_sub);
189196

190197
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";
198+
EXPECT_GT(base_link_sub->get_publisher_count(), 0u)
199+
<< "Publisher not found on /fts_wrench_transformer/wrench_transformed_base_link";
200+
EXPECT_GT(end_effector_sub->get_publisher_count(), 0u)
201+
<< "Publisher not found on /fts_wrench_transformer/wrench_transformed_end_effector";
193202
}
194203

195204
TEST_F(TestWrenchTransformer, PublishSubscribeFlow)
@@ -216,7 +225,8 @@ TEST_F(TestWrenchTransformer, PublishSubscribeFlow)
216225
auto subscriber_node = std::make_shared<rclcpp::Node>("test_subscriber");
217226
auto output_subscriber = subscriber_node->create_subscription<geometry_msgs::msg::WrenchStamped>(
218227
"/fts_wrench_transformer/wrench_transformed_base_link", rclcpp::SystemDefaultsQoS(),
219-
[&received_msg](const geometry_msgs::msg::WrenchStamped::SharedPtr msg) { received_msg = msg; });
228+
[&received_msg](const geometry_msgs::msg::WrenchStamped::SharedPtr msg)
229+
{ received_msg = msg; });
220230
executor_->add_node(subscriber_node);
221231

222232
wait_for_discovery();
@@ -252,8 +262,8 @@ TEST_F(TestWrenchTransformer, PublishSubscribeFlow)
252262
TEST_F(TestWrenchTransformer, PublishSubscribeMultipleFrames)
253263
{
254264
// 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"});
265+
auto transformer_node =
266+
create_transformer_node("test_broadcaster", false, {"base_link", "end_effector"});
257267
executor_->spin_some(std::chrono::milliseconds(100));
258268

259269
// Setup static transforms
@@ -273,14 +283,18 @@ TEST_F(TestWrenchTransformer, PublishSubscribeMultipleFrames)
273283
// Create subscriber nodes to receive output messages for both frames
274284
geometry_msgs::msg::WrenchStamped::SharedPtr received_base_link;
275285
geometry_msgs::msg::WrenchStamped::SharedPtr received_end_effector;
276-
286+
277287
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; });
288+
auto base_link_subscriber =
289+
subscriber_node->create_subscription<geometry_msgs::msg::WrenchStamped>(
290+
"/fts_wrench_transformer/wrench_transformed_base_link", rclcpp::SystemDefaultsQoS(),
291+
[&received_base_link](const geometry_msgs::msg::WrenchStamped::SharedPtr msg)
292+
{ received_base_link = msg; });
293+
auto end_effector_subscriber =
294+
subscriber_node->create_subscription<geometry_msgs::msg::WrenchStamped>(
295+
"/fts_wrench_transformer/wrench_transformed_end_effector", rclcpp::SystemDefaultsQoS(),
296+
[&received_end_effector](const geometry_msgs::msg::WrenchStamped::SharedPtr msg)
297+
{ received_end_effector = msg; });
284298
executor_->add_node(subscriber_node);
285299

286300
wait_for_discovery();
@@ -299,8 +313,10 @@ TEST_F(TestWrenchTransformer, PublishSubscribeMultipleFrames)
299313

300314
// Verify messages were received and transformed
301315
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";
316+
ASSERT_TRUE(received_base_link != nullptr)
317+
<< "Transformed message for base_link was not received";
318+
ASSERT_TRUE(received_end_effector != nullptr)
319+
<< "Transformed message for end_effector was not received";
304320
EXPECT_EQ(received_base_link->header.frame_id, "base_link");
305321
EXPECT_EQ(received_end_effector->header.frame_id, "end_effector");
306322
}

0 commit comments

Comments
 (0)