Bresenham Algorithm
为了通过雷达构建占用栅格地图,需要计算雷达扫过的障碍栅格和非障碍栅格。如下图,
于是采用BresenhamAlgorithm快速计算占用栅格集合。
算法思路
首先假设两个坐标点,分别为雷达测量的起点和终点
(x1,y1),(x2,y2)
且满足x2>x1,y2>y1,根据起始点信息计算直线方程:
Δx=x2−x1Δy=y2−y1m=ΔyΔxb=y1−mx1=y2−mx2直线方程为:y=mx+b

假设已经计算到点(xk,yk),下一个占用栅格坐标仅有两种情况
注意这里的xk,yk并非二维连续空间坐标,而是占用栅格地图的索引,其中包含栅格边长信息r实际坐标应为(xk⋅r,yk⋅r)
(xk+1,yk)(xk+1,yk+1)
实际上我们更希望选取与真实直线距离更近的占用栅格坐标。
首先计算直线与轴x=(xk+1)⋅r交点y,再分别计算图中d1,d2
d1=y−yk⋅r=m(xk+1)⋅r+b−yk⋅rd2=(yk+1)⋅r−y=(yk+1)⋅r−m(xk+1)⋅r−b
对d1,d2做差
d1−d2=2m⋅(xk+1)⋅r−2yk⋅r+2b−rd1−d2>0−>d2<d1d1−d2<0−>d1<d2
所以结果大于零代表距离yk+1更近,反之为yk。基本思路很简单,接下来需要做的是需要如何减少算法计算量。
减少浮点运算
d1−d2中仍然具有浮点运算,对于一个二选一的问题,不需要精确的浮点运算,其实更有价值的是符号(正负)信息。引入
pk=Δx(d1−d2)=[2ΔyΔx⋅(xk+1)⋅r−2yk⋅r+2b−r]⋅Δx=2Δy⋅(xk+1)⋅r−2ykΔx⋅r+2bΔx−rΔx=2Δy⋅xk⋅r+2Δy⋅r−2ykΔx⋅r+2bΔx−rΔx=2Δy⋅xk⋅r−2Δx⋅yk⋅r+c
其中c=2Δy⋅r+2bΔx−rΔx为常量不随坐标发生变化,且由于假设x2>x1可得Δx>0,所以pk与d1−d2同号。
所以可以将pk=f(xk,yk)作为下一步占用栅格旋转的决策依据,继续计算pk+1,
xk+1−xk=1,x轴每次步进一个单位,(yk+1−yk)为1或0;pk>0为1反之为0
pk+1=2Δy⋅(xk+1)⋅r−2Δx⋅yk+1⋅r+cpk+1−pk=2Δy⋅r−2Δx(yk+1−yk)⋅rpk+1=pk+2Δy⋅r−2Δx(yk+1−yk)⋅r
进而得到递推形式pk+1=pk+2Δy−2Δx(yk+1−yk)。
起点(x0,y0)处的p0为:
y0⋅r=mx0⋅r+bΔx⋅yor=Δy⋅x0r+b⋅Δxp0=2Δy⋅x0⋅r−2Δx⋅y0⋅r+c=2Δy⋅x0⋅r−2Δy⋅x0r−2b⋅Δx+c=−2bΔx+2Δy⋅r+2bΔx−rΔx=2Δy⋅r−Δx⋅r=(2Δy−Δx)⋅r
具体实现
上文所叙述的推导仅适用于斜率在m∈(−1,1)的范围内,当m∈(+∞,1)∪(−∞,−1),采用y轴步进,具体改变如下图
由于斜率的变化导致d1,d2计算方式改变,具体不再推导,给出该情况下pk表达式
p0=(2Δx−Δy)⋅rpk+1=pk+2Δx⋅r−2Δy(xk+1−xk)⋅r
伪代码

根据斜率分为|m|≤1,|m|>1两种情况,并根据m的符号判断步进增或步进减。代码已上传GITEE。
效果
取单次雷达采集信息,Lidar.obs为机器人局部坐标下的采集结果,Macanum.state为机器人全局信息[x,y,θ]。地图真实大小为15×15m。
取r=0.5:

取r=0.1

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

参考:
占据栅格地图(Occupancy Grid Map)
【计算机图形学】画线算法——Bresenham算法(任意斜率)
计算机图形学实验(二)—— 直线Bresenham算法源码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~