66#ifndef AP1_CONTROL_NODE_HPP
77#define AP1_CONTROL_NODE_HPP
88
9+ #include < iostream>
10+ #include < string>
11+
912#include " rclcpp/rclcpp.hpp"
10- #include " std_msgs/msg/float32.hpp"
11- #include " std_msgs/msg/float32_multi_array.hpp"
12- #include " geometry_msgs/msg/point.hpp"
13- #include " geometry_msgs/msg/point32.hpp"
14-
15- namespace ap1 ::control {
16- class ControlNode : public rclcpp ::Node {
17- private:
18- void on_speed_profile (const std_msgs::msg::Float32MultiArray::SharedPtr) {
19- // todo: implement
20- RCLCPP_INFO (this ->get_logger (), " Received Speed Profile from Planning" );
21- }
22-
23- void on_path (const std_msgs::msg::Float32MultiArray::SharedPtr) {
24- // todo: implement
25- RCLCPP_INFO (this ->get_logger (), " Received new path from Planning" );
26- }
27-
28- // Fields
29- // Subs
30- rclcpp::Subscription<std_msgs::msg::Float32MultiArray>::SharedPtr speed_profile_sub_;
31- rclcpp::Subscription<std_msgs::msg::Float32MultiArray>::SharedPtr target_path_sub_;
32-
33- // Pubs
34- rclcpp::Publisher<std_msgs::msg::Float32>::SharedPtr turning_angle_pub_;
35- rclcpp::Publisher<std_msgs::msg::Float32>::SharedPtr motor_power_pub_; // between -1 and 1? probably
36- public:
37- ControlNode () : Node(" control_node" ) {
38- // # All inputs shabooya
39- // - SPEED PROFILE
40- speed_profile_sub_ = this ->create_subscription <std_msgs::msg::Float32MultiArray>(
41- " speed_profile" , 10 , std::bind (&ControlNode::on_speed_profile, this , std::placeholders::_1)
42- );
43- // - TARGET PATH
44- target_path_sub_ = this ->create_subscription <std_msgs::msg::Float32MultiArray>(
45- " target_path" , 10 , std::bind (&ControlNode::on_path, this , std::placeholders::_1)
46- );
47-
48- // # Publishers
49- // - TURNING ANGLE
50- turning_angle_pub_ = this ->create_publisher <std_msgs::msg::Float32>(" turning_angle" , 10 );
51- // - MOTOR POWER
52- motor_power_pub_ = this ->create_publisher <std_msgs::msg::Float32>(" motor_power" , 10 );
53-
54- RCLCPP_INFO (this ->get_logger (), " Control Node initialized" );
55- }
56- };
57- }
58-
59- #endif // AP1_CONTROL_NODE_HPP
13+
14+ #include " ap1_msgs/msg/motor_power_stamped.hpp"
15+ #include " ap1_msgs/msg/speed_profile_stamped.hpp"
16+ #include " ap1_msgs/msg/target_path_stamped.hpp"
17+ #include " ap1_msgs/msg/turn_angle_stamped.hpp"
18+ #include " ap1_msgs/msg/vehicle_speed_stamped.hpp"
19+
20+ #include " ap1/control/ackermann_controller.hpp"
21+ #include " ap1/control/icontroller.hpp"
22+
23+ namespace ap1 ::control
24+ {
25+ class ControlNode : public rclcpp ::Node
26+ {
27+ private:
28+ // Fields
29+
30+ // Control Loop
31+ const double rate_hz_;
32+ rclcpp::TimerBase::SharedPtr timer_;
33+
34+ // Controller
35+ std::unique_ptr<IController> controller_;
36+ AckermannController ackermann_controller_;
37+
38+ // Memory
39+ // half these types are very unnecessary, we should just have stampedfloat or
40+ // stamped double or something
41+ ap1_msgs::msg::SpeedProfileStamped speed_profile_;
42+ ap1_msgs::msg::TargetPathStamped target_path_;
43+ ap1_msgs::msg::VehicleSpeedStamped vehicle_speed_;
44+ ap1_msgs::msg::TurnAngleStamped vehicle_turn_angle;
45+
46+ // Subs
47+ rclcpp::Subscription<ap1_msgs::msg::TargetPathStamped>::SharedPtr target_path_sub_;
48+ rclcpp::Subscription<ap1_msgs::msg::SpeedProfileStamped>::SharedPtr speed_profile_sub_;
49+ rclcpp::Subscription<ap1_msgs::msg::VehicleSpeedStamped>::SharedPtr vehicle_speed_sub_;
50+ rclcpp::Subscription<ap1_msgs::msg::TurnAngleStamped>::SharedPtr vehicle_turn_angle_sub_;
51+
52+ // Pubs
53+ rclcpp::Publisher<ap1_msgs::msg::TurnAngleStamped>::SharedPtr turning_angle_pub_;
54+ rclcpp::Publisher<ap1_msgs::msg::MotorPowerStamped>::SharedPtr motor_power_pub_; // between -1 and 1? probably
55+
56+ // Methods
57+ void on_speed_profile (const ap1_msgs::msg::SpeedProfileStamped speed_profile);
58+ void on_path (const ap1_msgs::msg::TargetPathStamped target_path);
59+ void on_speed (const ap1_msgs::msg::VehicleSpeedStamped speed);
60+ void on_turn_angle (const ap1_msgs::msg::TurnAngleStamped turn_angle);
61+ void control_loop_callback ();
62+
63+ public:
64+ ControlNode (const std::string& cfg_path, float rate_hz = 60 );
65+ };
66+ } // namespace ap1::control
67+
68+ #endif // AP1_CONTROL_NODE_HPP
0 commit comments