offbroad

//action文件夹
class IControlFunction {
    virtual ~IControlFunction() {};
    virtual void Oninit(const int config) = 0;
    virtual void GetData() = 0;
    virtual void DoProgress() = 0;
    virtual void SetFunctionOutPut() = 0;}
//工厂基函数,初始化、获取数据、做处理、输出

class IMsgRosManager {}
//消息管理,飞机、船、UUV的控制和设置他们的状态

class Ivehicle {}
//uav全局位置、状态、局部位置

class MultiUAVFormation : public IControlFunction{}
class MultiUSVFormation : public IControlFunction{}
class USV_Avoidance : public IControlFunction {}
//VehicleControl文件夹
class IVehicleControl {
public:
        virtual ~IVehicleControl() {};
        virtual void onInit() = 0;
        virtual void DoProgress() = 0;
        virtual void chooseLeader() = 0;
        virtual void getData() = 0;
        virtual void setVehicleCtrlData() = 0;};
//初始化、做处理、选择领航者、获取数据、设置飞行控制数据

class MultiBoatControl : public IVehicleControl {}
class MultiDroneControl : public IVehicleControl {}
class MultiUUVControl : public IVehicleControl {}
//Calculate文件
class Calculate {}
//一些角度弧度转换,四元数转欧拉角(quaternion_rpy)
//Cinc文件
//一些通用参数和系数配置
//DataMan文件  < ------ >  数据交互,非常重要
class DataMan {}
//FlightManager文件
class FlightManager : public IFlightDataCallback{
    void OnInitConfig(IMsgRosManager* msg_manager);
    void DoProgress();
    void GetData();
    static FlightManager* getInstance();
    void AddVehicleControlProgress(IVehicleControlFactory *IVehicleControl);
    void AddFunctionProgress(IFunctionFactory *factory);
    void FunctionStateUpdate(IFunctionFactory *factory);
    void ActionMotionPlanUpdate(IFunctionFactory *factory);
    void OnFlightDataUpdate(FDATA_TYPE data_type) override;}
//multi_offbroad文件
class MultiOffboard : public IMsgRosManager{}
//都是一些MAVROS消息
//PathCreator.hpp
class PathCreator {
public:
    void onInit(IMsgRosManager *msg_manager, const bool is_uav_follow);
    void initMotionPlan();
    void uav_add_way_points(vector<geometry_msgs::PoseStamped> &uav_way_points);
    void usv_add_way_points(vector<geometry_msgs::PoseStamped> &usv_way_points);
    void CreatFunction();
    void CreatVehicle();
    void CreateUAVFormationInit(const int config);
    void CreateUSVFormationInit(const int config);
    static PathCreator* geInstance();}
//util.h
void util_set_id (const char *name, int number, const char *prog);
void util_log(const char *fmt, ...);
void util_add_remote (int sock, struct sockaddr_in sa);
void util_daemonize ();
char *util_string_trim (const char *buf, int size);
string_list_t util_string_split (const char *haystack, const char *needle, int at_most);
void util_string_list_free (string_list_t *list);
char *util_string_replace_once (const char *string, const char *original, const char *replace);
void *util_realloc (void *ptr, int size);
char *util_strndup (const char *str, int size);
void util_free (void *ptr);
void util_free_all (void);
void util_display_resource (void);
void util_SetLogFile(char logfile[256]);

3USV

//usvs_control.hpp
class usvs_control : public IMsgRosManager{
    static  usvs_control* getInstance();
    void OnInit() override ;
    void PublishDronePosControl(const multi_vehicle &multi_vehicles) override ;
    void PublishBoatPosControl(const multi_vehicle &multi_vehicles) override ;
    void PublishUUVPosControl(const multi_vehicle &multi_vehicles) override;
    void SetUAVState(mavros_msgs::SetMode &m_mode) override ;
    void SetUSVState(mavros_msgs::SetMode &arm_command, int usv_id) override ;
    void SetUSVAvoData(const bool usv1_usv2_crash, const bool usv1_usv3_crash, const bool usv2_usv3_crash) override ;
    void getData();
    void doProgress();}

