论文阅读:EGO-Planner: An ESDF-free Gradient-based Local Planner for Quadrotors

1.框架梳理

在这里插入图片描述

2.某些疑惑的个人后期理解

在这里插入图片描述

  1. 一个控制点Qi为什么有多个{p,v}对呢?
    理解:结合原论文算法1(控制点pv对生成算法)和算法2(ego planner整体流程),可知算法1循环执行。即控制点首次位于障碍物内部时,生成对应的第1号pv对;在优化过程中,如果该控制点被推至另一个障碍物,则算法1还会被调用,此时会生成属于该控制点的第2号pv对…以此类推

  2. 红色行的j到底是什么含义:表示pv对?还是障碍物(大概率为有效的pv对)?
    理解:一个控制点可以对应多个pv对,故j表示某个控制点对应的所有pv对

  3. 新发现障碍物时,pv对如何增加变化?
    理解:新增加一个障碍物会新增加一个属于该障碍物的pv对,原来的pv对位置保持不变

  4. 如何理解新旧障碍物?
    理解:根据原论文公式1下的描述及后文推理,每一个控制点一旦生成pv对之后p、v保持不变,一个控制点可以拥有多个pv对。当属于某控制点的所有pv对的dij都变为正,则表明控制点进入新障碍物。

  5. dij的正负性?
    理解:dij在障碍物内部就是小于0,障碍物外部才大于0

  6. 均匀b样条的时间间隔等比例放大会有什么问题?
    理解:通过在线软件发现节点间隔均匀变大曲线形状保持不变,时间间隔变大则导致pva变化,则可能导致光滑性的变化

3.参考博客

EGO-Planner:一种无需 ESDF(欧几里得距离场) 梯度的局部路径规划方法

Ego-Planner是一个基于ROS的路径规划器,它可以在给定的地图和起点、终点信息下,生成一条可行的路径。以下是Ego-Planner的代码框架: 1. 首先需要定义一个EgoPlanner类,其中包含了一些必要的成员变量和函数。 ```c++ class EgoPlanner { private: ros::NodeHandle nh_; ros::Subscriber sub_map_; ros::Subscriber sub_pose_; ros::Subscriber sub_goal_; ros::Publisher pub_path_; nav_msgs::OccupancyGrid map_; geometry_msgs::PoseStamped start_; geometry_msgs::PoseStamped goal_; public: EgoPlanner(); // 构造函数 ~EgoPlanner(); // 析构函数 void mapCallback(const nav_msgs::OccupancyGrid::ConstPtr& msg); // 地图回调函数 void poseCallback(const geometry_msgs::PoseStamped::ConstPtr& msg); // 当前位置回调函数 void goalCallback(const geometry_msgs::PoseStamped::ConstPtr& msg); // 目标位置回调函数 void plan(); // 路径规划函数 }; ``` 2. 在构造函数中,需要完成ROS节点的初始化、订阅和发布话题的设置。 ```c++ EgoPlanner::EgoPlanner() { nh_ = ros::NodeHandle("~"); sub_map_ = nh_.subscribe("map", 1, &EgoPlanner::mapCallback, this); sub_pose_ = nh_.subscribe("pose", 1, &EgoPlanner::poseCallback, this); sub_goal_ = nh_.subscribe("goal", 1, &EgoPlanner::goalCallback, this); pub_path_ = nh_.advertise<nav_msgs::Path>("path", 1); } ``` 3. 在地图、当前位置和目标位置的回调函数中,需要将接收到的信息保存到对应的成员变量中。 ```c++ void EgoPlanner::mapCallback(const nav_msgs::OccupancyGrid::ConstPtr& msg) { map_ = *msg; } void EgoPlanner::poseCallback(const geometry_msgs::PoseStamped::ConstPtr& msg) { start_ = *msg; } void EgoPlanner::goalCallback(const geometry_msgs::PoseStamped::ConstPtr& msg) { goal_ = *msg; } ``` 4. 在路径规划函数中,需要调用路径规划算法,生成一条可行的路径,并将路径发布出去。 ```c++ void EgoPlanner::plan() { // 调用路径规划算法,生成一条可行的路径 std::vector<geometry_msgs::PoseStamped> path = pathPlanning(map_, start_, goal_); // 将路径发布出去 nav_msgs::Path path_msg; path_msg.header.frame_id = "map"; path_msg.header.stamp = ros::Time::now(); path_msg.poses = path; pub_path_.publish(path_msg); } ``` 5. 在主函数中,创建EgoPlanner对象,并进入ROS循环。 ```c++ int main(int argc, char** argv) { ros::init(argc, argv, "ego_planner"); EgoPlanner planner; ros::Rate rate(10); while (ros::ok()) { planner.plan(); ros::spinOnce(); rate.sleep(); } return 0; } ``` 以上就是Ego-Planner的代码框架,其中路径规划算法需要根据具体情况进行选择和实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值