【运动规划算法项目实战】TABV代码解析(四):plan_env

本文详细解析了TABV导航框架中的plan_env模块,该模块利用射线投射和深度图像更新概率体素地图,构建欧氏距离场,用于地空双模式车辆的自主导航。通过理解代码实现,可以了解如何实现环境建模和路径规划,为自动驾驶系统提供关键的环境感知数据。


前言

在这系列文章中,我们将对TABV导航框架的代码进行详细解析。该框架是一种地空双模式车辆的自主自适应导航(Terrestrial-Aerial Bimodal Vehicles,TABV)框架。通过结合空中车辆的高机动性和地面车辆的长续航能力,该框架实现了车辆的完全自主性。通过深入分析代码,我们将深入了解该框架的工作原理和关键算法,以及如何实现车辆的导航功能。这将有助于我们更好地理解和应用TABV导航框架,为地空双模式车辆的开发和研究提供有力支持。

源码请参考https://github.com/ZJU-FAST-Lab/Terrestrial-Aerial-Navigation

所有的规划算法以及其他关键模块的实现都在 TIE_navigation 文件夹中:

  • plan_env:在线建图算法。它接收深度图像(或点云)和相机位姿(里程计)作为输入,通过射线投射更新概率体素地图,并构建规划系统的欧氏距离场(ESDF)。
  • path_searching:前端路径搜索算法的实现。
  • bspline:基于B样条轨迹的实现。
  • bspline_opt:使用B样条轨迹的梯度优化算法。
  • active_perception:感知感知规划策略,使四旋翼能够主动观测和避开未知障碍物,在未来将会出现。
  • p
<think>我们正在注释一个C++头文件,该文件定义了一个名为EDTEnvironment的类,用于处理环境中的欧几里得距离变换(EDT)和相关功能。 注意:这个类主要用于路径规划中,以获取环境中某点的距离场及其梯度。 我们需要详细注释每个成员函数和成员变量。 由于代码中使用了SDFMap和ObjPrediction等自定义类型,我们也会简要说明它们的作用。 注意:注释要详细且符合代码逻辑。 </think>```cpp #ifndef _EDT_ENVIRONMENT_H_ #define _EDT_ENVIRONMENT_H_ #include <Eigen/Eigen> // 线性代数库 #include <geometry_msgs/PoseStamped.h> // ROS位姿消息 #include <iostream> // 标准输入输出 #include <ros/ros.h> // ROS核心功能 #include <utility> // 通用工具 #include <plan_env/obj_predictor.h> // 障碍物预测模块 #include <plan_env/sdf_map.h> // 符号距离场(SDF)地图 using std::cout; using std::endl; using std::list; using std::pair; using std::shared_ptr; using std::unique_ptr; using std::vector; namespace tabv_planner { /** * 欧氏距离变换环境类 (EDTEnvironment) * 功能:提供基于欧氏距离变换(EDT)的环境信息查询接口 * 核心能力:计算空间中任意点到最近障碍物的距离及其梯度 * 应用场景:路径规划中的碰撞检测和梯度引导 */ class EDTEnvironment { private: ObjPrediction obj_prediction_; // 动态障碍物预测信息 ObjScale obj_scale_; // 障碍物尺寸信息 double resolution_inv_; // 地图分辨率倒数(用于加速计算) /* 计算点到特定障碍物的最小距离 * @param idx 障碍物索引 * @param pos 查询位置 (x,y,z) * @param time 查询时间 (用于动态障碍物) * @return 最小欧氏距离 */ double distToBox(int idx, const Eigen::Vector3d& pos, const double& time); /* 计算点到所有障碍物的最小距离 * @param pos 查询位置 * @param time 查询时间 * @return 到所有障碍物的最小距离 */ double minDistToAllBox(const Eigen::Vector3d& pos, const double& time); public: EDTEnvironment() = default; // 默认构造函数 ~EDTEnvironment() = default; // 默认析构函数 SDFMap::Ptr sdf_map_; // 符号距离场地图智能指针 /* 环境初始化 */ void init(); /* 设置距离场地图 * @param map SDF地图智能指针 */ void setMap(SDFMap::Ptr map); /* 设置障碍物预测信息 * @param prediction 障碍物预测数据结构 */ void setObjPrediction(ObjPrediction prediction); /* 设置障碍物尺寸 * @param scale 障碍物尺寸结构体 */ void setObjScale(ObjScale scale); /* 获取点在周围8个网格点的距离值 * @param pts [输出] 周围8个网格中心坐标 * @param dists [输出] 对应网格的距离值 */ void getSurroundDistance(Eigen::Vector3d pts[2][2][2], double dists[2][2][2]); /* 三线性插值计算位置的距离值和梯度 * @param values [输入] 周围8个网格的距离值 * @param diff [输入] 位置相对于最小角落网格的偏移 * @param value [输出] 插值后的距离值 * @param grad [输出] 插值后的梯度向量 */ void interpolateTrilinear(double values[2][2][2], const Eigen::Vector3d& diff, double& value, Eigen::Vector3d& grad); /* 计算给定位置和时间的距离及梯度(精确查询) * @param pos 查询位置 * @param time 查询时间 * @param dist [输出] 最近距离值 * @param grad [输出] 距离梯度向量 */ void evaluateEDTWithGrad(const Eigen::Vector3d& pos, double time, double& dist, Eigen::Vector3d& grad); /* 计算给定位置和时间的距离(快速近似查询) * @param pos 查询位置 * @param time 查询时间 * @return 最近距离近似值 */ double evaluateCoarseEDT(Eigen::Vector3d& pos, double time); /* 获取地图区域范围 * @param ori [输出] 地图原点坐标 * @param size [输出] 地图尺寸 */ void getMapRegion(Eigen::Vector3d& ori, Eigen::Vector3d& size) { sdf_map_->getRegion(ori, size); } typedef shared_ptr<EDTEnvironment> Ptr; // 智能指针别名 }; } // namespace tabv_planner #endif // _EDT_ENVIRONMENT_H_ ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xiewf8128

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值