Formula Student Autonomous Systems
The code for the main driverless system
Loading...
Searching...
No Matches
vehicle.cpp
Go to the documentation of this file.
2
3#include <tf2/LinearMath/Matrix3x3.h>
4#include <tf2/LinearMath/Quaternion.h>
5
6#include <geometry_msgs/msg/quaternion.hpp>
7#include <geometry_msgs/msg/transform_stamped.hpp>
8
12
15 this->create_subscription<custom_interfaces::msg::OperationalStatus>(
16 "/vehicle/operational_status", 10,
17 [this](const custom_interfaces::msg::OperationalStatus::SharedPtr msg) {
18 {
19 std::unique_lock lock(this->mutex_);
20 _go_ = true; // msg->go_signal;
21 }
23 this->_slam_solver_->set_mission(_mission_);
24 });
25 _finished_client_ = this->create_client<std_srvs::srv::Trigger>("/as_srv/mission_finished");
26
27 // Create a static map frame
28 _tf_static_broadcaster_ = std::make_shared<tf2_ros::StaticTransformBroadcaster>(*this);
29
30 geometry_msgs::msg::TransformStamped transformStamped;
31 transformStamped.header.stamp = this->get_clock()->now();
32 transformStamped.header.frame_id = "map"; // Fixed frame: "map"
33 transformStamped.child_frame_id = "vehicle_estimate"; // The child frame: "vehicle"
34
35 transformStamped.transform.translation.x = 0.0;
36 transformStamped.transform.translation.y = 0.0;
37 transformStamped.transform.translation.z = 0.0;
38
39 transformStamped.transform.rotation.x = 0.0;
40 transformStamped.transform.rotation.y = 0.0;
41 transformStamped.transform.rotation.z = 0.0;
42 transformStamped.transform.rotation.w = 1.0;
43
44 _tf_static_broadcaster_->sendTransform(transformStamped);
45
46 rclcpp::SubscriptionOptions subscription_options;
47 subscription_options.callback_group = this->_callback_group_;
48
49 // LiDAR odometry subscription
50 if (!params.receive_lidar_odometry_) {
51 RCLCPP_INFO(this->get_logger(), "Not receiving lidar odometry, using only velocities");
52 return;
53 }
54 RCLCPP_INFO(this->get_logger(), "VehicleAdapter initialized, topic for lidar odometry: %s",
55 params.lidar_odometry_topic_.c_str());
56
57 this->_lidar_odometry_subscription_ = this->create_subscription<nav_msgs::msg::Odometry>(
58 params.lidar_odometry_topic_, 1,
60 std::placeholders::_1),
61 subscription_options);
62}
63
64// TODO: implement a more complex logic, like the one in inspection node
66 _finished_client_->async_send_request(
67 std::make_shared<std_srvs::srv::Trigger::Request>(),
68 [this](rclcpp::Client<std_srvs::srv::Trigger>::SharedFuture future) {
69 if (future.get()->success) {
70 RCLCPP_INFO(this->get_logger(), "Finished signal sent");
71 } else {
72 RCLCPP_ERROR(this->get_logger(), "Failed to send finished signal");
73 }
74 });
75}
76
77void VehicleAdapter::_lidar_odometry_subscription_callback(const nav_msgs::msg::Odometry& msg) {
78 if (this->_mission_ == common_lib::competition_logic::Mission::NONE) {
79 return;
80 }
81
82 rclcpp::Time start_time = this->get_clock()->now();
83 if (auto solver_ptr = std::dynamic_pointer_cast<OdometryIntegratorTrait>(this->_slam_solver_)) {
85 pose.position.x = msg.pose.pose.position.x;
86 pose.position.y = msg.pose.pose.position.y;
87 tf2::Quaternion quat(msg.pose.pose.orientation.x, msg.pose.pose.orientation.y,
88 msg.pose.pose.orientation.z, msg.pose.pose.orientation.w);
89
90 tf2::Matrix3x3 mat(quat);
91 double roll, pitch, yaw;
92 mat.getRPY(roll, pitch, yaw);
93 pose.orientation = yaw; // Use yaw as the orientation
94 pose.timestamp = msg.header.stamp;
95
96 solver_ptr->add_odometry(pose);
97 this->_vehicle_pose_ = this->_slam_solver_->get_pose_estimate();
98 }
99
100 this->_publish_vehicle_pose();
101
102 rclcpp::Time end_time = this->get_clock()->now();
103 this->_execution_times_->at(0) = (end_time - start_time).seconds() * 1000.0;
104 std_msgs::msg::Float64MultiArray execution_time_msg;
105 execution_time_msg.data = *this->_execution_times_;
106 this->_execution_time_publisher_->publish(execution_time_msg);
107}
std::shared_ptr< std::vector< double > > _execution_times_
Definition ros_node.hpp:51
friend class VehicleAdapter
Definition planning.hpp:88
Class representing the main SLAM node responsible for publishing the calculated pose and map.
Definition slam_node.hpp:35
std::shared_mutex mutex_
Definition slam_node.hpp:61
rclcpp::CallbackGroup::SharedPtr _callback_group_
Callback group for subscriptions, used to control if they are concurrent or not.
Definition slam_node.hpp:37
void _publish_vehicle_pose()
publishes the localization ('vehicle_pose') to the topic vehicle_pose
common_lib::competition_logic::Mission _mission_
Definition slam_node.hpp:76
bool _go_
Definition slam_node.hpp:77
rclcpp::Publisher< std_msgs::msg::Float64MultiArray >::SharedPtr _execution_time_publisher_
Definition slam_node.hpp:51
common_lib::structures::Pose _vehicle_pose_
Definition slam_node.hpp:72
std::shared_ptr< SLAMSolver > _slam_solver_
SLAM solver object.
Definition slam_node.hpp:65
rclcpp::Subscription< nav_msgs::msg::Odometry >::SharedPtr _lidar_odometry_subscription_
Definition vehicle.hpp:20
rclcpp::Client< std_srvs::srv::Trigger >::SharedPtr _finished_client_
Client for finished signal.
Definition vehicle.hpp:53
std::shared_ptr< tf2_ros::StaticTransformBroadcaster > _tf_static_broadcaster_
Static transform broadcaster.
Definition vehicle.hpp:26
rclcpp::Subscription< custom_interfaces::msg::OperationalStatus >::SharedPtr _operational_status_subscription_
Subscriber for operational status.
Definition vehicle.hpp:27
void _lidar_odometry_subscription_callback(const nav_msgs::msg::Odometry &msg)
LiDAR odometry subscription callback.
Definition vehicle.cpp:77
void finish() final
Function that sends the finish signal to the respective node.
Definition vehicle.cpp:76
Parameters for the SLAM node.
std::string lidar_odometry_topic_
Struct for pose representation.
Definition pose.hpp:13