Program Listing for File imu_ros2_node.cpp

Return to documentation for file (src/imu_ros2_node.cpp)

/***************************************************************************/
#include "adi_imu/accelgyrotemp_data_provider.h"
#include "adi_imu/accelgyrotemp_ros_publisher.h"
#include "adi_imu/imu_control_parameters.h"
#include "adi_imu/imu_data_provider.h"
#include "adi_imu/imu_diag_data_provider.h"
#include "adi_imu/imu_diag_ros_publisher.h"
#include "adi_imu/imu_full_measured_data_provider.h"
#include "adi_imu/imu_full_measured_data_ros_publisher.h"
#include "adi_imu/imu_identification_data_provider.h"
#include "adi_imu/imu_identification_ros_publisher.h"
#include "adi_imu/imu_ros_publisher.h"
#include "adi_imu/ros_publisher_group.h"
#include "adi_imu/ros_publisher_group_interface.h"
#ifdef ADIS_HAS_DELTA_BURST
#include "adi_imu/velangtemp_data_provider.h"
#include "adi_imu/velangtemp_ros_publisher.h"
#endif

#include "adi_imu/worker_thread.h"
#include "rclcpp/rclcpp.hpp"

int main(int argc, char * argv[])
{
  int ret;
  rclcpp::init(argc, argv);

  std::shared_ptr<rclcpp::Node> imu_node = rclcpp::Node::make_shared("adi_imu_node");

  std::thread::id this_id = std::this_thread::get_id();
  std::cout << "mainthread " << this_id << " running...\n";
  RCLCPP_INFO(rclcpp::get_logger("rclcpp_main"), "running: main thread");

  auto param_desc = rcl_interfaces::msg::ParameterDescriptor{};
  param_desc.description =
    "\nDefault value is \'local:\', to be used when the adi_imu node is running locally."
    "\nIf the adi_imu node is running remotely, please use \'ip:rpi_ip_address\',";

  imu_node->declare_parameter("iio_context_string", "local:", param_desc);

  /* First make sure IIO context is available */
  std::string context =
    imu_node->get_parameter("iio_context_string").get_parameter_value().get<std::string>();
  IIOWrapper m_iio_wrapper;
  ret = m_iio_wrapper.createContext(context.c_str());

  if (ret) {
    std::runtime_error("Error IIO context, exiting ROS2 node");
    rclcpp::shutdown();
    return 0;
  }
  ImuControlParameters * ctrl_params = new ImuControlParameters(imu_node);

  AccelGyroTempDataProviderInterface * accel_gyro_data_provider = new AccelGyroTempDataProvider();
  AccelGyroTempRosPublisherInterface * accel_gyro_publisher =
    new AccelGyroTempRosPublisher(imu_node);
  accel_gyro_publisher->setMessageProvider(accel_gyro_data_provider);

  ImuDataProviderInterface * imu_std_data_provider = new ImuDataProvider();
  ImuRosPublisherInterface * imu_std_publisher = new ImuRosPublisher(imu_node);
  imu_std_publisher->setMessageProvider(imu_std_data_provider);

#ifdef ADIS_HAS_DELTA_BURST
  VelAngTempDataProviderInterface * vel_ang_data_provider = new VelAngTempDataProvider();
  VelAngTempRosPublisherInterface * vel_ang_publisher = new VelAngTempRosPublisher(imu_node);
  vel_ang_publisher->setMessageProvider(vel_ang_data_provider);
#endif

  ImuFullMeasuredDataProviderInterface * full_data_provider = new ImuFullMeasuredDataProvider();
  ImuFullMeasuredDataRosPublisherInterface * full_data_publisher =
    new ImuFullMeasuredDataRosPublisher(imu_node);
  full_data_publisher->setMessageProvider(full_data_provider);

  RosPublisherGroupInterface * publisher_group = new RosPublisherGroup(imu_node);
  publisher_group->setAccelGyroTempRosPublisher(accel_gyro_publisher);
#ifdef ADIS_HAS_DELTA_BURST
  publisher_group->setVelAngTempRosPublisher(vel_ang_publisher);
#endif
  publisher_group->setImuRosPublisher(imu_std_publisher);
  publisher_group->setImuFullMeasuredDataRosPublisher(full_data_publisher);
  publisher_group->setImuControlParameters(ctrl_params);

  RosTask * publisher_group_task = dynamic_cast<RosTask *>(publisher_group);

  ImuIdentificationDataProviderInterface * ident_data_provider =
    new ImuIdentificationDataProvider();
  ImuIdentificationRosPublisherInterface * ident_publisher =
    new ImuIdentificationRosPublisher(imu_node);
  ident_publisher->setMessageProvider(ident_data_provider);
  RosTask * ident_task = dynamic_cast<RosTask *>(ident_publisher);

  ImuDiagDataProviderInterface * diag_data_provider = nullptr;
  ImuDiagRosPublisherInterface * diag_publisher = nullptr;
  RosTask * diag_task = nullptr;

  diag_data_provider = new ImuDiagDataProvider();
  diag_publisher = new ImuDiagRosPublisher(imu_node);
  diag_publisher->setMessageProvider(diag_data_provider);

  diag_task = dynamic_cast<RosTask *>(diag_publisher);

  WorkerThread publisher_group_thread(publisher_group_task);
  WorkerThread ident_thread(ident_task);
  WorkerThread diag_thread(diag_task);

  diag_thread.join();
  ident_thread.join();
  publisher_group_thread.join();

  delete ctrl_params;
  delete accel_gyro_publisher;
#ifdef ADIS_HAS_DELTA_BURST
  delete vel_ang_publisher;
#endif
  delete imu_std_publisher;
  delete full_data_publisher;
  delete ident_publisher;
  delete diag_publisher;

  rclcpp::shutdown();

  return 0;
}