Autonomous Racing  1
f1tenth Project Group of Technical University Dortmund, Germany
car_controller.cpp
Go to the documentation of this file.
1 #include "car_controller.h"
2 #include "car_config.h"
3 
4 #include <boost/algorithm/clamp.hpp>
5 
7  : m_drive_param_lock{ true }
8  , m_emergency_stop_lock{ true }
9 {
10  this->m_drive_parameters_subscriber =
11  this->m_node_handle.subscribe<drive_msgs::drive_param>(TOPIC_DRIVE_PARAM, 1,
12  &CarController::driveParametersCallback, this);
13  this->m_drive_mode_subscriber =
14  this->m_node_handle.subscribe<std_msgs::Int32>(TOPIC_DRIVE_MODE, 1, &CarController::driveModeCallback, this);
15  this->m_emergency_stop_subscriber =
16  this->m_node_handle.subscribe<std_msgs::Bool>(TOPIC_EMERGENCY_STOP, 1, &CarController::emergencyStopCallback,
17  this);
18 
19  this->m_speed_publisher = this->m_node_handle.advertise<std_msgs::Float64>(TOPIC_FOCBOX_SPEED, 1);
20  this->m_angle_publisher = this->m_node_handle.advertise<std_msgs::Float64>(TOPIC_FOCBOX_ANGLE, 1);
21  this->m_brake_publisher = this->m_node_handle.advertise<std_msgs::Float64>(TOPIC_FOCBOX_BRAKE, 1);
22 }
23 
24 void CarController::driveParametersCallback(const drive_msgs::drive_param::ConstPtr& parameters)
25 {
26  this->publishDriveParameters((m_drive_param_lock || m_emergency_stop_lock) ? 0 : parameters->velocity,
27  m_drive_param_lock ? 0 : parameters->angle);
28 }
29 
30 void CarController::publishDriveParameters(double relative_speed, double relative_angle)
31 {
32  double speed = relative_speed * car_config::MAX_RPM_ELECTRICAL;
33  double angle = (relative_angle * car_config::MAX_SERVO_POSITION + car_config::MAX_SERVO_POSITION) / 2;
34 
35  this->publishSpeed(speed);
36  this->publishAngle(angle);
37 
38  ROS_DEBUG_STREAM("running: "
39  << " | speed: " << speed << " | angle: " << angle);
40 }
41 
42 void CarController::publishSpeed(double speed)
43 {
44  std_msgs::Float64 speed_message;
45  speed_message.data = speed;
46  this->m_speed_publisher.publish(speed_message);
47 }
48 
49 void CarController::publishAngle(double angle)
50 {
51  std_msgs::Float64 angle_message;
52  angle_message.data = angle;
53  this->m_angle_publisher.publish(angle_message);
54 }
55 
56 void CarController::driveModeCallback(const std_msgs::Int32::ConstPtr& drive_mode_message)
57 {
58  this->m_current_drive_mode = (DriveMode)drive_mode_message->data;
59  this->m_drive_param_lock = this->m_current_drive_mode == DriveMode::LOCKED;
60  if (this->m_drive_param_lock)
61  this->stop();
62 }
63 
64 void CarController::emergencyStopCallback(const std_msgs::Bool::ConstPtr& emergency_stop_message)
65 {
66  bool enable_emergency_stop = emergency_stop_message->data && this->m_current_drive_mode != DriveMode::MANUAL;
67  this->m_emergency_stop_lock = enable_emergency_stop;
68  if (this->m_emergency_stop_lock)
69  this->stop();
70 }
71 
72 void CarController::stop()
73 {
74  this->publishSpeed(0);
75 
76  std_msgs::Float64 brake_message;
77  brake_message.data = 0;
78  this->m_brake_publisher.publish(brake_message);
79 }
80 
81 int main(int argc, char** argv)
82 {
83  ros::init(argc, argv, "car_controller");
84  CarController carController;
85  ros::spin();
86  return EXIT_SUCCESS;
87 }
constexpr const char * TOPIC_DRIVE_MODE
int main(int argc, char **argv)
constexpr const char * TOPIC_FOCBOX_SPEED
DriveMode
Definition: drive_mode.h:3
constexpr const char * TOPIC_FOCBOX_BRAKE
constexpr double MAX_SERVO_POSITION
Definition: car_config.h:85
constexpr const char * TOPIC_DRIVE_PARAM
constexpr const char * TOPIC_FOCBOX_ANGLE
constexpr double MAX_RPM_ELECTRICAL
Maximum electrical revolutions per minute for use in the VESC 1/min.
Definition: car_config.h:44
constexpr const char * TOPIC_EMERGENCY_STOP