PCL

class IMap {
public:
    virtual void onInit() = 0;
    virtual bool isStateValid(const Eigen::Vector3f &PosENU) = 0;
    virtual void updateOctomap(const octomap_msgs::Octomap &msg) = 0;
    virtual void setSafeRaduis(const float &raduis) = 0;};
class PCLROSMessageManager {
public:
    void OnInit(ros::NodeHandle &nh);
    void cloudHandler(const sensor_msgs::PointCloud2::ConstPtr &m);
    void getOctomap(octomap_msgs::Octomap &octomap);
    void setVehicleMessage(const M_Drone& usv);
private:
    ros::Subscriber lidar_point_sub_;
    ros::Publisher octomap_pub_, transformed_cloud_pub_, ground_removal_pub_;
    M_Drone usv_;
    octomap_msgs::Octomap octomap_;
    octomap::OcTree *tree_ = new octomap::OcTree(0.5);
    //发布八叉树
    void PubOctomap(octomap::OcTree *tree, const ros::Publisher &pub);
    //半径消除
    void radiusRemoval(const pcl::PointCloud<pcl::PointXYZ>::Ptr &input_cloud,
                       const pcl::PointCloud<pcl::PointXYZ>::Ptr &output_cloud,
                       float radius, int min_neighbors,
                       pcl::IndicesConstPtr &cloud_filtered_indices);
    //地面消除
    void groundRemove(const pcl::PointCloud<pcl::PointXYZ>::Ptr &input_cloud,
                      const pcl::PointCloud<pcl::PointXYZ>::Ptr &output_cloud,
                      const pcl::IndicesConstPtr &cloud_filtered_indices);
    Eigen::Isometry3f get_transformation_matrix();
    void PubPointCloud(const pcl::PointCloud<pcl::PointXYZ>::Ptr &o_cloud, const ros::Publisher &pub, string frame = "map");
};
class OctoMap  : public IMap {
public:
    void onInit() override;
    void updateOctomap(const octomap_msgs::Octomap &msg) override;
    bool isStateValid(const Eigen::Vector3f &PosENU) override ;
    void setSafeRaduis(const float &raduis) override;
    typedef unique_ptr<OctoMap> Ptr;
private:
    float safety_radius_;
    std::shared_ptr<fcl::CollisionGeometry> Quadcopter_;
    std::shared_ptr<fcl::CollisionGeometry> tree_obj_;};

motion_plan

