1+ #include < chrono>
2+ #include < functional>
3+ #include < memory>
4+ #include < string>
5+
6+ #include " rclcpp/rclcpp.hpp"
7+ #include " std_msgs/msg/string.hpp"
8+ #include " std_msgs/msg/float64_multi_array.hpp"
9+ #include < sensor_msgs/msg/joint_state.hpp>
10+ #include < std_msgs/msg/multi_array_dimension.hpp>
11+
12+ using namespace std ::chrono_literals;
13+
14+ #define INCREMENT 0.1 // rads
15+
16+ std::vector<std::string> name_order = { " shoulder_pan_joint" , " shoulder_lift_joint" , " elbow_joint" ,
17+ " wrist_1_joint" , " wrist_2_joint" , " wrist_3_joint" };
18+
19+ class MinimalDriverTest : public rclcpp ::Node
20+ {
21+ public:
22+ MinimalDriverTest () : Node(" test_driver" ), js_received_(false )
23+ {
24+ publisher_ =
25+ this ->create_publisher <std_msgs::msg::Float64MultiArray>(" forward_command_controller_position/commands" , 10 );
26+ timer_ = this ->create_wall_timer (1500ms, std::bind (&MinimalDriverTest::timer_callback, this ));
27+
28+ subscription_ = this ->create_subscription <sensor_msgs::msg::JointState>(
29+ " joint_states" , 10 , std::bind (&MinimalDriverTest::topic_callback, this , std::placeholders::_1));
30+ }
31+
32+ private:
33+ void timer_callback ()
34+ {
35+ if (!js_received_)
36+ {
37+ RCLCPP_ERROR_STREAM (this ->get_logger (), " Joint states not received" );
38+ return ;
39+ }
40+
41+ if (msg_internal_.position .size () != 6 )
42+ {
43+ RCLCPP_ERROR_STREAM (this ->get_logger (), " Joint states and command size mismatch" );
44+ return ;
45+ }
46+
47+ auto message = std_msgs::msg::Float64MultiArray ();
48+ message.data .resize (6 );
49+ // set up dimensions
50+ message.layout .dim .push_back (std_msgs::msg::MultiArrayDimension ());
51+ message.layout .dim [0 ].size = 6 ;
52+ message.layout .dim [0 ].stride = 1 ;
53+ message.layout .dim [0 ].label = " cmd" ;
54+
55+ for (size_t i = 0 ; i < name_order.size (); ++i)
56+ {
57+ for (size_t j = 0 ; j < msg_internal_.name .size (); ++j)
58+ {
59+ if (msg_internal_.name [j] == name_order[i])
60+ message.data [i] = msg_internal_.position [j] + INCREMENT;
61+ }
62+ }
63+
64+ publisher_->publish (message);
65+ }
66+
67+ void topic_callback (const sensor_msgs::msg::JointState::SharedPtr msg)
68+ {
69+ if (js_received_)
70+ return ;
71+
72+ js_received_ = true ;
73+ msg_internal_ = *msg;
74+ }
75+
76+ rclcpp::Subscription<sensor_msgs::msg::JointState>::SharedPtr subscription_;
77+ rclcpp::TimerBase::SharedPtr timer_;
78+ rclcpp::Publisher<std_msgs::msg::Float64MultiArray>::SharedPtr publisher_;
79+ bool js_received_;
80+ sensor_msgs::msg::JointState msg_internal_;
81+ };
82+
83+ int main (int argc, char * argv[])
84+ {
85+ rclcpp::init (argc, argv);
86+ rclcpp::spin (std::make_shared<MinimalDriverTest>());
87+ rclcpp::shutdown ();
88+ return 0 ;
89+ }
0 commit comments