4 #include <boost/algorithm/clamp.hpp> 7 : m_drive_param_lock{
true }
8 , m_emergency_stop_lock{
true }
10 this->m_drive_parameters_subscriber =
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,
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);
24 void CarController::driveParametersCallback(
const drive_msgs::drive_param::ConstPtr&
parameters)
26 this->publishDriveParameters((m_drive_param_lock || m_emergency_stop_lock) ? 0 : parameters->velocity,
27 m_drive_param_lock ? 0 : parameters->angle);
30 void CarController::publishDriveParameters(
double relative_speed,
double relative_angle)
35 this->publishSpeed(speed);
36 this->publishAngle(angle);
38 ROS_DEBUG_STREAM(
"running: " 39 <<
" | speed: " << speed <<
" | angle: " << angle);
42 void CarController::publishSpeed(
double speed)
44 std_msgs::Float64 speed_message;
45 speed_message.data = speed;
46 this->m_speed_publisher.publish(speed_message);
49 void CarController::publishAngle(
double angle)
51 std_msgs::Float64 angle_message;
52 angle_message.data = angle;
53 this->m_angle_publisher.publish(angle_message);
56 void CarController::driveModeCallback(
const std_msgs::Int32::ConstPtr& drive_mode_message)
58 this->m_current_drive_mode = (
DriveMode)drive_mode_message->data;
60 if (this->m_drive_param_lock)
64 void CarController::emergencyStopCallback(
const std_msgs::Bool::ConstPtr& emergency_stop_message)
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)
72 void CarController::stop()
74 this->publishSpeed(0);
76 std_msgs::Float64 brake_message;
77 brake_message.data = 0;
78 this->m_brake_publisher.publish(brake_message);
81 int main(
int argc,
char** argv)
83 ros::init(argc, argv,
"car_controller");
constexpr const char * TOPIC_DRIVE_MODE
int main(int argc, char **argv)
constexpr const char * TOPIC_FOCBOX_SPEED
constexpr const char * TOPIC_FOCBOX_BRAKE
constexpr double MAX_SERVO_POSITION
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.
constexpr const char * TOPIC_EMERGENCY_STOP