Program Listing for File conversions.h

Return to documentation for file (include/trimble_driver_ros/conversions.h)

/*
 * Copyright (c) 2024. Trimble Inc.
 * All rights reserved.
 */

#pragma once

#include <GeographicLib/LocalCartesian.hpp>
#include <geometry_msgs/msg/transform_stamped.hpp>
#include <geometry_msgs/msg/vector3.hpp>
#include <nav_msgs/msg/odometry.hpp>
#include <rclcpp/time.hpp>
#include <sensor_msgs/msg/nav_sat_fix.hpp>
#include <trimble_gsof_msgs/msg/all_sv_brief33.hpp>
#include <trimble_gsof_msgs/msg/all_sv_detailed34.hpp>
#include <trimble_gsof_msgs/msg/attitude_info27.hpp>
#include <trimble_gsof_msgs/msg/base_position_and_quality_indicator41.hpp>
#include <trimble_gsof_msgs/msg/battery_memory_info37.hpp>
#include <trimble_gsof_msgs/msg/clock_info10.hpp>
#include <trimble_gsof_msgs/msg/current_time16.hpp>
#include <trimble_gsof_msgs/msg/ecef_delta6.hpp>
#include <trimble_gsof_msgs/msg/ecef_position3.hpp>
#include <trimble_gsof_msgs/msg/ins_vnav_full_nav_info63.hpp>
#include <trimble_gsof_msgs/msg/ins_vnav_rms_info64.hpp>
#include <trimble_gsof_msgs/msg/lat_long_height2.hpp>
#include <trimble_gsof_msgs/msg/lband_status_info40.hpp>
#include <trimble_gsof_msgs/msg/navigation_performance50.hpp>
#include <trimble_gsof_msgs/msg/navigation_solution49.hpp>
#include <trimble_gsof_msgs/msg/pdop_info9.hpp>
#include <trimble_gsof_msgs/msg/position_sigma_info12.hpp>
#include <trimble_gsof_msgs/msg/position_time_info1.hpp>
#include <trimble_gsof_msgs/msg/position_type_information38.hpp>
#include <trimble_gsof_msgs/msg/position_vcv_info11.hpp>
#include <trimble_gsof_msgs/msg/received_base_info35.hpp>
#include <trimble_gsof_msgs/msg/receiver_serial_number15.hpp>
#include <trimble_gsof_msgs/msg/tangent_plane_delta7.hpp>
#include <trimble_gsof_msgs/msg/velocity8.hpp>
#include <type_traits>

#include "trimble_driver/gsof/message.h"

