[路径规划] VFF和VFH
VFF虚拟力场法
1 #ifndef VFF_HEADER 2 #define VFF_HEADER 3 #include <vector> 4 #include "utils\point.h" 5 #include <stdlib.h> 6 #include <math.h> 7 #include <algorithm> 8 ////////////////////////////////////////////////////////////////////////// 9 //target全局坐标系下的目标点 10 //obstacles围绕激光为中心-180度到180度逆时针激光扫描点 11 //theta里程计中的theta角 12 //desiredDirection机器人应该运动的方向(全局坐标) 13 inline void navigate(const GMapping::Point &target,const std::vector<float> &obstacles,double theta, 14 double maxRobotSpeed, 15 double TARGET_ATTRACTIVE_FORCE,double TARGET_SLOW_APPROACHING_DISTANCE, 16 double &desiredDirection, 17 double &desiredSpeed) 18 { 19 //MRPT_UNUSED_PARAM(maxRobotSpeed); 20 // Forces vector: 21 GMapping::Point resultantForce(0,0),instantaneousForce(0,0); 22 23 // Obstacles: 24 { 25 const size_t n = obstacles.size(); 26 const double inc_ang = 2*M_PI/n; 27 double ang = -M_PI + 0.5*inc_ang+theta;//注意此处,从-180度开始逆时针存储数据 28 for (size_t i=0;i<n;i++, ang+=inc_ang ) 29 { 30 // Compute force strength: 31 //const double mod = exp(- obstacles[i] ); 32 const double mod = min(1e6, 1.0/ obstacles[i] ); 33 34 // Add repulsive force: 35 instantaneousForce.x = -cos(ang) * mod; 36 instantaneousForce.y = -sin(ang) * mod; 37 resultantForce =resultantForce+ instantaneousForce; 38 } 39 } 40 41 const double obstcl_weight = 20.0/obstacles.size(); 42 resultantForce =resultantForce* obstcl_weight; 43 double resultantForcenorm = sqrt(resultantForce.x *resultantForce.x+ resultantForce.y+resultantForce.y); 44 const double obstacleNearnessFactor = min( 1.0, 6.0/resultantForcenorm); 45 46 // Target: 47 const double ang = atan2( target.y, target.x ); 48 const double mod = TARGET_ATTRACTIVE_FORCE; 49 resultantForce =resultantForce+ GMapping::Point(cos(ang) * mod, sin(ang) * mod ); 50 51 // Result: 52 desiredDirection = (resultantForce.y==0 && resultantForce.x==0) ? 53 0 : atan2( resultantForce.y, resultantForce.x ); 54 55 // Speed control: Reduction factors 56 // --------------------------------------------- 57 double targetnorm=sqrt(target.x *target.x + target.y*target.y); 58 const double targetNearnessFactor = min( 1.0, targetnorm/(TARGET_SLOW_APPROACHING_DISTANCE)); 59 //desiredSpeed = maxRobotSpeed * std::min(obstacleNearnessFactor, targetNearnessFactor); 60 desiredSpeed = min(obstacleNearnessFactor, targetNearnessFactor); 61 } 62 #endif
参考mrpt中的代码,因为其中针对的是全向机器人,所以做了部分修改适用有Heading的机器人。
VFH矢量场直方图
该方法取机器人周围一定距离范围的窗口,将空间离散为栅格。
扩展阅读
https://github.com/agarie/vector-field-histogram
https://github.com/ecmnet/MAVSlam/tree/c55e63eca4111e01245e0e3389f1e568782096fc/MAVSlam/src/com/comino/slam/vfh/vfh2D
http://www-personal.umich.edu/~johannb/vff&vfh.htm
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
2013-05-29 [WorldWind学习]17.视域调度(视域体裁剪)
2013-05-29 [WorldWind学习]16.Lod技术(1)