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
144144TEST_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
165174TEST_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
195204TEST_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)
252262TEST_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