//bspline
//bspline.hpp
namespace fast_planner {
// An implementation of non-uniform B-spline with different dimensions
// It also represents uniform B-spline which is a special case of non-uniform
class NonUniformBspline {
private:
  // control points for B-spline with different dimensions.
  // Each row represents one single control point
  // The dimension is determined by column number
  // e.g. B-spline with N points in 3D space -> Nx3 matrix
  Eigen::MatrixXd control_points_;
  int             p_, n_, m_;  // p degree, n+1 control points, m = n+p+1
  Eigen::VectorXd u_;          // knots vector
  double          interval_;   // knot span \delta t
  Eigen::MatrixXd getDerivativeControlPoints();
  double limit_vel_, limit_acc_, limit_ratio_;  // physical limits and time adjustment ratio
public:
  // initialize as an uniform B-spline
  void setUniformBspline(const Eigen::MatrixXd& points, const int& order, const double& interval);
  // get / set basic bspline info
  void                                   setKnot(const Eigen::VectorXd& knot);
  Eigen::VectorXd                        getKnot();
  Eigen::MatrixXd                        getControlPoint();
  double                                 getInterval();
  void                                   getTimeSpan(double& um, double& um_p);
  pair<Eigen::VectorXd, Eigen::VectorXd> getHeadTailPts();
  // compute position / derivative
  Eigen::VectorXd   evaluateDeBoor(const double& u);   // use u \in [up, u_mp]
  Eigen::VectorXd   evaluateDeBoorT(const double& t);  // use t \in [0, duration]
  NonUniformBspline getDerivative();
  // 3D B-spline interpolation of points in point_set, with boundary vel&acc
  // constraints
  // input : (K+2) points with boundary vel/acc; ts
  // output: (K+6) control_pts
  static void parameterizeToBspline(const double& ts, const vector<Eigen::Vector3d>& point_set,
                                    const vector<Eigen::Vector3d>& start_end_derivative,
                                    Eigen::MatrixXd&               ctrl_pts);
  /* check feasibility, adjust time */
  void   setPhysicalLimits(const double& vel, const double& acc);
  bool   checkFeasibility(bool show = false);
  double checkRatio();
  void   lengthenTime(const double& ratio);
  bool   reallocateTime(bool show = false);
  /* for performance evaluation */
  double getTimeSum();
  double getLength(const double& res = 0.01);
  double getJerk();
  void   getMeanAndMaxVel(double& mean_v, double& max_v);
  void   getMeanAndMaxAcc(double& mean_a, double& max_a);
  void recomputeInit();
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
}
//bspline_opt
//bspline_optimizer.h
// Gradient and elasitc band optimization

// Input: a signed distance field and a sequence of points
// Output: the optimized sequence of points
// The format of points: N x 3 matrix, each row is a point
namespace fast_planner {
class BsplineOptimizer {
public:
  static const int SMOOTHNESS;
  static const int DISTANCE;
  static const int FEASIBILITY;
  static const int ENDPOINT;
  static const int GUIDE;
  static const int WAYPOINTS;
  static const int YAW_SMOOTHNESS;
  static const int DIST_CENTER;

  static const int GUIDE_PHASE;
  static const int NORMAL_PHASE;
  static const int SAFE;
  /* main API */
  void            setEnvironment(const Sp<IMap>& env);
    void setSpeedLimit(const double max_vel, const double max_acc);
    void            setParam(ros::NodeHandle& nh);
  Eigen::MatrixXd BsplineOptimizeTraj(const Eigen::MatrixXd& points, const double& ts,
                                      const int& cost_function, int max_num_id, int max_time_id);
  void setTargetPoint(const Eigen::Vector3d &target_pos, const Eigen::Vector3d &start_point);
  /* helper function */

