尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

PythonRobotics 如何用矩形拟合从激光测距数据中识别 L 形车辆目标

PythonRobotics 如何用矩形拟合从激光测距数据中识别 L 形车辆目标 PythonRobotics 如何用矩形拟合从激光测距数据中识别 L 形车辆目标【免费下载链接】PythonRoboticsPython sample codes and textbook for robotics algorithms.项目地址: https://gitcode.com/GitHub_Trending/py/PythonRobotics这篇文章的任务是把激光测距雷达lidar打回的一圈距离数据按目标聚类并对每一簇用矩形拟合出目标的轮廓朝向与位置从而在地图上标出车辆这类目标。PythonRobotics 在 Mapping/rectangle_fitting 中提供了完整示例算法参照论文《Efficient L-Shape Fitting for Vehicle Detection Using Laser Scanners》。跑完示例后你会看到一个 matplotlib 动画两辆仿真的车辆移动每 0.2 秒用 lidar 观测一次观测点被分成若干簇每个簇上画出一个红色拟合矩形仿真结束后终端打印Done。准备环境按 运行示例代码说明 的配置安装 Python 3.12.x。文档说明旧版本 Python 3 可能也能运行但示例代码只在该版本上做过测试。克隆仓库并进入目录git clone https://github.com/AtsushiSakai/PythonRobotics.git cd PythonRobotics安装依赖二选一# 使用 conda conda env create -f requirements/environment.yml # 或使用 pip pip install -r requirements/requirements.txt本示例的第三方依赖在 requirements/requirements.txt 中锁定为numpy、scipy、matplotlib等核心算法只需要 numpy 与 matplotlib。算法流程从测距点到拟合矩形示例由两步组成实现在 LShapeFitting 类 中Step1自适应距离分段Adaptive Range Segmentation每个测距点先找它的邻域簇以该点为原点把距离小于阈值r的点收进同一簇阈值按下式计算r_th R0 Rd * r_origin其中R0、Rd是常数参数默认R03.0、Rd0.001单位 mr_origin是该点到传感器的距离。阈值随距离线性增大利用了距离传感器距离越远数据越稀疏的特性。之后反复合并有交集的簇直到不再变化得到最终的目标聚类。Step2矩形搜索Rectangle Search对每个簇把点集按角度间隔d_theta_deg_for_search默认 1°从 0° 旋转到 90°在每个角度下用三种判据之一评分取最优角度作为矩形方向Area矩形面积最小化取旋转后坐标的最小外接矩形面积面积越小越好Closeness接近度用矩形边上顶点到各点的距离评分点落在矩形边上时评分提高Variance方差用矩形水平/竖直边到各点距离的平方即方差方差越小说明点越贴合矩形。判据通过self.criteria切换取值为LShapeFitting.Criteria中的AREA/CLOSENESS/VARIANCE默认是VARIANCE。与判据相关的其他默认参数min_dist_of_closeness_criteria 0.01mcloseness 判据的最小距离、d_theta_deg_for_search 1.0°搜索角度间隔。仿真设置两辆车 一圈 lidarmain() 函数 内置了一个自包含仿真不需要任何外部数据仿真时间sim_time 30.0s时间步长dt 0.2s传感器角度分辨率angle_resolution 3°两辆仿真车 VehicleSimulatorv1初始位置 (-10.0, 0.0)朝向 90°初速 0限速 50/3.6 m/s宽 3.0 m、长 5.0 mv2初始位置 (20.0, 10.0)朝向 180°初速 0限速 50/3.6 m/s宽 4.0 m、长 10.0 m每步两车调用update(dt, a, omega)运动v1用a0.1, omega0.0v2用a0.1, omega-0.05。LidarSimulator 从原点向两辆车的轮廓采样测距点测距噪声比例range_noise 0.01即距离按 ±1% 的随机比例扰动再用ray_casting_filter按角度分辨率做光线投射过滤同一角度方向只保留最近距离输出观测点ox, oy——这就是要送去拟合的激光测距数据。运行示例并观察拟合效果在仓库根目录执行python Mapping/rectangle_fitting/rectangle_fitting.py脚本以动画方式运行每个时间步清空画布依次画出原点处的 lidar红色*r标记两辆车的移动轨迹与当前轮廓蓝色每个聚类簇内的观测点绿色并从原点画射线每个簇拟合出的矩形红色来自rect.plot()。仿真窗口可用 ESC 键提前停止正常跑完 30 s 仿真后终端打印Done看到Done即表示整个仿真与拟合流程无异常跑完。若想在无显示环境运行可把文件顶部的show_animation True改为False单测就是这么做的见 tests/test_rectangle_fitting.py。结果验证方式项目为这个示例提供了单测 tests/test_rectangle_fitting.py它关闭动画后完整执行main()pytest tests/test_rectangle_fitting.py -l -Werror也可以用仓库自带的测试入口 runtests.shpytest tests -l -Werror --durations0跑全量测试其中包含该用例。测试通过、且main()正常打印Done说明聚类与矩形拟合在默认参数下可完整执行。接口与关键文件如果你想在自己的 lidar 数据上复现这个识别流程直接调用核心接口即可from Mapping.rectangle_fitting.rectangle_fitting import LShapeFitting l_shape_fitting LShapeFitting() l_shape_fitting.criteria l_shape_fitting.Criteria.AREA # 可换成 CLOSENESS / VARIANCE rects, id_sets l_shape_fitting.fitting(ox, oy) # rects: 每个簇一个 RectangleData含四条边参数 a/b/c 与轮廓点 # id_sets: 每个簇对应的观测点索引集合ox, oy是测距点的 x、y 坐标仿真中来自lidar_sim.get_observation_points([v1, v2], angle_resolution)。RectangleData提供plot()直接绘制矩形calc_rect_contour()计算五个轮廓点首尾闭合。相关文件索引文件作用Mapping/rectangle_fitting/rectangle_fitting.pyLShapeFitting、RectangleData与main()仿真入口Mapping/rectangle_fitting/simulator.pyVehicleSimulator与LidarSimulator含噪声模型与 ray casting 过滤tests/test_rectangle_fitting.py无动画模式下的完整运行测试docs/modules/3_mapping/rectangle_fitting/rectangle_fitting_main.rst算法说明文档含动画 gif注意仓库中 Mapping/rectangle_fitting/_init.py 的文件名是__init_.py少了一个下划线直接python Mapping/rectangle_fitting/rectangle_fitting.py或 pytest 方式运行不受影响但如果自己写包内导入脚本时遇到问题先检查这一点。适用边界文档没有给出实车/实测 lidar 的部署说明示例的输入始终是LidarSimulator生成的二维平面测距点fitting()也只接收点集ox, oy不区分目标类型——它做的是把点聚成簇并拟合矩形是否算车辆目标由上层逻辑判断。若要把判据从默认的VARIANCE换成AREA或CLOSENESS只需改self.criteria一项文档未对三种判据的效果差异给出量化对比选择时可参考上述三种判据的定义自行验证。【免费下载链接】PythonRoboticsPython sample codes and textbook for robotics algorithms.项目地址: https://gitcode.com/GitHub_Trending/py/PythonRobotics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表