66#include < geometry_msgs/Pose.h>
77#include < geometry_msgs/PoseStamped.h>
88#include < geometry_msgs/PoseWithCovarianceStamped.h>
9+ #include < geometry_msgs/Twist.h>
910#include < nav_msgs/Odometry.h>
1011#include < tf2_ros/buffer.h>
1112#include < tf/transform_listener.h>
1516#include < vector>
1617#include < eigen3/Eigen/Dense>
1718
18- #include < fpc_ros/data_classes/local_planner_robot_info .hpp>
19+ #include < fpc_ros/data_classes/fpc_param_info .hpp>
1920#include < fpp_msgs/LocalPlannerMetaData.h>
2021
2122namespace fpc
@@ -25,8 +26,7 @@ namespace fpc
2526 public:
2627 #pragma region Constructors
2728 FPCControllerBase (
28- std::vector<std::shared_ptr<fpc_data_classes::LocalPlannerRobotInfo>> &robot_info_list,
29- std::shared_ptr<fpc_data_classes::LocalPlannerRobotInfo> &robot_info,
29+ std::shared_ptr<fpc_data_classes::FPCParamInfo> fpc_param_info,
3030 ros::NodeHandle &nh,
3131 ros::NodeHandle &controller_nh);
3232 #pragma endregion
@@ -46,7 +46,7 @@ namespace fpc
4646 geometry_msgs::TwistStamped &cmd_vel,
4747 std::string &message);
4848
49- virtual void publishMetaData ();
49+ virtual void publishMetaData (geometry_msgs::Pose2D target_pose );
5050 #pragma endregion
5151
5252 #pragma region Getter/Setter
@@ -76,41 +76,54 @@ namespace fpc
7676 std::string robot_ns_;
7777
7878 #pragma region ProcessInfo
79- // ! This is all the information that was read from the config file about each robot
80- std::vector<std::shared_ptr<fpc_data_classes::LocalPlannerRobotInfo>> &robot_info_list_;
81- // ! This points to the object that contains the information about this robot
82- std::shared_ptr<fpc_data_classes::LocalPlannerRobotInfo> &robot_info_;
83- // ! This point to the object that represents the master in the formation path planner
84- const std::shared_ptr<fpc_data_classes::LocalPlannerRobotInfo> master_robot_info_;
79+ std::shared_ptr<fpc_data_classes::FPCParamInfo> fpc_param_info_;
80+ // //! This is all the information that was read from the config file about each robot
81+ // std::vector<std::shared_ptr<fpc_data_classes::LocalPlannerRobotInfo>> &robot_info_list_;
82+ // //! This points to the object that contains the information about this robot
83+ // std::shared_ptr<fpc_data_classes::LocalPlannerRobotInfo> &robot_info_;
84+ // //! This point to the object that represents the master in the formation path planner
85+ // const std::shared_ptr<fpc_data_classes::LocalPlannerRobotInfo> master_robot_info_;
86+
87+ geometry_msgs::Twist last_published_cmd_vel_;
8588
8689 std::vector<geometry_msgs::PoseStamped> global_plan_;
8790
88- int pose_index_ ;
91+ float velocity_factor_ ;
8992 bool controller_finished_;
9093
9194 geometry_msgs::PoseStamped last_target_pose_;
9295 #pragma endregion
9396
94-
95-
96- #pragma region Topics/Services/Actions
97+ #pragma region Topics/Services/Actions/Timers
9798 ros::Subscriber robot_amcl_pose_subscriber_;
9899 geometry_msgs::Pose current_robot_amcl_pose_;
99100 ros::Subscriber robot_odom_subscriber_;
100101 nav_msgs::OdometryConstPtr current_robot_odom_;
101102 ros::Subscriber robot_ground_truth_subscriber_; // This subscriber will only work in Gazebo where ground truth is published
102103 nav_msgs::OdometryConstPtr current_robot_ground_truth_;
103104
105+ ros::Publisher cmd_vel_publisher_;
104106 ros::Publisher meta_data_publisher_;
105107 fpp_msgs::LocalPlannerMetaData meta_data_msg_; // This is the msg that will be published. Every info can be stored here and will be reset when message is published.
108+
109+ ros::Timer controller_timer_;
106110 #pragma endregion
107111
108- #pragma CallbackMethods
112+ #pragma region CallbackMethods
109113 void getRobotPoseCb (const geometry_msgs::PoseWithCovarianceStampedConstPtr &msg);
110114 void getRobotOdomCb (const nav_msgs::OdometryConstPtr &msg);
111115
112116 void getRobotGroundTruthCb (const nav_msgs::OdometryConstPtr &msg);
113117
118+ void onControllerTimerCB (const ros::TimerEvent& timer_event_info);
119+ #pragma endregion
120+
121+ #pragma region Controller Methods
122+ virtual void runController ();
123+ float calcLinVelocity (geometry_msgs::Pose2D diff_vector, float scale_factor);
124+ float calcRotVelocity (geometry_msgs::Pose2D diff_vector);
125+
126+ int locateRobotOnPath (geometry_msgs::Pose current_pose);
114127 #pragma endregion
115128
116129 #pragma region ProtectedHelperMethods
@@ -130,12 +143,27 @@ namespace fpc
130143 */
131144 virtual void initTimers ();
132145
133- std::shared_ptr<fpc_data_classes::LocalPlannerRobotInfo> getMasterRobotInfo (
134- const std::vector<std::shared_ptr<fpc_data_classes::LocalPlannerRobotInfo>> &robot_info_list);
135-
136146 geometry_msgs::Pose2D convertPose (geometry_msgs::Pose pose_to_convert);
147+ Eigen::Vector3f convertPose (geometry_msgs::Pose2D pose_to_convert);
148+ geometry_msgs::Pose2D calcDiff (geometry_msgs::Pose start_pose, geometry_msgs::Pose end_pose);
137149 geometry_msgs::Pose2D calcDiff (geometry_msgs::Pose2D start_pose, geometry_msgs::Pose2D end_pose);
138150 geometry_msgs::Twist calcDiff (geometry_msgs::Twist start_vel, geometry_msgs::Twist end_vel);
139- #pragma endregion
151+ float calcEuclideanDiff (geometry_msgs::Pose point1, geometry_msgs::Pose point2);
152+ float calcEuclideanDistance (geometry_msgs::Pose2D vector);
153+
154+ float calcVelocityFactor (geometry_msgs::Pose2D pose_diff, float largest_euclidean_diff);
155+
156+ /* *
157+ * @brief Create a transformation matrix to transform points from and to the geometry cs of this object
158+ *
159+ * @param lead_vector_world_cs translation from the world to this cs
160+ * @param rotation Rotation form the world to this cs. Rotation only uses yaw rotation.
161+ * @return Eigen::Matrix<float, 4, 4> Transformation matrix in the x/y area and yaw rotation.
162+ */
163+ Eigen::Matrix<float , 4 , 4 > createTransformationMatrix (Eigen::Vector2f lead_vector_world_cs, float rotation);
164+ Eigen::Vector2f transformVector (Eigen::Vector2f vector_to_transform,
165+ Eigen::Vector2f lead_vector,
166+ float rotation);
167+ #pragma endregion
140168 };
141169}
0 commit comments