  // required inputs
  void setControlPoints(const Eigen::MatrixXd& points);
  void setBsplineInterval(const double& ts);
  void setCostFunction(const int& cost_function);
  void setTerminateCond(const int& max_num_id, const int& max_time_id);
  // optional inputs
  void setGuidePath(const vector<Eigen::Vector3d>& guide_pt);
  void setWaypoints(const vector<Eigen::Vector3d>& waypts,
                    const vector<int>&             waypt_idx);  // N-2 constraints at most
  void optimize();
  Eigen::MatrixXd         getControlPoints();
  vector<Eigen::Vector3d> matrixToVectors(const Eigen::MatrixXd& ctrl_pts);
private:
  EDTEnvironment::Ptr edt_environment_;
  Sp<IMap> map_;
  // main input
  Eigen::MatrixXd control_points_;     // B-spline control points, N x dim
  double          bspline_interval_;   // B-spline knot span
  Eigen::Vector3d end_pt_;             // end of the trajectory
  int             dim_;                // dimension of the B-spline
                                       //
  vector<Eigen::Vector3d> guide_pts_;  // geometric guiding path points, N-6
  vector<Eigen::Vector3d> waypoints_;  // waypts constraints
  vector<int>             waypt_idx_;  // waypts constraints index
                                       //
  int    max_num_id_, max_time_id_;    // stopping criteria
  int    cost_function_;               // used to determine objective function
  bool   dynamic_;                     // moving obstacles ?
  double start_time_;                  // global time for moving obstacles
  /* optimization parameters */
  int    order_;                  // bspline degree
  double lambda1_;                // jerk smoothness weight
  double lambda2_;                // distance weight
  double lambda3_;                // feasibility weight
  double lambda4_;                // end point weight
  double lambda5_;                // guide cost weight
  double lambda6_;                // visibility cost weight
  double lambda7_;                // waypoints cost weight
  double lambda8_;                // acc smoothness
  double lambda9_;                // control points to center line distance weight
                                  //
  double dist0_;                  // safe distance
  double dist_min_;                  // safe distance
  double dist_max_;                  // safe distance
  double max_vel_, max_acc_;      // dynamic limits
  double visib_min_;              // threshold of visibility
  double wnl_;                    //
  double dlmin_;                  //
                                  //
  int    algorithm1_;             // optimization algorithms for quadratic cost
  int    algorithm2_;             // optimization algorithms for general cost
  int    max_iteration_num_[4];   // stopping criteria that can be used
  double max_iteration_time_[4];  // stopping criteria that can be used
  Eigen::Vector3d target_pos_, start_pos_;
  /* intermediate variables */
  /* buffer for gradient of cost function, to avoid repeated allocation and
   * release of memory */
  vector<Eigen::Vector3d> g_q_;
  vector<Eigen::Vector3d> g_smoothness_;
  vector<Eigen::Vector3d> g_distance_;
  vector<Eigen::Vector3d> g_dist_center_;
  vector<Eigen::Vector3d> g_feasibility_;
  vector<Eigen::Vector3d> g_endpoint_;
  vector<Eigen::Vector3d> g_guide_;
  vector<Eigen::Vector3d> g_waypoints_;

  int                 variable_num_;   // optimization variables
  int                 iter_num_;       // iteration of the solver
  std::vector<double> best_variable_;  //
  double              min_cost_;       //

  vector<Eigen::Vector3d> block_pts_;  // blocking points to compute visibility

  /* cost function */
  /* calculate each part of cost function with control points q as input */

  static double costFunction(const std::vector<double>& x, std::vector<double>& grad, void* func_data);
  void          combineCost(const std::vector<double>& x, vector<double>& grad, double& cost);
  // q contains all control points
  void calcSmoothnessCost(const vector<Eigen::Vector3d>& q, double& cost,
                          vector<Eigen::Vector3d>& gradient);
  void calcDistanceCost(const vector<Eigen::Vector3d>& q, double& cost,
                        vector<Eigen::Vector3d>& gradient);
  void calcDistCenterCost(const vector<Eigen::Vector3d>& q, double& cost,
                        vector<Eigen::Vector3d>& gradient);
  void calcFeasibilityCost(const vector<Eigen::Vector3d>& q, double& cost,
                           vector<Eigen::Vector3d>& gradient);
  void calcEndpointCost(const vector<Eigen::Vector3d>& q, double& cost,
                        vector<Eigen::Vector3d>& gradient);
  void calcGuideCost(const vector<Eigen::Vector3d>& q, double& cost, vector<Eigen::Vector3d>& gradient);
  void calcVisibilityCost(const vector<Eigen::Vector3d>& q, double& cost,
                          vector<Eigen::Vector3d>& gradient);
  void calcWaypointsCost(const vector<Eigen::Vector3d>& q, double& cost,
                         vector<Eigen::Vector3d>& gradient);
  void calcViewCost(const vector<Eigen::Vector3d>& q, double& cost, vector<Eigen::Vector3d>& gradient);
  bool isQuadratic();
  /* for benckmark evaluation only */
public:
  vector<double> vec_cost_;
  vector<double> vec_time_;
  ros::Time      time_start_;
  void getCostCurve(vector<double>& cost, vector<double>& time) {
    cost = vec_cost_;
    time = vec_time_;
  }
  typedef unique_ptr<BsplineOptimizer> Ptr;
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
}  // namespace fast_planner

mp_core

namespace fast_planner{
    class IPathFinder{
    public:
        virtual bool replan(Eigen::Vector3d start_pt, Eigen::Vector3d start_vel, Eigen::Vector3d start_acc, Eigen::Vector3d end_pt, Eigen::Vector3d end_vel) = 0;
        virtual void planYaw(const Eigen::Vector3d& start_yaw) = 0;
        virtual void initPlanModules(const MP_Config &config, Sp<IMap> &map) = 0;
        virtual bool checkTrajCollision(double& distance) = 0;
        virtual LocalTrajData& getLocaldata() = 0;
        virtual MidPlanData& getPlanData() = 0;
        virtual void setGlobalWaypoints(const TVec3 &waypoints, const TVec3 &start_point, const TVec3 &cur_pos) = 0;
        virtual void updateSpeedLimit(const float max_speed,const float max_acc)=0;
    };
}
//FastPathFinder.h
namespace fast_planner {

// Fast Planner Manager
// Key algorithms of mapping and planning are called
    class FastPathFinder : public IPathFinder{
        // SECTION stable
    public:
        /* main planning interface */
        bool replan(Eigen::Vector3d start_pt, Eigen::Vector3d start_vel, Eigen::Vector3d start_acc,
                               Eigen::Vector3d end_pt, Eigen::Vector3d end_vel) override ;
        bool planGlobalTraj(const Eigen::Vector3d& start_pos);

