本项目是针对**美团第三届低空经济智能飞行管理挑战赛(性能赛)*的完整开源解决方案。本方案基于 ROS 框架,结合了基于规则的自然语言指令解析、YOLOv8 与 3D LiDAR 的多模态感知融合、鲁棒的有限状态机(FSM)决策、A 与 DWA 局部避障规划,以及高精度的 ArUco 终点对齐技术,实现了地面小车在复杂仿真环境下的自主视觉语言导航。
在无人机起飞机场中,我们希望通过自动化设备的交互来减少操作人员的机械重复劳动、提升工作效率和体验。
核心任务: 地面小车将载着无人机在取餐点完成取餐,然后根据工作人员的英文自然语言指令(如 "move forward to the tree, turn right, go straight and stop at the traffic cone")以最短的路径到达目标点位,从而放飞无人机。
任务规则与评分:
- 起点与终点:任务开始时,地面小车将被初始化在
start_pose,接收到指令后开始移动。小车的最终目的地是指定的 marker 板上方(尺寸为 1m * 1m)。 - 任务结束:地面小车移动到指定 marker 板中心时,需发送
/status指令表示任务结束。 - 成功判定:发送状态后,系统将自动判定小车位置是否处于以 marker 板为中心的 2m 半径内,如是则任务成功,否则失败。移动过程中发生碰撞或超时均视为失败。
- 核心指标 (SPL):采用路径加权的成功率 (Success weighted by Path Length, SPL) 作为核心评分标准。
比赛平台基于 UE 构建,高保真还原了地面小车搭载 RGB 相机、LiDAR 点云、里程计的传感与运动特性。
- 语言指令:
/instruction(String,发送一次) - RGB 图像:
/magv/camera/image_compressed/compressed(10Hz) - 雷达点云 (Livox MID360):
/magv/scan/3d(10Hz) - 里程计:
/magv/odometry/gt(25Hz) - 控制方式: 支持速度控制 (
/magv/omni_drive_controller/cmd_vel) 或位姿控制 (/magv/planning/pos_cmd)。
- 操作系统: 推荐 Ubuntu 20.04 (方便本地使用 ROS Noetic 进行调试)。线上运行环境为 Ubuntu 22.04。
- ROS: ROS Noetic Desktop Full。
- Docker: 平台要求使用 Docker 容器化部署,并需安装 Nvidia Container Toolkit 以支持 GPU 加速。
本方案采用模块化架构设计,摒弃了高延迟且难以解释的端到端黑盒模型,极大提升了系统的实时性和鲁棒性。主要包含以下五个核心模块:
注意:该模块是正式比赛中提交的版本,这部分做的不是很好,泛化性极差,个人猜测也是比赛无法取得好名次的主要原因,比赛后,作者进行了改进,调用千问大模型,加之严格提示词工程,实现了真正的LLM语义解析,详细代码见LZX0108分支。
我们实现了一个轻量级的 NLP 处理器 (keyword_extractor_node.py),用于精准提取和优化指令:
- 词汇映射:精确提取 8 种目标物体(如
trash,bench,traffic cone等)和运动方向(front,left,pass等)。 - 优先级与逻辑重构:
- 第一优先级:预处理
front命令,仅保留序列首个front,去除后续冗余的前进指令,防止过度移动。 - 第二优先级:处理绕行 (
pass+ Object) 逻辑,当识别到绕过某物体时,自动将该物体及其动作从等待目标队列中移除,避免小车误停。 - 第三优先级:处理动作与物体的语序倒装(例如将
["left", "right", "tree"]智能重排为["left", "tree", "right"]),极大增强了对复杂自然语言语法的泛化能力。
- 第一优先级:预处理
位于 yolo_detector.py 的视觉融合节点:
- 2D/3D 联合检测:使用 YOLOv8 (
best.pt) 进行 2D 目标检测,并通过message_filters.ApproximateTimeSynchronizer严格同步压缩图像与 3D 点云数据。 - 点云深度估计:将 3D 点云通过相机内参矩阵逆投影至 2D 边界框内,筛选距离包围盒中心最近的 7 个点,计算鲁棒的平均距离与 3D 质心。
- 🌟 核心创新:基于射线投射的 Mark 板定位:
针对地面平铺的终点 Mark 板,LiDAR 点云往往因掠射角问题而十分稀疏。我们针对类别 ID 9 (
mark) 独立设计了射线投射 (Ray-casting) 算法。将相机光学中心的 3D 射线通过 TF 变换至全局map坐标系,并直接与地平面 (Z=0) 求交,从而计算出极其精准的地面 3D 坐标,解决了低角度下地面标志物测距不准的痛点。
位于 state_machine.cpp,负责将解析出的指令队列转化为物理动作:
- 状态切换:维护
IDLE(空闲)、EXECUTING_ACTION(执行动作)和WAITING_FOR_OBJECT(等待物体)三种核心状态。 - 动态距离阈值:对不同体积的物体采取不同的到达判定阈值(例如汽油桶
barrel为 2.0m,广告牌billboard放宽至 4.5m,默认 3.5m),确保小车在最佳距离执行转弯或停止。 - 动作执行机制:通过封装好的 ROS Service (
goalAdv/go_straight,turn_left等) 安全下发运动指令生成远端目标点。
为了应对比赛中随时可能出现的静态或动态障碍物,我们专门设计了高强度的局部规划器(位于 localPlanner.cpp, dwaPlanner.cpp 与 localCostMap.cpp):
- 滚动局部代价地图 (Local Costmap):结合里程计与过滤后的 LiDAR 点云(去除地面与过高噪点),实时构建以小车为中心的“滚动”二维栅格地图。考虑到小车物理半径 (0.6m),地图中障碍物被安全膨胀至 0.63m,以产生安全代价梯度。
-
目标投射与 A 路径寻优*:接收上层状态机下发的绝对目标。若目标超出局部代价地图边界,算法自动计算其与边界的交点作为局部目标;若目标区域被障碍物占据,算法会启动螺旋搜索 (Spiral Search) 在周围自动寻找最近的安全替代点。最终使用 A* 算法在栅格上实时搜索出无碰撞的
local_plan。 -
全向 DWA 轨迹优化控制:针对小车的全向运动学特性,在速度空间
$(v_x, v_y, \omega)$ 内进行采样与前向轨迹模拟。依据 6 维代价打分函数(目标距离、航向一致性、最终朝向、速度惩罚、障碍物距离、路径开阔度)评估每一条候选轨迹,选出得分最高的安全速度发送给底层控制器。即使遇到死角,也具备原地旋转的困境恢复机制。
- 比赛指定的 marker 板为 OpenCV
DICT_4X4_50字典的标准 ArUco 码。 - 延迟激活策略:为节省前端算力并防止误触,状态机仅在执行到最后一条指令时,才激活 ArUco 检测,并启用亚像素级角点精炼 (
CORNER_REFINE_SUBPIX)。 - 高精度坐标系转换:检测到 ArUco 后,结合预设的相机外参(包含 0.314 弧度的俯仰角补偿),将坐标解算至
base_link,再通过tf2_ros映射至map全局坐标系,累积 5 帧平滑后锁定最终目标位置,并将其优先级置为最高,强制覆盖其他路径目标,确保小车完美停靠在 2m 半径内。
注意:普通读者无法完整启动该仿真项目,因为该项目依赖于美团低空经济挑战赛官方的在线仿真容器环境(需要选手账号鉴权拉取模型)。这里仅展示基于平台环境的简单启动流程,本项目重点在于分享视觉语言导航领域的一种解题思路与系统架构。
-
拉取比赛基础 SDK 镜像:
docker pull uav-challenge.tencentcloudcr.com/uav_challenge_2025/uav_challenge:sdk
-
编译本工作空间: 将本仓库代码克隆至工作空间的
src目录下,并使用catkin_make编译:catkin_make source devel/setup.bash cd / bash run.sh
-
运行完整节点栈: 启动所有相关的感知与规控节点(请根据实际 launch 文件名进行调整):
roslaunch local_planner local_planner.launch roslaunch keyword_extractor keyword_extractor.launch roslaunch yolo_detect yolo_detect.launch
-
提交至评测平台: 将镜像打包,并通过官方
submit.sh脚本提交测试任务:./submit.sh submit uav-challenge.tencentcloudcr.com/uav_challenge_2025/appkey:tag test.json 2
感谢美团低空经济挑战赛组委会提供的优秀仿真平台与支持!