Bresenham Algorithm

Bresenham Algorithm

​ 为了通过雷达构建占用栅格地图,需要计算雷达扫过的障碍栅格和非障碍栅格。如下图,

img

于是采用BresenhamAlgorithm快速计算占用栅格集合。

算法思路

​ 首先假设两个坐标点,分别为雷达测量的起点和终点

(x1,y1),(x2,y2)

且满足x2>x1,y2>y1,根据起始点信息计算直线方程:

Δx=x2x1Δy=y2y1m=ΔyΔxb=y1mx1=y2mx2线y=mx+b

img

​ 假设已经计算到点(xk,yk),下一个占用栅格坐标仅有两种情况

注意这里的xk,yk并非二维连续空间坐标,而是占用栅格地图的索引,其中包含栅格边长信息r实际坐标应为(xkr,ykr)

(xk+1,yk)(xk+1,yk+1)

实际上我们更希望选取与真实直线距离更近的占用栅格坐标。

​ 首先计算直线与轴x=(xk+1)r交点y,再分别计算图中d1,d2

d1=yykr=m(xk+1)r+bykrd2=(yk+1)ry=(yk+1)rm(xk+1)rb

d1,d2做差

d1d2=2m(xk+1)r2ykr+2brd1d2>0>d2<d1d1d2<0>d1<d2

所以结果大于零代表距离yk+1更近,反之为yk。基本思路很简单,接下来需要做的是需要如何减少算法计算量。

减少浮点运算

d1d2中仍然具有浮点运算,对于一个二选一的问题,不需要精确的浮点运算,其实更有价值的是符号(正负)信息。引入

pk=Δx(d1d2)=[2ΔyΔx(xk+1)r2ykr+2br]Δx=2Δy(xk+1)r2ykΔxr+2bΔxrΔx=2Δyxkr+2Δyr2ykΔxr+2bΔxrΔx=2Δyxkr2Δxykr+c

其中c=2Δyr+2bΔxrΔx为常量不随坐标发生变化,且由于假设x2>x1可得Δx>0,所以pkd1d2同号。

​ 所以可以将pk=f(xk,yk)作为下一步占用栅格旋转的决策依据,继续计算pk+1

xk+1xk=1x轴每次步进一个单位,(yk+1yk)为1或0;pk>0为1反之为0

pk+1=2Δy(xk+1)r2Δxyk+1r+cpk+1pk=2Δyr2Δx(yk+1yk)rpk+1=pk+2Δyr2Δx(yk+1yk)r

进而得到递推形式pk+1=pk+2Δy2Δx(yk+1yk)

​ 起点(x0,y0)处的p0为:

y0r=mx0r+bΔxyor=Δyx0r+bΔxp0=2Δyx0r2Δxy0r+c=2Δyx0r2Δyx0r2bΔx+c=2bΔx+2Δyr+2bΔxrΔx=2ΔyrΔxr=(2ΔyΔx)r

具体实现

​ 上文所叙述的推导仅适用于斜率在m(1,1)的范围内,当m(+,1)(,1),采用y轴步进,具体改变如下图

image-20240304155448587

由于斜率的变化导致d1,d2计算方式改变,具体不再推导,给出该情况下pk表达式

p0=(2ΔxΔy)rpk+1=pk+2Δxr2Δy(xk+1xk)r

伪代码

image-20240304171749129

​ 根据斜率分为|m|1,|m|>1两种情况,并根据m的符号判断步进增或步进减。代码已上传GITEE

效果

​ 取单次雷达采集信息,Lidar.obs为机器人局部坐标下的采集结果,Macanum.state为机器人全局信息[x,y,θ]。地图真实大小为15×15m

r=0.5:

untitled

r=0.1

untitled1
使用一系列数据连续运行:
Occupy

参考:

占据栅格地图(Occupancy Grid Map)

【计算机图形学】画线算法——Bresenham算法(任意斜率)

计算机图形学实验(二)—— 直线Bresenham算法源码

作者:whwhhf

出处:https://www.cnblogs.com/whwhhf/p/18052310

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   DOinging  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题