Galaxis Codebase  1.0.0
Team Galaxis software stack for the Carolo Cup 2023 - ROS2 based software
SimulationAdapterNode.cpp
Go to the documentation of this file.
4 
5 #include <unistd.h>
6 #include <thread>
7 #include <cstdlib>
8 using namespace std;
9 
10 using namespace galaxis::ros;
11 using namespace galaxis::utils;
12 
14  Node("SimulationAdapter") {
15 
16  log("SimulationAdapterNode initializing:");
17 
18  m_carPose = std::make_shared<CarPose>();
19  m_carPose->position = Eigen::Vector2f(0.4, -0.2); // TODO: set initial position (initial_pose: [0.4, -0.2])
20  m_carPose->orientation = 0;
21  m_remoteControl = false;
22 
23  m_yawRate = 0.f;
24  m_speedPerSecond = 0.f;
25 
26  // From node_ros_pubsub_wrapper:
27  // enum galaxis::ros::QoS_Profile_t {
28  // QOS_DEFAULT = 0,
29  // QOS_BEST_EFFORT = 1,
30  // QOS_RELIABLE = 2
31  // };
32 
33  // Publisher for KITCAR-SIMULATION (/simulation/gazebo/model/NAME_OF_MODEL/set_pose with NAME_OF_MODEL:=dr_drift)
34  rclcpp::QoS qos_params = get_qos_profile(QOS_BEST_EFFORT);
35  m_simulationCarRealStatePubSPtr = this->create_publisher<gazebo_simulation::msg::SetModelPose>("/simulation/gazebo/model/dr_drift/set_pose", qos_params);
36  log("Added gazebo_simulation::msg::SetModelPose Publisher.");
37 
38  m_vehicleControlSubSPtr = this->create_subscription<SimulationVehicleControlType>("galaxis/simulation/remotecontrol", qos_params, std::bind(&SimulationAdapterNode::vehicleControlCallback, this, std::placeholders::_1));
39 
40  log("Start simulationUpdateLoop and updatePose in second thread and detach");
41  std::thread(&SimulationAdapterNode::simulationUpdateLoop, this).detach();
42  std::thread(&SimulationAdapterNode::updatePose, this).detach();
43 }
44 
46 }
47 
48 // Updates the KITCAR-GAZEBO-SIMULATION
50  while(true) {
51  auto time = rclcpp::Clock().now();
52  log("[", static_cast<int>(time.seconds()) % 160742000000000, "] Send random message.");
53 
54  auto msgCarRealStateUPtr = std::make_unique<gazebo_simulation::msg::SetModelPose>();
55 
56  m_carPoseMtx.lock();
57 
58  // position
59  msgCarRealStateUPtr->keys.push_back(gazebo_simulation::msg::SetModelPose::POSITION_X);
60  msgCarRealStateUPtr->keys.push_back(gazebo_simulation::msg::SetModelPose::POSITION_Y);
61 
62  msgCarRealStateUPtr->values.push_back(m_carPose->position[0]);
63  msgCarRealStateUPtr->values.push_back(m_carPose->position[1]);
64 
65  // orientation
66  Eigen::AngleAxisf rollAngle(0, Eigen::Vector3f::UnitY());
67  Eigen::AngleAxisf yawAngle(m_carPose->orientation, Eigen::Vector3f::UnitZ());
68  Eigen::AngleAxisf pitchAngle(0, Eigen::Vector3f::UnitX());
69 
70  Eigen::Quaternionf quaternion = rollAngle * yawAngle * pitchAngle;
71 
72  msgCarRealStateUPtr->keys.push_back(gazebo_simulation::msg::SetModelPose::ORIENTATION_W);
73  msgCarRealStateUPtr->keys.push_back(gazebo_simulation::msg::SetModelPose::ORIENTATION_X);
74  msgCarRealStateUPtr->keys.push_back(gazebo_simulation::msg::SetModelPose::ORIENTATION_Y);
75  msgCarRealStateUPtr->keys.push_back(gazebo_simulation::msg::SetModelPose::ORIENTATION_Z);
76 
77  msgCarRealStateUPtr->values.push_back(quaternion.w());
78  msgCarRealStateUPtr->values.push_back(quaternion.x());
79  msgCarRealStateUPtr->values.push_back(quaternion.y());
80  msgCarRealStateUPtr->values.push_back(quaternion.z());
81 
82  m_carPoseMtx.unlock();
83 
84  m_simulationCarRealStatePubSPtr->publish(std::move(msgCarRealStateUPtr));
85 
86  usleep(8000);
87  }
88 
89  log("Killed");
90 }
91 
92 void SimulationAdapterNode::vehicleControlCallback(SimulationVehicleControlType::SharedPtr msg) {
93  if(msg->remote_control == 1) {
94  log("[REMOTECONTROL] Enabled. Only drive with remote control.");
95  m_remoteControl = true;
96  m_speedPerSecond = msg->car_speed;
97  m_yawRate = msg->turnangle_front;
98  }
99  else if(msg->remote_control == 0) {
100  m_remoteControl = false;
101  m_speedPerSecond = msg->car_speed;
102  m_yawRate = msg->turnangle_front;
103  }
104 
105  if (!m_remoteControl) {
106  m_speedPerSecond = msg->car_speed;
107  m_yawRate = msg->turnangle_front;
108  }
109 
110  if(msg->reset == true) {
111  m_carPoseMtx.lock();
112 
113  m_speedPerSecond = 0.f;
114  m_yawRate = 0.f;
115  m_carPose->position[0] = 0.034f;
116  m_carPose->position[1] = 0.f;
117  m_carPose->orientation = 0.f;
118 
119  m_carPoseMtx.unlock();
120  }
121 
122  log("Vehicle Control Message received. Speed: ", m_speedPerSecond, " Yaw: ", m_yawRate);
123 }
124 
126  rclcpp::Time lastUpdateTime = rclcpp::Clock().now();
127 
128  while(true) {
129  m_carPoseMtx.lock();
130 
131  auto currentTime = rclcpp::Clock().now();
132  float distanceTravelled = m_speedPerSecond * (currentTime - lastUpdateTime).seconds();
133  log("UpdatePose - DistanceTravelled: ", distanceTravelled);
134  lastUpdateTime = currentTime;
135 
136  std::shared_ptr<CarPose> m_carPoseTemp = get_new_pose(m_carPose, galaxis::controllerSettings::carWheelbaseSimulationDrDrift, distanceTravelled, m_yawRate);
137  m_carPose = m_carPoseTemp;
138 
139  // ####################### Convert Position to
140 
141  log("X: ", m_carPose->position[0], "Y: ", m_carPose->position[1]);
142 
143  m_carPoseMtx.unlock();
144  usleep(4000);
145  }
146 }
node_ros_pubsub_wrapper.hpp
galaxis::ros
Definition: node_ros_pubsub_wrapper.hpp:15
SimulationAdapterNode::SimulationAdapterNode
SimulationAdapterNode()
Definition: SimulationAdapterNode.cpp:13
SimulationAdapterNode::~SimulationAdapterNode
~SimulationAdapterNode()
Definition: SimulationAdapterNode.cpp:45
SimulationAdapterNode::m_carPose
std::shared_ptr< CarPose > m_carPose
Definition: SimulationAdapterNode.hpp:30
galaxis::controllerSettings::carWheelbaseSimulationDrDrift
constexpr float carWheelbaseSimulationDrDrift
Definition: controllerSettings.hpp:8
SimulationAdapterNode::m_simulationCarRealStatePubSPtr
rclcpp::Publisher< gazebo_simulation::msg::SetModelPose >::SharedPtr m_simulationCarRealStatePubSPtr
Definition: SimulationAdapterNode.hpp:36
SimulationAdapterNode::simulationUpdateLoop
void simulationUpdateLoop()
Definition: SimulationAdapterNode.cpp:49
SimulationAdapterNode::m_carPoseMtx
std::mutex m_carPoseMtx
Definition: SimulationAdapterNode.hpp:50
SimulationAdapterNode::m_speedPerSecond
std::atomic< float > m_speedPerSecond
Definition: SimulationAdapterNode.hpp:32
SimulationAdapterNode::m_remoteControl
std::atomic< bool > m_remoteControl
Definition: SimulationAdapterNode.hpp:33
SimulationAdapterNode.hpp
SimulationAdapterNode::m_yawRate
std::atomic< float > m_yawRate
Definition: SimulationAdapterNode.hpp:31
galaxis::lina::Vector2f
Eigen::Vector2f Vector2f
Definition: linatypes.hpp:14
controllerSettings.hpp
galaxis::utils
Definition: clock.hpp:5
galaxis::utils::log
void log(const Args &... args)
Definition: logger.hpp:33
SimulationAdapterNode::vehicleControlCallback
void vehicleControlCallback(SimulationVehicleControlType::SharedPtr msg)
Definition: SimulationAdapterNode.cpp:92
galaxis::control::get_new_pose
std::shared_ptr< CarPose > get_new_pose(std::shared_ptr< CarPose > const p_currentPoseSPtr, float p_carWheelbase, float p_distance, float p_yawDiff)
Definition: control.cpp:168
SimulationAdapterNode::m_vehicleControlSubSPtr
rclcpp::Subscription< SimulationVehicleControlType >::SharedPtr m_vehicleControlSubSPtr
Definition: SimulationAdapterNode.hpp:40
SimulationAdapterNode::updatePose
void updatePose()
Definition: SimulationAdapterNode.cpp:125