栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

navigation源码中Costmap2d中使用的Breshenham代码解析

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

navigation源码中Costmap2d中使用的Breshenham代码解析

因为更新的是直线所经历过的栅格而不是点了,所以需要考虑选择右边的还是右上的

从最原始的计算开始,现在只考虑第一想象的,直线的斜率k小于1, 从起点开始,x增加一个单位,因为是一个单位,所以y增加了斜率k, 如上图, d1 > d2, 就选择右上的格子,d1 < d2就选择右边格子,d1==d2就设定为选者右上格子,即d1>= 0.5时选择右上格子。实际代码中设置一个比较值变量e=0.5, k-e>=0 则选者右上格子, (yn - y0 / (xn -x0)) - e = dy/dx - e > 0 =  dy/dx -0.5 >= 0选择右上格子,实际代码中避免用除法和小数,不等式两边同时乘以dx, 有

                                            dy - 0.5dx >= 0

                                             dy +   dx/2  >=  dx,

代码里用的是这个公式判断x增加一个单位时,y变化

然后考虑4个像限的情况和斜率大于1情况,x占主导还是y占主导

X占主导时  即k < 1 
inline void bresenham2D(ActionType at, unsigned int abs_da, unsigned int abs_db, int error_b, int offset_a,int offset_b, unsigned int offset, unsigned int max_length)
    {
        


        
      unsigned int end = std::min(max_length, abs_da);
      for (unsigned int i = 0; i < end; ++i)
      {
        at(offset);//更新栅格代价为空闲
        offset += offset_a;//x 或y方向加一个单位, x or y的一个单位所移动的格子数是不同的
        
         //这里用的就是公式  dy +   dx/2  >=  dx
        error_b += abs_db;//
        if ((unsigned int)error_b >= abs_da)//满足就是k >=0.5
        {
          offset += offset_b;// y方向增加一个单位,对于map下就是增加了一个行即这里的offset_b

          error_b -= abs_da;//更新error_b, 因为下次计算y时  x已经增加了一个单位了
        }
      }
      at(offset);//更新栅格代价为空闲
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664700.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号