Program Listing for File geometry.hpp

Return to documentation for file (include/rp_utils/geometry.hpp)

#ifndef RP_UTILS_GEOMETRY_HPP_
#define RP_UTILS_GEOMETRY_HPP_

#include <rclcpp/duration.hpp>

#include <geometry_msgs/msg/pose_array.hpp>
#include <rclcpp/rclcpp.hpp>
#include <tf2_geometry_msgs/tf2_geometry_msgs.hpp>
#include <tf2_ros/buffer.h>
#include <tf2_ros/transform_listener.h>

namespace rp_utils::geometry
{

geometry_msgs::msg::PoseArray Transform(const geometry_msgs::msg::PoseArray &input_array,
                                        const std::string &target_frame,
                                        const std::shared_ptr<tf2_ros::Buffer> &tf_buffer,
                                        const tf2::Duration &timeout = tf2::durationFromSec(0.1))
{
    geometry_msgs::msg::PoseArray transformed_array;
    transformed_array.header.frame_id = target_frame;
    transformed_array.header.stamp = input_array.header.stamp;

    for (const auto &pose : input_array.poses)
    {
        geometry_msgs::msg::PoseStamped pose_stamped;
        pose_stamped.header = input_array.header;
        pose_stamped.pose = pose;

        // Transform pose to the desired frame
        geometry_msgs::msg::PoseStamped transformed_pose;
        transformed_pose = tf_buffer->transform(pose_stamped, target_frame, timeout);

        transformed_array.poses.push_back(transformed_pose.pose);
    }

    return transformed_array;
}

} // namespace rp_utils::geometry

#endif // RP_UTILS_GEOMETRY_HPP_