19#ifndef __FPSDK_COMMON_ROS2_HPP__
20#define __FPSDK_COMMON_ROS2_HPP__
21#if FPSDK_USE_ROS2 || defined(_DOXYGEN_)
30# pragma GCC diagnostic push
33# pragma GCC diagnostic ignored "-Wshadow"
34# include <rclcpp/rclcpp.hpp>
36# include <rosbag2_cpp/writer.hpp>
37# include <rosbag2_storage/storage_options.hpp>
39# include <nav_msgs/msg/odometry.hpp>
40# include <sensor_msgs/msg/image.hpp>
41# include <sensor_msgs/msg/imu.hpp>
42# include <sensor_msgs/msg/temperature.hpp>
43# include <std_msgs/msg/byte_multi_array.hpp>
44# include <tf2_msgs/msg/tf_message.hpp>
45# pragma GCC diagnostic pop
115 bool Open(
const std::string&
path,
const bool mcap =
false,
const int compress = 0);
132 template <
typename T>
138 bag_->write(msg, topic,
time);
141 }
catch (
const std::exception& ex) {
142 WARNING(
"BagWriter: write fail: %s", ex.what());
155 template <
typename T>
182 std::unique_ptr<rosbag2_cpp::Writer> bag_;
183 std::map<std::string, common::fpl::RosMsgDef> defs_;
198template <
typename Ros1MsgT,
typename Ros2MsgT>
211inline void Ros1ToRos2(
const boost::array<double, 9>&
ros1, std::array<double, 9>&
ros2)
213 for (std::size_t ix = 0; ix < 9; ix++) {
218inline void Ros1ToRos2(
const boost::array<double, 36>& ros1, std::array<double, 36>& ros2)
220 for (std::size_t ix = 0; ix < 36; ix++) {
227inline void Ros1ToRos2(
const std_msgs::Header& ros1, std_msgs::msg::Header& ros2)
229 ros2.frame_id = ros1.frame_id;
235inline void Ros1ToRos2(
const geometry_msgs::Quaternion& ros1, geometry_msgs::msg::Quaternion& ros2)
243inline void Ros1ToRos2(
const geometry_msgs::Vector3& ros1, geometry_msgs::msg::Vector3& ros2)
250inline void Ros1ToRos2(
const geometry_msgs::Point& ros1, geometry_msgs::msg::Point& ros2)
257inline void Ros1ToRos2(
const geometry_msgs::Pose& ros1, geometry_msgs::msg::Pose& ros2)
260 Ros1ToRos2(ros1.orientation, ros2.orientation);
263inline void Ros1ToRos2(
const geometry_msgs::Twist& ros1, geometry_msgs::msg::Twist& ros2)
269inline void Ros1ToRos2(
const geometry_msgs::PoseWithCovariance& ros1, geometry_msgs::msg::PoseWithCovariance& ros2)
275inline void Ros1ToRos2(
const geometry_msgs::TwistWithCovariance& ros1, geometry_msgs::msg::TwistWithCovariance& ros2)
281inline void Ros1ToRos2(
const geometry_msgs::Transform& ros1, geometry_msgs::msg::Transform& ros2)
283 Ros1ToRos2(ros1.translation, ros2.translation);
287inline void Ros1ToRos2(
const geometry_msgs::TransformStamped& ros1, geometry_msgs::msg::TransformStamped& ros2)
290 ros2.child_frame_id = ros1.child_frame_id;
296inline void Ros1ToRos2(
const sensor_msgs::Imu& ros1, sensor_msgs::msg::Imu& ros2)
299 Ros1ToRos2(ros1.orientation, ros2.orientation);
300 Ros1ToRos2(ros1.orientation_covariance, ros2.orientation_covariance);
301 Ros1ToRos2(ros1.angular_velocity, ros2.angular_velocity);
302 Ros1ToRos2(ros1.angular_velocity_covariance, ros2.angular_velocity_covariance);
303 Ros1ToRos2(ros1.linear_acceleration, ros2.linear_acceleration);
304 Ros1ToRos2(ros1.linear_acceleration_covariance, ros2.linear_acceleration_covariance);
307inline void Ros1ToRos2(
const sensor_msgs::Temperature& ros1, sensor_msgs::msg::Temperature& ros2)
310 ros2.temperature = ros1.temperature;
311 ros2.variance = ros1.variance;
314inline void Ros1ToRos2(
const sensor_msgs::Image& ros1, sensor_msgs::msg::Image& ros2)
317 ros2.height = ros1.height;
318 ros2.width = ros1.width;
319 ros2.encoding = ros1.encoding;
320 ros2.step = ros1.step;
321 ros2.data = ros1.data;
326inline void Ros1ToRos2(
const nav_msgs::Odometry& ros1, nav_msgs::msg::Odometry& ros2)
329 ros2.child_frame_id = ros1.child_frame_id;
336inline void Ros1ToRos2(
const tf2_msgs::TFMessage& ros1, tf2_msgs::msg::TFMessage& ros2)
338 for (
auto& tf_ros1 : ros1.transforms) {
339 geometry_msgs::msg::TransformStamped tf_ros2;
341 ros2.transforms.push_back(std::move(tf_ros2));
bool Open(const std::string &path, const bool mcap=false, const int compress=0)
Open bag for writing.
void AddMsgDef(const common::fpl::RosMsgDef &rosmsgdef)
Add ROS message definition from .fpl.
bool WriteMessage(const T &msg, const std::string &topic, const rclcpp::Time &time)
Write a message to the bag.
bool WriteMessage(const T &msg, const std::string &topic, const common::time::RosTime &time)
Write a message to the bag.
bool WriteMessage(const common::fpl::RosMsgBin &rosmsgbin)
Write message from .fpl.
#define WARNING(...)
Print a warning message.
void RedirectLoggingToRosConsole(const char *logger_name="fpsdk_common")
Redirect fp:common::logging to ROS console.
rclcpp::Time ConvTime(const fpsdk::common::time::Time &time, rcl_clock_type_t clock_type=RCL_ROS_TIME)
Convert to ROS time (atomic -> POSIX).
void Ros1ToRos2(Ros1MsgT &ros1, Ros2MsgT &ros2)
Convert ROS1 message to ROS2 message.
Fixposition SDK: Common library.
Fixposition SDK: ROS1 types and utils.
Helper for extracting a serialised ROS message.
Helper for extracting ROS message definition (the relevant fields from the "connection header").
Minimal ros::Time() / rplcpp::Time implementation (that doesn't throw).
Fixposition SDK: Time utilities.