3#include <tf2/LinearMath/Matrix3x3.h>
4#include <tf2/LinearMath/Quaternion.h>
6#include <geometry_msgs/msg/quaternion.hpp>
7#include <geometry_msgs/msg/transform_stamped.hpp>
15 this->create_subscription<custom_interfaces::msg::OperationalStatus>(
16 "/vehicle/operational_status", 10,
17 [
this](
const custom_interfaces::msg::OperationalStatus::SharedPtr msg) {
19 std::unique_lock lock(this->
mutex_);
25 _finished_client_ = this->create_client<std_srvs::srv::Trigger>(
"/as_srv/mission_finished");
30 geometry_msgs::msg::TransformStamped transformStamped;
31 transformStamped.header.stamp = this->get_clock()->now();
32 transformStamped.header.frame_id =
"map";
33 transformStamped.child_frame_id =
"vehicle_estimate";
35 transformStamped.transform.translation.x = 0.0;
36 transformStamped.transform.translation.y = 0.0;
37 transformStamped.transform.translation.z = 0.0;
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;
46 rclcpp::SubscriptionOptions subscription_options;
51 RCLCPP_INFO(this->get_logger(),
"Not receiving lidar odometry, using only velocities");
54 RCLCPP_INFO(this->get_logger(),
"VehicleAdapter initialized, topic for lidar odometry: %s",
60 std::placeholders::_1),
61 subscription_options);
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");
72 RCLCPP_ERROR(this->get_logger(),
"Failed to send finished signal");
78 if (this->
_mission_ == common_lib::competition_logic::Mission::NONE) {
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);
90 tf2::Matrix3x3 mat(quat);
91 double roll, pitch, yaw;
92 mat.getRPY(roll, pitch, yaw);
96 solver_ptr->add_odometry(pose);
102 rclcpp::Time end_time = this->get_clock()->now();
104 std_msgs::msg::Float64MultiArray execution_time_msg;
std::shared_ptr< std::vector< double > > _execution_times_
friend class VehicleAdapter
Class representing the main SLAM node responsible for publishing the calculated pose and map.
rclcpp::CallbackGroup::SharedPtr _callback_group_
Callback group for subscriptions, used to control if they are concurrent or not.
void _publish_vehicle_pose()
publishes the localization ('vehicle_pose') to the topic vehicle_pose
common_lib::competition_logic::Mission _mission_
rclcpp::Publisher< std_msgs::msg::Float64MultiArray >::SharedPtr _execution_time_publisher_
common_lib::structures::Pose _vehicle_pose_
std::shared_ptr< SLAMSolver > _slam_solver_
SLAM solver object.
rclcpp::Subscription< nav_msgs::msg::Odometry >::SharedPtr _lidar_odometry_subscription_
rclcpp::Client< std_srvs::srv::Trigger >::SharedPtr _finished_client_
Client for finished signal.
std::shared_ptr< tf2_ros::StaticTransformBroadcaster > _tf_static_broadcaster_
Static transform broadcaster.
rclcpp::Subscription< custom_interfaces::msg::OperationalStatus >::SharedPtr _operational_status_subscription_
Subscriber for operational status.
void _lidar_odometry_subscription_callback(const nav_msgs::msg::Odometry &msg)
LiDAR odometry subscription callback.
void finish() final
Function that sends the finish signal to the respective node.
Parameters for the SLAM node.
bool receive_lidar_odometry_
std::string lidar_odometry_topic_
Struct for pose representation.