        void planYaw(const Eigen::Vector3d& start_yaw) override ;

        void initPlanModules(const MP_Config &config, Sp<IMap> &map) override ;
        void setGlobalWaypoints(const TVec3 &waypoints, const TVec3 &start_point, const TVec3 &cur_pos) override;

        bool checkTrajCollision(double& distance) override ;

        LocalTrajData& getLocaldata() override ;
        MidPlanData& getPlanData() override;

        void updateSpeedLimit(const float max_speed, const float max_acc) override;

        PlanParameters pp_;
        LocalTrajData local_data_;
        MidPlanData plan_data_;
        EDTEnvironment::Ptr edt_environment_;   
    private:
        ros::Subscriber plan_state_sub_;
        /* main planning algorithms & modules */
        SDFMap::Ptr sdf_map_;
        GlobalTrajData global_data_;

        unique_ptr<KinodynamicAstar> kino_path_finder_;
        vector<BsplineOptimizer::Ptr> bspline_optimizers_;
        OctoMap::Ptr octo_map_;
        MP_Config mp_config_;

        void updateTrajInfo();

        // topology guided optimization

        void findCollisionRange(vector<Eigen::Vector3d>& colli_start, vector<Eigen::Vector3d>& colli_end,
                                vector<Eigen::Vector3d>& start_pts, vector<Eigen::Vector3d>& end_pts);

        Eigen::MatrixXd reparamLocalTraj(double start_t, double& dt, double& duration);
        Eigen::MatrixXd reparamLocalTraj(double start_t, double duration, int seg_num, double& dt);

        void selectBestTraj(NonUniformBspline& traj);
        void refineTraj(NonUniformBspline& best_traj, double& time_inc);
        void reparamBspline(NonUniformBspline& bspline, double ratio, Eigen::MatrixXd& ctrl_pts, double& dt,
                            double& time_inc);

        // heading planning
        void calcNextYaw(const double& last_yaw, double& yaw);

        // !SECTION stable

        // SECTION developing

    public:
        typedef unique_ptr<FastPathFinder> Ptr;

