mvsim_node_main.cpp
Go to the documentation of this file.
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2023 Jose Luis Blanco Claraco |
5  | Copyright (C) 2017 Borys Tymchenko (Odessa Polytechnic University) |
6  | Distributed under 3-clause BSD License |
7  | See COPYING |
8  +-------------------------------------------------------------------------+ */
9 
10 #include <mrpt/core/round.h>
11 
12 #include "mvsim/mvsim_node_core.h"
13 
14 /*------------------------------------------------------------------------------
15  * main()
16  * Main function to set up ROS node->
17  *----------------------------------------------------------------------------*/
18 
19 int main(int argc, char** argv)
20 {
21  // Set up ROS.
22 #if PACKAGE_ROS_VERSION == 1
23  ros::init(argc, argv, "mvsim");
25 #else
26  rclcpp::init(argc, argv);
27  auto n = rclcpp::Node::make_shared("mvsim");
28 #endif
29 
30  try
31  {
32  // Create a "Node" object.
33  std::shared_ptr<MVSimNode> node = std::make_shared<MVSimNode>(n);
34 
35  // Declare variables that can be modified by launch file or command
36  // line.
37  std::string world_file;
38 
39  double rate = 100.0;
40 
41 #if PACKAGE_ROS_VERSION == 1
42 
43  // Initialize node parameters from launch file or command line.
44  // Use a private node handle so that multiple instances of the node can
45  // be run simultaneously while using different parameters.
46  ros::NodeHandle private_node_handle_("~");
47  private_node_handle_.param("simul_rate", rate, 100.0);
48  private_node_handle_.param("world_file", world_file, std::string(""));
49 #else
50  n->get_parameter("world_file", world_file);
51  n->get_parameter("simul_rate", rate);
52  ASSERT_(rate > 0);
53  const auto periodMs = mrpt::round(1e6 / static_cast<double>(rate));
54 #endif
55 
56  // Launch mvsim:
57  node->launch_mvsim_server();
58 
59  // Init world model:
60  if (!world_file.empty()) node->loadWorldModel(world_file);
61 
62  // Attach world as a mvsim communications node:
63  node->mvsim_world_->headless(node->headless_);
64  node->mvsim_world_->connectToServer();
65 
66 #if PACKAGE_ROS_VERSION == 1
67  // Set up a dynamic reconfigure server.
68  // Do this before parameter server, else some of the parameter server
69  // values can be overwritten.
70  dynamic_reconfigure::Server<mvsim::mvsimNodeConfig> dr_srv;
71  dynamic_reconfigure::Server<mvsim::mvsimNodeConfig>::CallbackType cb;
72  cb = boost::bind(&MVSimNode::configCallback, node.get(), _1, _2);
73  dr_srv.setCallback(cb);
74 #endif
75 
76  // Tell ROS how fast to run this node->
77 #if PACKAGE_ROS_VERSION == 1
78  ros::Rate r(rate);
79 
80  // Main loop.
81  while (n.ok())
82  {
83  node->spin();
84  ros::spinOnce();
85  r.sleep();
86  }
87 #else
88  auto ros_clock = rclcpp::Clock::make_shared();
89  auto timer_ = rclcpp::create_timer(
90  n, ros_clock, std::chrono::microseconds(periodMs), [&]() {
91  if (rclcpp::ok()) node->spin();
92  });
93 
94  rclcpp::on_shutdown([&]() {
95  std::cout << "[rclcpp::on_shutdown] Destroying MVSIM node..."
96  << std::endl;
97  node->terminateSimulation();
98  std::cout << "[rclcpp::on_shutdown] MVSIM node destroyed."
99  << std::endl;
100  });
101 
102  rclcpp::spin(n);
103  rclcpp::shutdown();
104 #endif
105 
106  return 0;
107  }
108  catch (const std::exception& e)
109  {
110 #if PACKAGE_ROS_VERSION == 1
111  std::cerr << e.what() << std::endl;
112 #else
113  RCLCPP_ERROR_STREAM(
114  n->get_logger(), "Exception in main node body:\n"
115  << e.what());
116 #endif
117  return 1;
118  }
119 
120 } // end main()
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
bool param(const std::string &param_name, T &param_val, const T &default_val) const
int main(int argc, char **argv)
bool sleep()
ROSCPP_DECL void spinOnce()
bool ok() const


mvsim
Author(s):
autogenerated on Tue Jul 4 2023 03:08:21