启发式寻路算法--曼哈顿距离

曼哈顿距离

曼哈顿距离又称马氏距离、出租车距离。如下图所示:

注:<1>白色表示障碍物  <2> 灰色表示可走路径

           从图可知,A点到B点中,红线代表曼哈顿距离,绿色代表欧氏距离,也就是我们说的直线距离,而蓝色和黄色代表等价的曼哈顿距离。为什么说黄色和蓝色等价于曼哈顿距离呢?我们将图再进行处理:

处理图片后,定义出X轴和Y轴,可以一目了然,分析蓝色线和黄色线。

1:蓝色线走的横向距离就是Y1+Y2+....+Yn,竖向距离就是X1+X2+...+Xn

2:黄色线走的横向距离就是两段即Y1+Y2,竖向距离也是两段X1+X2

综上两点,蓝色线走的x轴距离、y轴距离等于黄色线的x轴和y轴距离。所以,黄色线和蓝色线在x轴和y轴距离就是红色线的距离,即等价于曼哈顿距离。

启发式寻路算法

启发式寻路算法就是根据曼哈顿距离而来,我们可以利用其进行马哈顿距离估值。

1>假设从A点到B点,中间有障碍物I

2>在寻路中,我们肯定要绕过障碍物I到达B点,所以,我们要寻找下一点c为过度,到达B点。所以,引出两个关键说明,即是实际代价(g)和预估代价(h)。

如图,实际代价(g),就是A点到达C点实际需要的距离。

3>当过渡到c点后,我们还需要在c点处对目标点B点的距离进行估值,也就是下图的预估代价(h),因为这里仅仅是举出一个过渡点C,现实开发中,可不止一个过渡点c喔,有可能有D,E,F....点等。所以,每走到一个新的点上,我们需要再一次预估此点到目标终点的距离。

4>这就是启发式寻路算法,包含实际代价(g)和预估代价(h),所以我们不难得出表达式f(n)=g(n)+h(n)。

启发式寻路算法在实际开发中非常常用,比如地图算最短距离,游戏地图等等。

在Arduino项目中,让小车在方形场地内沿S形路线避开障碍物,我们需要利用基本的硬件控制,如马达驱动、超声波传感器以及Arduino Uno或其他兼容板。以下是步骤和大致的伪代码描述: 1. **硬件准备**: - Arduino主板 - 两个直流电机驱动模块 - 超声波测距模块 - 方向舵电机(用于转向) 2. **软件安装**: - 安装Arduino IDE并连接相应的库,例如`Adafruit_Sensor`(对于超声波传感器)、`Wire`(I2C通信)等。 3. **代码结构**: - 初始化部分:设置电机速度,超声波传感器,读取初始方向。 - 主循环: a. 计算S形路线的下一个点 b. 使用超声波传感器检测前方是否有障碍 c. 如果有障碍,计算新的转向角度,让小车转弯绕过障碍 d. 控制电机前进到下一个点 e. 检查是否到达终点或完成一圈,如果未完,则返回起点继续 ```cpp // Pseudo-code (你需要替换为具体的函数和变量名) void setup() { // Initialize motors and sensors } void loop() { int currentPoint = calculateNextSPoint(); // 获取下一个S形位置 if (detectObstacle()) { // Check for an obstacle turnToAvoidObstacle(); } moveForward(currentPoint); // Move forward to the point checkIfCompleted(); // If done, reset back to starting point } ``` 4. **关键函数**: - `calculateNextSPoint()`:基于当前位置计算下一个S形路径点。 - `detectObstacle()`:使用超声波传感器测量距离,判断是否有障碍。 - `turnToAvoidObstacle()`:计算转角,更新方向舵电机的角度。 - `moveForward(point)`:控制直线移动到指定点。 - `checkIfCompleted()`:检查是否达到预定边界或完成一圈。 5. **注意事项**: - 确保超声波传感器校准准确。 - 避免无限循环,在无阻碍的情况下,小车应能够安全地完成S形路线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值