Program Listing for File rosmsgs_datagram_converter.hpp

Return to documentation for file (/tmp/ws/src/locator_ros_bridge/bosch_locator_bridge/include/bosch_locator_bridge/rosmsgs_datagram_converter.hpp)

// Copyright (c) 2021 - for information on the respective copyright owner
// see the NOTICE file and/or the repository https://github.com/boschglobal/locator_ros_bridge.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef BOSCH_LOCATOR_BRIDGE__ROSMSGS_DATAGRAM_CONVERTER_HPP_
#define BOSCH_LOCATOR_BRIDGE__ROSMSGS_DATAGRAM_CONVERTER_HPP_

#include <Poco/BinaryReader.h>
#include <Poco/JSON/Object.h>

#include <algorithm>
#include <iostream>
#include <vector>

#include "geometry_msgs/msg/pose_array.hpp"
#include "geometry_msgs/msg/pose_stamped.hpp"
#include "geometry_msgs/msg/pose2_d.hpp"
#include "nav_msgs/msg/odometry.hpp"
#include "pcl/point_cloud.h"
#include "pcl/point_types.h"
#include "rclcpp/rclcpp.hpp"
#include "sensor_msgs/msg/laser_scan.hpp"
#include "sensor_msgs/msg/point_cloud2.hpp"

#include "bosch_locator_bridge/msg/client_control_mode.hpp"
#include "bosch_locator_bridge/msg/client_global_align_visualization.hpp"
#include "bosch_locator_bridge/msg/client_map_visualization.hpp"
#include "bosch_locator_bridge/msg/client_localization_pose.hpp"
#include "bosch_locator_bridge/msg/client_localization_visualization.hpp"
#include "bosch_locator_bridge/msg/client_recording_visualization.hpp"

#define MAP_FRAME_ID "map"
#define ODOM_FRAME_ID "odom"

class RosMsgsDatagramConverter
{
public:
  static size_t convertClientControlMode2Message(
    const std::vector<char> & datagram, const rclcpp::Time & stamp,
    bosch_locator_bridge::msg::ClientControlMode & client_control_mode);

  static size_t convertMapDatagram2Message(
    const std::vector<char> & datagram, const rclcpp::Time & stamp,
    sensor_msgs::msg::PointCloud2 & out_pointcloud);

  static size_t convertClientGlobalAlignVisualizationDatagram2Message(
    const std::vector<char> & datagram,
    bosch_locator_bridge::msg::ClientGlobalAlignVisualization & client_global_align_visualization,
    geometry_msgs::msg::PoseArray & poses, geometry_msgs::msg::PoseArray & landmark_poses);

  static size_t convertClientLocalizationPoseDatagram2Message(
    const std::vector<char> & datagram,
    bosch_locator_bridge::msg::ClientLocalizationPose & client_localization_pose,
    geometry_msgs::msg::PoseStamped & pose, double covariance[6],
    geometry_msgs::msg::PoseStamped & lidar_odo_pose);

  static size_t convertClientLocalizationVisualizationDatagram2Message(
    const std::vector<char> & datagram,
    bosch_locator_bridge::msg::ClientLocalizationVisualization & client_localization_visualization,
    geometry_msgs::msg::PoseStamped & pose, sensor_msgs::msg::PointCloud2 & scan);

  static size_t convertClientMapVisualizationDatagram2Message(
    const std::vector<char> & datagram,
    bosch_locator_bridge::msg::ClientMapVisualization & client_map_visualization,
    geometry_msgs::msg::PoseStamped & pose, sensor_msgs::msg::PointCloud2 & scan,
    geometry_msgs::msg::PoseArray & path_poses);

  static size_t convertClientRecordingVisualizationDatagram2Message(
    const std::vector<char> & datagram,
    bosch_locator_bridge::msg::ClientRecordingVisualization & client_recording_visualization,
    geometry_msgs::msg::PoseStamped & pose, sensor_msgs::msg::PointCloud2 & scan,
    geometry_msgs::msg::PoseArray & path_poses);

  static size_t convertPose2DDoubleDatagram2Message(
    Poco::BinaryReader & binary_reader,
    geometry_msgs::msg::Pose & pose);

  static size_t convertPose2DSingleDatagram2Message(
    Poco::BinaryReader & binary_reader,
    geometry_msgs::msg::Pose & pose);

  static Poco::Buffer<char> convertLaserScan2DataGram(
    const sensor_msgs::msg::LaserScan::SharedPtr msg, size_t scan_num,
    rclcpp::Node::SharedPtr node);

  static Poco::Buffer<char> convertOdometry2DataGram(
    const nav_msgs::msg::Odometry::SharedPtr msg, size_t odom_num, rclcpp::Node::SharedPtr node);

  static Poco::JSON::Object makePose2d(const geometry_msgs::msg::Pose2D & pose);

private:
  static size_t convertMapDatagram2Message(
    Poco::BinaryReader & binary_reader, const rclcpp::Time & stamp,
    sensor_msgs::msg::PointCloud2 & out_pointcloud);
  static size_t convertMapDatagram2PointCloud(
    Poco::BinaryReader & binary_reader,
    pcl::PointCloud<pcl::PointXYZRGB> & out_pointcloud);
  static void colorizePointCloud(
    pcl::PointCloud<pcl::PointXYZRGB> & point_cloud,
    const std::vector<uint64_t> & sensor_offsets);
  static size_t discardExtension(Poco::BinaryReader & binary_reader);
  static void readIntensities(Poco::BinaryReader & binary_reader);
  static std::vector<uint64_t> readSensorOffsets(Poco::BinaryReader & binary_reader);

  static float clamp_range(float r, float min, float max)
  {
    return std::min({std::max({r, min}), max});
  }
};

#endif  // BOSCH_LOCATOR_BRIDGE__ROSMSGS_DATAGRAM_CONVERTER_HPP_