Program Listing for File default_converter.hpp

Return to documentation for file (/tmp/ws/src/off_highway_sensor_drivers/off_highway_premium_radar/include/off_highway_premium_radar/converters/default_converter.hpp)

// Copyright 2023 Robert Bosch GmbH and its subsidiaries
//
// 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.

#pragma once

#include <memory>
#include <string>
#include <chrono>

#include "diagnostic_updater/publisher.hpp"
#include "rclcpp/rclcpp.hpp"
#include "sensor_msgs/msg/point_cloud2.hpp"

#include "off_highway_premium_radar_msgs/msg/location_attributes.hpp"
#include "off_highway_premium_radar_msgs/msg/location_data_header.hpp"
#include "off_highway_premium_radar_msgs/msg/sensor_broadcast.hpp"
#include "off_highway_premium_radar_msgs/msg/sensor_dtc_information.hpp"
#include "off_highway_premium_radar_msgs/msg/sensor_feedback.hpp"
#include "off_highway_premium_radar_msgs/msg/sensor_state_information.hpp"

#include "off_highway_premium_radar_msgs/msg/ego_vehicle_input.hpp"
#include "off_highway_premium_radar_msgs/srv/measurement_program.hpp"
#include "off_highway_premium_radar_msgs/srv/sensor_mode_request.hpp"

#include "off_highway_premium_radar/interface/converter.hpp"

namespace off_highway_premium_radar
{

class DefaultConverter : public Converter
{
public:
  DefaultConverter();

  void on_configure() override;

private:
  // Publish
  void on_location_data(const LocationData & data) override;

  void on_sensor_feedback(const SensorFeedback & data) override;

  void on_sensor_state_information(const SensorStateInformation & data) override;

  void on_sensor_broadcast(const SensorBroadcast & data) override;

  void on_location_attributes(const LocationAttributes & data) override;

  void on_sensor_dtc_information(const SensorDTCInformation & data) override;

  template<typename Input, class Publisher, class TopicDiagnostic>
  void publish_tick_diag(const Input & i, const Publisher & p, const TopicDiagnostic & d)
  {
    publish_tick_diag(i, p, d, clock_->now());
  }

  template<typename Input, class Publisher, class TopicDiagnostic>
  void publish_tick_diag(
    const Input & i, const Publisher & p, const TopicDiagnostic & d,
    const rclcpp::Time & stamp)
  {
    d->tick(stamp);

    if (!p->get_subscription_count()) {
      // Do not publish if no one is subscribed
      return;
    }

    auto msg = to_msg(i, stamp, frame_id_);

    p->publish(msg);
  }

  // Subscribe
  void on_ego_vehicle_data(
    const off_highway_premium_radar_msgs::msg::EgoVehicleInput::SharedPtr msg);

  void send_measurement_cycle_sync();

  void on_sensor_mode_request(
    const off_highway_premium_radar_msgs::srv::SensorModeRequest::Request::SharedPtr request,
    off_highway_premium_radar_msgs::srv::SensorModeRequest::Response::SharedPtr response);

  void on_measurement_program(
    const off_highway_premium_radar_msgs::srv::MeasurementProgram::Request::SharedPtr request,
    off_highway_premium_radar_msgs::srv::MeasurementProgram::Response::SharedPtr response);

  void declare_and_get_parameters();

  std::string name_{"default_converter"};

  // Parameters
  bool synchronize_measurement_cycle_{false};
  uint32_t sensor_time_offset_{0};
  bool send_ego_vehicle_data_{false};

  rclcpp::TimerBase::SharedPtr sensor_sync_timer_;
  static constexpr std::chrono::milliseconds kSendSyncPeriod{50};

  // Publishers
  rclcpp::Publisher<sensor_msgs::msg::PointCloud2>::SharedPtr publisher_locations_;
  rclcpp::Publisher<off_highway_premium_radar_msgs::msg::LocationDataHeader>::SharedPtr
    publisher_locations_header_;
  rclcpp::Publisher<off_highway_premium_radar_msgs::msg::SensorFeedback>::SharedPtr
    publisher_sensor_feedback_;
  rclcpp::Publisher<off_highway_premium_radar_msgs::msg::SensorStateInformation>::SharedPtr
    publisher_sensor_state_information_;
  rclcpp::Publisher<off_highway_premium_radar_msgs::msg::SensorBroadcast>::SharedPtr
    publisher_sensor_broadcast_;
  rclcpp::Publisher<off_highway_premium_radar_msgs::msg::LocationAttributes>::SharedPtr
    publisher_location_attributes_;
  rclcpp::Publisher<off_highway_premium_radar_msgs::msg::SensorDtcInformation>::SharedPtr
    publisher_sensor_dtc_information_;

  // Subscriptions
  rclcpp::Subscription<off_highway_premium_radar_msgs::msg::EgoVehicleInput>::SharedPtr
    subscriber_ego_vehicle_input_;

  // Services
  rclcpp::Service<off_highway_premium_radar_msgs::srv::MeasurementProgram>::SharedPtr
    measurement_program_service_;
  rclcpp::Service<off_highway_premium_radar_msgs::srv::SensorModeRequest>::SharedPtr
    sensor_mode_request_service_;

  std::shared_ptr<diagnostic_updater::Updater> diag_updater_;

  using TopicDiagnosticSharedPtr = std::shared_ptr<diagnostic_updater::TopicDiagnostic>;
  // Output
  TopicDiagnosticSharedPtr diag_locations_;
  TopicDiagnosticSharedPtr diag_sensor_feedback_;
  TopicDiagnosticSharedPtr diag_sensor_state_information_;
  TopicDiagnosticSharedPtr diag_sensor_broadcast_;
  TopicDiagnosticSharedPtr diag_location_attributes_;
  // Input
  TopicDiagnosticSharedPtr diag_ego_vehicle_data_;

  struct Limit
  {
    double min;
    double max;
  };

  // Diagnosis timestamp and frequency limits (set in ctor)
  static constexpr Limit diag_timestamps_{0.0, 0.1};
  Limit diag_frequencies_locations_;
  Limit diag_frequencies_sensor_feedback_;
  Limit diag_frequencies_sensor_state_information_;
  Limit diag_frequencies_sensor_broadcast_;
  Limit diag_frequencies_ego_vehicle_data_;
};

}  // namespace off_highway_premium_radar