        // !SECTION
    };
}  // namespace fast_planner





//MPManager.h
class MPManager{
public:
    MPManager(const MP_Config& config);
    void SetMpEnable(bool is_enable);
    void OnUpdateDroneStatus(const TVec3 &drone_pos, const TVec3 &drone_vel, const TVec3 &drone_acc, const TVec3 &drone_attitude);
    void OnUpdateTargetPos(const TVec3& target_pos);
    void OnUpdateMaxSpeed(float speed_max);
    void OnUpdateDroneHeading(float drone_heading);
    bool GetControlOutput(TVec3& vector_eus);
    void ProcessState();
    void updateMotionPlan(const float dist, const TVec3 &insp_vec,
                          const vector<TVec3> &waypoints);
    void bsplineResult(const offboard::Bspline& msg);
    void OnUpdateOctomap(const octomap_msgs::Octomap &msg);
    void updateEndVel(const TVec3 &end_vel);
private:
    enum MP_EXEC_STATE {
        INIT,
        WAIT_TARGET,
        GEN_NEW_TRAJ,
        REPLAN_TRAJ,
        EXEC_TRAJ,
        REPLAN_NEW
    };
    ros::NodeHandle nh_;
    MP_Config mp_config_;
    Drone_State drone_st_;
    MP_EXEC_STATE mp_state_;
    TVec3 start_pt_,start_vel_,start_acc_, end_pos_, end_vel_;
    TVec3 pre_end_pt_;
    ros::Time start_time_;
    vector<NonUniformBspline> real_traj_;
    vector<NonUniformBspline> plan_traj_;
    double traj_duration_;
    float dist_config_;
    TVec3 insp_vec_ENU_;
    float min_dist_to_line_ = 100000;

    Sp<IPathFinder> path_finder_;
    Sp<MPPublisher> mp_publisher_;
    Sp<IMap> mp_map_;
    //Sp<FastPathFinder> planner_manager_;
    //PlanningVisualization::Ptr visualization_;

    vector<TVec3> traj_cmd_;

    bool receive_traj_;
    bool has_drone_update_;
    TVec3 init_target_pos_;
    int path_find_fail_timer_;

    // private functions
    void CalcDistToCenter(float &dist, const TVec3 &cur_pos, TVec3 start_pos, TVec3 end_pos);
    bool CallKinodynamicReplan();
    void ChangeExecState(MP_EXEC_STATE new_state, string pos_call);
    void initAfterTriggered(const TVec3& target_pos);
    void changeToTurbineFrame(TVec3 &pnt, TVec3 &pos_in_turbine_EUS);
};
class MPPublisher{
public:
    void OnInit(const float state);
    void DrawTrajCommand(const TVec3 &pos, const TVec3 &vec, const Eigen::Vector4d &color, int id);
    void DrawFlightCorridor(TVec3 &start_point, TVec3 &end_point);
    bool updateMPTarget(const float dist, const vector<TVec3> &waypoints);
    void updateDroneData(const TVec3 &drone_pos);
    void displayTrajWithColor(vector<TVec3> &path, double resolution, const Eigen::Vector4d &color, int id);
    void drawGoal(TVec3 goal, double resolution, const Eigen::Vector4d& color, int id = 0);
    void drawGeometricPath(const vector<Eigen::Vector3d>& path);
    void drawBspline(NonUniformBspline& bspline);
private:
    void calcDistToCenter(float &dist, const TVec3 &cur_pos, TVec3 start_pos, TVec3 end_pos);
    ros::Publisher  motionPlanPub_, mp_drone_pos_update_pub_, mp_track_distance_pub_, cmd_vis_pub_, pos_cmd_pub, traj_pub_, drone_vel_sp_pub_, mp_state_pub_, marker_blade_pub_, marker_path_pub_, fitting_path_pub_, flight_corridor_pub_, path_update_pub_; Sp<PlanningVisualization> visualization_;

    float dist_config_;
    bool drone_update_;
    bool KF_init_;
    int mp_state_;
    int traj_pub_time_;

    TVec3 drone_pos_;
    vector<TVec3> wayPoints_;};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值