namespace trmb_ros {

template <typename T, typename = std_msgs::msg::Header>
struct HasStdMsgsHeader : std::false_type {};

template <typename T>
struct HasStdMsgsHeader<T, decltype(T::header)> : std::true_type {};

template <typename T>
inline constexpr bool HasStdMsgsHeaderV = HasStdMsgsHeader<T>::value;

template <typename T, typename = trmb::gsof::GpsTime>
struct HasGsofGpsTime : std::false_type {};

template <typename T>
struct HasGsofGpsTime<T, decltype(T::gps_time)> : std::true_type {};

geometry_msgs::msg::TransformStamped toTransformStamped(
    const std_msgs::msg::Header &header,
    const decltype(geometry_msgs::msg::TransformStamped::child_frame_id) &child_frame_id,
    const geometry_msgs::msg::Pose &pose);

nav_msgs::msg::Odometry toOdometry(const trmb::gsof::NavigationSolution &ins_solution,
                                   const GeographicLib::LocalCartesian &local_cartesian);
nav_msgs::msg::Odometry toOdometry(const trmb::gsof::NavigationSolution &ins_solution,
                                   const GeographicLib::LocalCartesian &local_cartesian,
                                   const trmb::gsof::NavigationPerformance &ins_solution_rms);

nav_msgs::msg::Odometry toRep103(const trmb::gsof::NavigationSolution &ins_solution,
                                 const GeographicLib::LocalCartesian &local_cartesian);
nav_msgs::msg::Odometry toRep103(const trmb::gsof::NavigationSolution &ins_solution,
                                 const GeographicLib::LocalCartesian &local_cartesian,
                                 const trmb::gsof::NavigationPerformance &ins_solution_rms);

sensor_msgs::msg::NavSatFix toNavSatFix(const trmb::gsof::PositionTimeInfo &position_time_info,
                                        const trmb::gsof::LatLongHeight &lat_long_height,
                                        const trmb::gsof::PositionSigmaInfo &position_sigma_info);
sensor_msgs::msg::NavSatFix toNavSatFix(const trmb::gsof::NavigationSolution &ins_solution);
sensor_msgs::msg::NavSatFix toNavSatFix(const trmb::gsof::NavigationSolution &ins_solution,
                                        const trmb::gsof::NavigationPerformance &covariance);

sensor_msgs::msg::NavSatStatus toNavSatStatus(const trmb::gsof::PositionTimeInfo &position_time_info);

template <typename T>
geometry_msgs::msg::Point toPoint(const trmb::Xyz<T> &xyz) {
  geometry_msgs::msg::Point p;
  p.x = xyz.x;
  p.y = xyz.y;
  p.z = xyz.z;
  return p;
}

template <typename T>
geometry_msgs::msg::Point toPoint(const trmb::Ned<T> &ned) {
  geometry_msgs::msg::Point p;
  p.x = ned.north;
  p.y = ned.east;
  p.z = ned.down;
  return p;
}

template <typename T>
geometry_msgs::msg::Point toPoint(const trmb::Enu<T> &enu) {
  geometry_msgs::msg::Point p;
  p.x = enu.east;
  p.y = enu.north;
  p.z = enu.up;
  return p;
}

template <typename T>
geometry_msgs::msg::Vector3 toVector(const trmb::Xyz<T> &xyz) {
  geometry_msgs::msg::Vector3 v;
  v.x = static_cast<double>(xyz.x);
  v.y = static_cast<double>(xyz.y);
  v.z = static_cast<double>(xyz.z);
  return v;
}

template <typename T>
geometry_msgs::msg::Vector3 toVector(const trmb::Ned<T> &ned) {
  geometry_msgs::msg::Vector3 v;
  v.x = static_cast<double>(ned.north);
  v.y = static_cast<double>(ned.east);
  v.z = static_cast<double>(ned.down);
  return v;
}

template <typename T>
geometry_msgs::msg::Vector3 toVector(const trmb::Enu<T> &enu) {
  geometry_msgs::msg::Vector3 v;
  v.x = static_cast<double>(enu.east);
  v.y = static_cast<double>(enu.north);
  v.z = static_cast<double>(enu.up);
  return v;
}

template <typename Scalar>
geometry_msgs::msg::Vector3 toVector(const trmb::Rph<Scalar> &rph) {
  geometry_msgs::msg::Vector3 v;
  v.x = static_cast<double>(rph.roll);
  v.y = static_cast<double>(rph.pitch);
  v.z = static_cast<double>(rph.heading);
  return v;
}

namespace gsof {
template <typename T>
trimble_gsof_msgs::msg::LatLongAltitude toRosMessage(const trmb::Lla<T> &lla) {
  trimble_gsof_msgs::msg::LatLongAltitude ros_lla;
  ros_lla.latitude  = lla.latitude;
  ros_lla.longitude = lla.longitude;
  ros_lla.altitude  = lla.altitude;
  return ros_lla;
}

template <typename T>
trimble_gsof_msgs::msg::NorthEastDownf toRosMessage(const trmb::Ned<T> &ned) {
  trimble_gsof_msgs::msg::NorthEastDownf ros_ned;
  ros_ned.north = ned.north;
  ros_ned.east  = ned.east;
  ros_ned.down  = ned.down;
  return ros_ned;
}

trimble_gsof_msgs::msg::Vector3f toVector3f(const trmb::Xyzf &);

trimble_gsof_msgs::msg::EastNorthUpd toRosMessage(const trmb::Enud &enu);
trimble_gsof_msgs::msg::EulerAngle toRosMessage(const trmb::Pyrd &pyr);
trimble_gsof_msgs::msg::LatLongAltitude toRosLla(const trmb::Llad &lla);
trimble_gsof_msgs::msg::LatLongHeight toRosLlh(const trmb::Llad &lla);
}  // namespace gsof

rclcpp::Time toRosTimeOfTheWeek(const trmb::gsof::GpsTime &gps_time);
rclcpp::Time toRosTimeGpsEpoch(const trmb::gsof::GpsTime &gps_time);

trimble_gsof_msgs::msg::GpsTime toRosMessage(const trmb::gsof::GpsTime &gps_time);
trimble_gsof_msgs::msg::Status toRosMessage(const trmb::gsof::Status &status);
trimble_gsof_msgs::msg::Status toRosMessage(const trmb::gsof::VnavStatus &status);

trimble_gsof_msgs::msg::PositionTimeInfo1 toRosMessage(const trmb::gsof::PositionTimeInfo &);
trimble_gsof_msgs::msg::LatLongHeight2 toRosMessage(const trmb::gsof::LatLongHeight &);
trimble_gsof_msgs::msg::EcefPosition3 toRosMessage(const trmb::gsof::EcefPosition &);
trimble_gsof_msgs::msg::EcefDelta6 toRosMessage(const trmb::gsof::EcefDelta &);
trimble_gsof_msgs::msg::TangentPlaneDelta7 toRosMessage(const trmb::gsof::TangentPlaneDelta &);
trimble_gsof_msgs::msg::Velocity8 toRosMessage(const trmb::gsof::Velocity &);
trimble_gsof_msgs::msg::PdopInfo9 toRosMessage(const trmb::gsof::PdopInfo &);
trimble_gsof_msgs::msg::ClockInfo10 toRosMessage(const trmb::gsof::ClockInfo &);
trimble_gsof_msgs::msg::PositionVcvInfo11 toRosMessage(const trmb::gsof::PositionVcvInfo &);
trimble_gsof_msgs::msg::PositionSigmaInfo12 toRosMessage(const trmb::gsof::PositionSigmaInfo &);
trimble_gsof_msgs::msg::ReceiverSerialNumber15 toRosMessage(const trmb::gsof::ReceiverSerialNumber &);
trimble_gsof_msgs::msg::CurrentTime16 toRosMessage(const trmb::gsof::CurrentTime &);
trimble_gsof_msgs::msg::AttitudeVariance toRosMessage(const trmb::gsof::AttitudeInfo::Variance &);
trimble_gsof_msgs::msg::AttitudeInfo27 toRosMessage(const trmb::gsof::AttitudeInfo &);
trimble_gsof_msgs::msg::SpaceVehicleBriefInfo toRosMessage(const trmb::gsof::SVBriefInfo &);
trimble_gsof_msgs::msg::AllSvBrief33 toRosMessage(const trmb::gsof::AllSvBrief &);
trimble_gsof_msgs::msg::SpaceVehicleDetailedInfo toRosMessage(const trmb::gsof::SVDetailedInfo &);
trimble_gsof_msgs::msg::AllSvDetailed34 toRosMessage(const trmb::gsof::AllSvDetailed &);
trimble_gsof_msgs::msg::ReceivedBaseInfo35 toRosMessage(const trmb::gsof::ReceivedBaseInfo &);
trimble_gsof_msgs::msg::BatteryMemoryInfo37 toRosMessage(const trmb::gsof::BatteryMemoryInfo &);
trimble_gsof_msgs::msg::PositionTypeInformation38 toRosMessage(const trmb::gsof::PositionTypeInformation &);
trimble_gsof_msgs::msg::LbandStatusInfo40 toRosMessage(const trmb::gsof::LbandStatusInfo &);
trimble_gsof_msgs::msg::BasePositionAndQualityIndicator41 toRosMessage(
    const trmb::gsof::BasePositionAndQualityIndicator &);
trimble_gsof_msgs::msg::NavigationSolution49 toRosMessage(const trmb::gsof::NavigationSolution &);
trimble_gsof_msgs::msg::NavigationPerformance50 toRosMessage(const trmb::gsof::NavigationPerformance &);
trimble_gsof_msgs::msg::InsVnavFullNavInfo63 toRosMessage(const trmb::gsof::InsVnavFullNavInfo &);
trimble_gsof_msgs::msg::InsVnavRmsInfo64 toRosMessage(const trmb::gsof::InsVnavRmsInfo &);

}  // namespace trmb_ros