Formula Student Autonomous Systems
The code for the main driverless system
Loading...
Searching...
No Matches
pacsim.cpp
Go to the documentation of this file.
2
4#include "custom_interfaces/msg/cone.hpp"
5#include "custom_interfaces/msg/cone_array.hpp"
6#include "custom_interfaces/msg/point2d.hpp"
7#include "custom_interfaces/msg/velocities.hpp"
9
11 rclcpp::SubscriptionOptions subscription_options;
12 subscription_options.callback_group = this->_callback_group_;
13 if (params.use_simulated_perception_) {
14 if (params.slam_solver_name_ == "ekf_slam" && params.slam_optimization_mode_ == "async") {
16 this->create_callback_group(rclcpp::CallbackGroupType::Reentrant);
17 rclcpp::SubscriptionOptions parallel_opts;
18 parallel_opts.callback_group = _parallel_callback_group_;
19
21 this->create_subscription<pacsim::msg::PerceptionDetections>(
22 "/pacsim/perception/lidar/landmarks", 1,
24 std::placeholders::_1),
25 parallel_opts);
26 } else {
28 this->create_subscription<pacsim::msg::PerceptionDetections>(
29 "/pacsim/perception/lidar/landmarks", 1,
31 std::placeholders::_1));
32 }
33 }
34
35 if (params.use_simulated_velocities_) {
37 this->create_subscription<geometry_msgs::msg::TwistWithCovarianceStamped>(
38 "/pacsim/velocity", 1,
40 std::placeholders::_1),
41 subscription_options);
42 }
43
44 this->_imu_subscription_ = this->create_subscription<sensor_msgs::msg::Imu>(
45 "/pacsim/imu/cog_imu", 1,
46 std::bind(&PacsimAdapter::_pacsim_imu_subscription_callback, this, std::placeholders::_1),
47 subscription_options);
48
49 this->_finished_client_ = this->create_client<std_srvs::srv::Empty>("/pacsim/finish_signal");
51 this->create_client<rcl_interfaces::srv::GetParameters>("/pacsim/pacsim_node/get_parameters");
53
54 this->_go_ = true; // No go signal needed for pacsim
55}
56
58 if (!param_client_->wait_for_service(std::chrono::milliseconds(100))) {
59 RCLCPP_ERROR(this->get_logger(), "Service /pacsim/pacsim_node/get_parameters not available.");
60 } else {
61 auto request = std::make_shared<rcl_interfaces::srv::GetParameters::Request>();
62 request->names.push_back("discipline");
63
64 param_client_->async_send_request(
65 request, [this](rclcpp::Client<rcl_interfaces::srv::GetParameters>::SharedFuture future) {
66 auto response = future.get();
68 common_lib::competition_logic::Mission::AUTOCROSS;
69
70 if (!response->values.empty() && response->values[0].type == 4) { // Type 4 = string
71 std::string discipline = response->values[0].string_value;
72 RCLCPP_INFO(this->get_logger(), "Discipline received: %s", discipline.c_str());
73
74 if (discipline == "skidpad") {
75 mission_result = common_lib::competition_logic::Mission::SKIDPAD;
76 } else if (discipline == "acceleration") {
77 mission_result = common_lib::competition_logic::Mission::ACCELERATION;
78 } else if (discipline == "trackdrive") {
79 mission_result = common_lib::competition_logic::Mission::TRACKDRIVE;
80 }
81 } else {
82 RCLCPP_ERROR(this->get_logger(), "Failed to retrieve discipline parameter.");
83 }
84 this->_mission_ = mission_result;
85 this->_slam_solver_->set_mission(mission_result);
86 });
87 }
88}
89
91 this->_finished_client_->async_send_request(
92 std::make_shared<std_srvs::srv::Empty::Request>(),
93 [this](rclcpp::Client<std_srvs::srv::Empty>::SharedFuture) {
94 RCLCPP_INFO(this->get_logger(), "Finished signal sent");
95 });
96}
97
99 const pacsim::msg::PerceptionDetections& msg) {
100 custom_interfaces::msg::ConeArray cone_array_msg;
101 for (const pacsim::msg::PerceptionDetection& detection : msg.detections) {
102 custom_interfaces::msg::Point2d position = custom_interfaces::msg::Point2d();
103 position.x = detection.pose.pose.position.x;
104 position.y = detection.pose.pose.position.y;
105 auto cone_message = custom_interfaces::msg::Cone();
106 cone_message.position = position;
107 cone_message.confidence = detection.detection_probability;
109 common_lib::competition_logic::Color::UNKNOWN);
110 cone_array_msg.cone_array.push_back(cone_message);
111 }
112 cone_array_msg.header.stamp = msg.header.stamp;
113 custom_interfaces::msg::PerceptionOutput perception_output;
114 perception_output.header = cone_array_msg.header;
115 perception_output.cones = cone_array_msg;
116 perception_output.exec_time = 0.0;
117 _perception_subscription_callback(perception_output);
118}
119
121 const geometry_msgs::msg::TwistWithCovarianceStamped& msg) {
122 custom_interfaces::msg::Velocities velocities;
123 velocities.header.stamp = msg.header.stamp;
124 velocities.velocity_x = msg.twist.twist.linear.x;
125 velocities.velocity_y = msg.twist.twist.linear.y;
126 velocities.angular_velocity = msg.twist.twist.angular.z;
127 velocities.header.stamp = msg.header.stamp;
128 for (unsigned int i = 0; i < 9; i++) {
129 velocities.covariance[i] = 0.00001; // Pacsim does not provide covariance, assume small value
130 // or else shit breaks if used by solver
131 }
133}
134
135void PacsimAdapter::_pacsim_imu_subscription_callback(const sensor_msgs::msg::Imu& msg) {
137}
rclcpp::Subscription< geometry_msgs::msg::TwistWithCovarianceStamped >::SharedPtr _velocities_subscription_
Subscriber for simulated velocities.
Definition pacsim.hpp:21
void _pacsim_imu_subscription_callback(const sensor_msgs::msg::Imu &msg)
Callback for simulated IMU data from pacsim.
Definition pacsim.cpp:135
rclcpp::Subscription< pacsim::msg::PerceptionDetections >::SharedPtr _perception_detections_subscription_
Subscriber for simulated perception detections.
Definition pacsim.hpp:30
void fetch_discipline()
Fetches the mission from the parameters.
Definition pacsim.cpp:57
rclcpp::Subscription< sensor_msgs::msg::Imu >::SharedPtr _imu_subscription_
Subscriber for simulated IMU data.
Definition pacsim.hpp:24
void _pacsim_perception_subscription_callback(const pacsim::msg::PerceptionDetections &msg)
Callback for simulated perception detections from pacsim.
Definition pacsim.cpp:98
void _pacsim_velocities_subscription_callback(const geometry_msgs::msg::TwistWithCovarianceStamped &msg)
Callback for simulated velocities from pacsim.
Definition pacsim.cpp:120
rclcpp::Client< rcl_interfaces::srv::GetParameters >::SharedPtr param_client_
Definition pacsim.hpp:29
PacsimAdapter(std::shared_ptr< SENode > se_node)
Definition pacsim.cpp:10
void finish() final
Function that sends the finish signal to the respective node.
Definition pacsim.cpp:41
rclcpp::Client< std_srvs::srv::Empty >::SharedPtr _finished_client_
Client for finished signal.
Definition pacsim.hpp:33
Class representing the main SLAM node responsible for publishing the calculated pose and map.
Definition slam_node.hpp:35
rclcpp::CallbackGroup::SharedPtr _callback_group_
Callback group for subscriptions, used to control if they are concurrent or not.
Definition slam_node.hpp:37
common_lib::competition_logic::Mission _mission_
Definition slam_node.hpp:76
void _velocities_subscription_callback(const custom_interfaces::msg::Velocities &msg)
Callback that updates everytime information is received from velocity estimation node.
bool _go_
Definition slam_node.hpp:77
rclcpp::CallbackGroup::SharedPtr _parallel_callback_group_
Definition slam_node.hpp:59
void _perception_subscription_callback(const custom_interfaces::msg::PerceptionOutput &msg)
Callback that updates everytime information is received from the perception module.
void _imu_subscription_callback(const sensor_msgs::msg::Imu &msg)
Callback that updates everytime information is received from the IMU.
std::shared_ptr< SLAMSolver > _slam_solver_
SLAM solver object.
Definition slam_node.hpp:65
std::string get_color_string(int color)
Definition color.cpp:16
std::string discipline
Parameters for the SLAM node.
std::string slam_optimization_mode_
std::string slam_solver_name_