2121#include < memory>
2222#include < string>
2323
24+ #include " imu_sensor_broadcaster/imu_transform.hpp"
25+
2426namespace imu_sensor_broadcaster
2527{
2628controller_interface::CallbackReturn IMUSensorBroadcaster::on_init ()
2729{
2830 try
2931 {
3032 param_listener_ = std::make_shared<ParamListener>(get_node ());
31- params_ = param_listener_->get_params ();
3233 }
3334 catch (const std::exception & e)
3435 {
@@ -43,7 +44,20 @@ controller_interface::CallbackReturn IMUSensorBroadcaster::on_init()
4344controller_interface::CallbackReturn IMUSensorBroadcaster::on_configure (
4445 const rclcpp_lifecycle::State & /* previous_state*/ )
4546{
46- params_ = param_listener_->get_params ();
47+ try
48+ {
49+ params_ = param_listener_->get_params ();
50+ r_ = quat_from_euler (
51+ params_.rotation_offset .roll , params_.rotation_offset .pitch , params_.rotation_offset .yaw );
52+ r_.normalize ();
53+ }
54+ catch (const std::exception & e)
55+ {
56+ RCLCPP_ERROR (
57+ get_node ()->get_logger (), " Exception thrown during config stage with message: %s \n " ,
58+ e.what ());
59+ return CallbackReturn::ERROR;
60+ }
4761
4862 imu_sensor_ = std::make_unique<semantic_components::IMUSensor>(
4963 semantic_components::IMUSensor (params_.sensor_name ));
@@ -62,18 +76,15 @@ controller_interface::CallbackReturn IMUSensorBroadcaster::on_configure(
6276 return CallbackReturn::ERROR;
6377 }
6478
65- realtime_publisher_->lock ();
66- realtime_publisher_->msg_ .header .frame_id = params_.frame_id ;
79+ state_message_.header .frame_id = params_.frame_id ;
6780 // convert double vector to fixed-size array in the message
6881 for (size_t i = 0 ; i < 9 ; ++i)
6982 {
70- realtime_publisher_->msg_ .orientation_covariance [i] = params_.static_covariance_orientation [i];
71- realtime_publisher_->msg_ .angular_velocity_covariance [i] =
72- params_.static_covariance_angular_velocity [i];
73- realtime_publisher_->msg_ .linear_acceleration_covariance [i] =
83+ state_message_.orientation_covariance [i] = params_.static_covariance_orientation [i];
84+ state_message_.angular_velocity_covariance [i] = params_.static_covariance_angular_velocity [i];
85+ state_message_.linear_acceleration_covariance [i] =
7486 params_.static_covariance_linear_acceleration [i];
7587 }
76- realtime_publisher_->unlock ();
7788
7889 RCLCPP_DEBUG (get_node ()->get_logger (), " configure successful" );
7990 return CallbackReturn::SUCCESS;
@@ -110,22 +121,76 @@ controller_interface::CallbackReturn IMUSensorBroadcaster::on_deactivate(
110121 return CallbackReturn::SUCCESS;
111122}
112123
113- controller_interface::return_type IMUSensorBroadcaster::update (
124+ controller_interface::return_type IMUSensorBroadcaster::update_and_write_commands (
114125 const rclcpp::Time & time, const rclcpp::Duration & /* period*/ )
115126{
116- if (realtime_publisher_ && realtime_publisher_->trylock ())
127+ sensor_msgs::msg::Imu input_imu{state_message_};
128+ imu_sensor_->get_values_as_message (input_imu);
129+ do_transform (state_message_, input_imu, r_);
130+
131+ if (realtime_publisher_)
117132 {
118- realtime_publisher_->msg_ .header .stamp = time;
119- imu_sensor_->get_values_as_message (realtime_publisher_->msg_ );
120- realtime_publisher_->unlockAndPublish ();
133+ state_message_.header .stamp = time;
134+ realtime_publisher_->try_publish (state_message_);
121135 }
122136
123137 return controller_interface::return_type::OK;
124138}
125139
140+ controller_interface::return_type IMUSensorBroadcaster::update_reference_from_subscribers (
141+ const rclcpp::Time & /* time*/ , const rclcpp::Duration & /* period*/ )
142+ {
143+ return controller_interface::return_type::OK;
144+ }
145+
146+ std::vector<hardware_interface::StateInterface> IMUSensorBroadcaster::on_export_state_interfaces ()
147+ {
148+ std::vector<hardware_interface::StateInterface> exported_state_interfaces;
149+
150+ std::string export_prefix = get_node ()->get_name ();
151+ if (!params_.sensor_name .empty ())
152+ {
153+ // Update the prefix and get the proper IMU sensor naming
154+ export_prefix = export_prefix + " /" + params_.sensor_name ;
155+ }
156+
157+ exported_state_interfaces.emplace_back (
158+ hardware_interface::StateInterface (
159+ export_prefix, " orientation.x" , &state_message_.orientation .x ));
160+ exported_state_interfaces.emplace_back (
161+ hardware_interface::StateInterface (
162+ export_prefix, " orientation.y" , &state_message_.orientation .y ));
163+ exported_state_interfaces.emplace_back (
164+ hardware_interface::StateInterface (
165+ export_prefix, " orientation.z" , &state_message_.orientation .z ));
166+ exported_state_interfaces.emplace_back (
167+ hardware_interface::StateInterface (
168+ export_prefix, " orientation.w" , &state_message_.orientation .w ));
169+ exported_state_interfaces.emplace_back (
170+ hardware_interface::StateInterface (
171+ export_prefix, " angular_velocity.x" , &state_message_.angular_velocity .x ));
172+ exported_state_interfaces.emplace_back (
173+ hardware_interface::StateInterface (
174+ export_prefix, " angular_velocity.y" , &state_message_.angular_velocity .y ));
175+ exported_state_interfaces.emplace_back (
176+ hardware_interface::StateInterface (
177+ export_prefix, " angular_velocity.z" , &state_message_.angular_velocity .z ));
178+ exported_state_interfaces.emplace_back (
179+ hardware_interface::StateInterface (
180+ export_prefix, " linear_acceleration.x" , &state_message_.linear_acceleration .x ));
181+ exported_state_interfaces.emplace_back (
182+ hardware_interface::StateInterface (
183+ export_prefix, " linear_acceleration.y" , &state_message_.linear_acceleration .y ));
184+ exported_state_interfaces.emplace_back (
185+ hardware_interface::StateInterface (
186+ export_prefix, " linear_acceleration.z" , &state_message_.linear_acceleration .z ));
187+
188+ return exported_state_interfaces;
189+ }
190+
126191} // namespace imu_sensor_broadcaster
127192
128193#include " pluginlib/class_list_macros.hpp"
129194
130195PLUGINLIB_EXPORT_CLASS (
131- imu_sensor_broadcaster::IMUSensorBroadcaster, controller_interface::ControllerInterface )
196+ imu_sensor_broadcaster::IMUSensorBroadcaster, controller_interface::ChainableControllerInterface )
0 commit comments