近期关注到全球首个突破无人机配送 “最后一公里” 技术瓶颈的窗口级 VLN 系统研究,基于对前沿技术的探索与思索,编者对该论文进行了简单的复现。
特此展开技术复现实践分享,诚邀各位同仁一同探讨与交流。
在展开复现之前,我们先来聊聊相关背景。
当前基于无人机的视觉语言导航(VLN)任务普遍聚焦于粗粒度长距离目标,难以满足终端配送的精准需求。具体表现为:
-
现有无人机 VLN 任务的局限性:多数研究关注长距离导航与大规模目标,在短距离小目标场景(如终端配送)中缺乏针对性探索;
-
最后一公里配送的精度瓶颈:传统地面机器人主导的最后一公里配送研究,仅能实现建筑级配送,无法覆盖更精细的窗口级交付场景。
为解决上述问题,中国科学院自动化研究所、澳门科技大学、中国科学院大学等团队提出了LogisticsVLN。
LogisticsVLN 是基于多模态大语言模型的无人机自主物流配送系统,仅使用简单传感器和轻量级大型模型,无需先验环境知识或微调,即可在未知环境中高度部署,进行楼层定位、目标检测以及行动决策,从而完成无人机自主物流配送任务。
基于以上问题点与创新技术,本文将结合模型流程图以及小编个人的复现进行详细解读。
我们开设此账号,想要向各位对【具身智能】感兴趣的人传递最前沿最权威的知识讯息外,也想和大家一起见证它到底是泡沫还是又一场热浪?
欢迎关注【深蓝具身智能】👇
方法说明
首先,我们来主要了解一下LogisticsVLN系统,然后小编将结合LogisticsVLN系统概述图进行流程讲解。
-
系统目标
当无人机到达目标建筑物附近位置时,在没有先验地图的情况下,可以基于用户指令到达特定窗口。
-
硬件概述
▲图1 | LogisticsVLN系统概述图©️【深蓝具身智能】编译
-
软件流程
(1)请求理解(图中a部分)
利用DeepSeek-R1 Distill-Qwen-14B模型,结合思维链(CoT)提示模板解析用户指令请求,提取元素为:
(2) 楼层定位(图中b部分)
该模块主要引导无人机到达目标楼层,大致说明如下:
(3)目标探索(图中c部分)
那么,在完成楼层定位之后,如何去检测目标位置的边界框?流程如下:
视点选择:如果目标识别视觉语言模型(Object Recognition VLM)不能从5个视角的RGB图像中检测到目标窗口,那么说明目标窗口可能在该层其他位置,需要让无人机绕着建筑物外围对该楼层进行巡视,以便发现目标窗口。那如何进行最优的巡视呢?
选择合适的视角是关键!
▲图2 | 理想与非理想视角下的决策效果
LogisticsVLN的方案是:
这样可以让无人机高效地朝下一个探索点航行,同时降低碰撞风险。
关于LogisticsVLN系统更详细的解析,可以查看深蓝AI此前的解读:首个窗口级无人机配送VLN系统!中科院LogisticsVLN:基于MLLM实现精准投递
实现效果
小编对论文进行了简单复现,下面进行展示和说明。
-
构建一个测试环境
Step1:先从网上随便下载一张大楼正面的图片(如图3左侧,是一面5楼的大楼,每楼有6扇窗户);
Step2:使用开源的深度估计模型(DepthAnything)对该图进行深度估计;
Step3:基于深度图生成点云模型(如下图右侧),这样就得到一个用于测试的3D大楼了;
当然也可以用仿真软件构建一个简单的测试环境。(小编先前的研究内容可以直接拿来用,所以采用了上面的方法构建了一个简单的测试环境)
▲图3 | 测试示例
-
VLN实现(和论文里面有一定出入)
(1)智能体类: 提供楼层定位、目标检测等功能
class Agent:
...
"""
描述:使用LLM分析用户指令,得到目标楼层和窗口
输入:prompt用户指令
输出:目标楼层、目标窗户号
"""
def analy_task(self, prompt):
res = self.llm(prompt)
res = json.loads(res)
return res["target_floor"], res["target_window"]
"""
描述:使用VLM估计图片中一层楼的高度
输入:rgb图像
输出:一层楼的高度
"""
def floor_height_estimate(self, rgb):
prompt_name = 'floor_height_estimate'
data = multiFusion(rgb, prompt_name)
res = self.vlm(data)
res = json.loads(res)
return res["floor_height"]
"""
描述:使用VLM估计当前所在楼层数
输入:rgb图像
输出:当前楼层数
"""
def current_floor_number(self, rgb):
prompt_name = 'current_floor_number'
data = multiFusion(rgb, prompt_name)
res = self.vlm(data)
res = json.loads(res)
return res["current_floor_number"]
"""
描述:使用VLM搜索目标窗口
输入:rgb图像
输出:目标串口边框
"""
def find_target_window(self, rgb):
prompt_name = 'find_target_window'
data = multiFusion(rgb, prompt_name)
res = self.vlm(data)
res = json.loads(res)
return res["box_2d"]
(2)配送主进程
"""
配送主进程
prompt:用户指令
"""
def mainloop(prompt):
# 实现了一个简单的无人机系统
uav_controller = UAVController()
# 三维重建
recon3d = Recon3D()
# 实现了一个简单RGB传感器
sensors = Sensors()
# 智能体
agent = Agent()
# 解析目标楼层和窗口
target_floor, target_window = agent.analy_task(prompt)
agent.target_floor = target_floor
agent.target_window = target_window
get_next_waypoint = False
find_target_window = False
touch_target_floor = False
br = tf.TransformBroadcaster()
while not rospy.is_shutdown():
try:
# 获取无人机的定位
cur_x, cur_y = uav_controller.getCurrentPose()
# TF变换,转化到世界坐标系下
br.sendTransform(
(cur_x, cur_y, 30), # 位置 (x, y, z)
tf.transformations.quaternion_from_euler(0, 0, 0), # 四元数表示的旋转
rospy.Time.now(), # 时间戳
"uav", # 无人机坐标系
"world" # 世界坐标系
)
# 获取一帧RGB
rgb = sensors.getRGB()
# 对单帧图片进行三维重建,得到大楼的3D点云,并实时发布
# 在小编的实现中,和论文存在差异,后续并没有使用深度图,而是用VLM去估计无人机和大楼的定位
recon3d.reconstruction(rgb)
# 爬升过程
if touch_target_floor == False:
if get_next_waypoint == False:
# 获取当前楼层数
current_floor = agent.current_floor(rgb)
print("VLM解析结果: 当前楼层=", current_floor)
# 判断当前楼层是不是目标楼层
if current_floor != target_floor:
# 获取1层楼高度
floor_height = agent.floor_height_estimate(rgb)
print("VLM解析结果: 楼层高度=", floor_height)
print("移动到下一个航点")
# 计算到下一个航点(目标楼层)的飞行距离
fly_height = (target_floor - current_floor) * floor_height
# 设置移动距离
uav_controller.setDistance(fly_height)
# 开始移动
uav_controller.move()
get_next_waypoint = True
else:
# 进入目标检测过程
touch_target_floor = True
else:
# 判断无人机是否到达航点高度
if uav_controller.isReached() == True:
# 重新判断航点
get_next_waypoint = False
else:
uav_controller.move()
else:
# 目标检测阶段
if find_target_window == False:
# 获取目标窗口boundingbox
box_2d = agent.find_target_window(rgb)
if box_2d is not None:
y1, x1, y2, x2 = box_2d
print("VLM解析结果: 识别到目标窗口")
uav_controller.setGoal((x1 + x2) * 0.5, (y1+ y2) * 0.5)
find_target_window = True
# 判断是否到达窗口附近
if uav_controller.reachGoal() == False:
uav_controller.move()
else:
print("抵达目标地")
exit()
except KeyboardInterrupt:
break
finally:
time.sleep(0.01)
-
测试效果
视频见:
独家复现实录|全球首个「窗口级」VLN系统:实现空中无人机最后一公里配送
说明:
第1步:用户给出指令"送到302房间来"
第2步:使用LLM解析指令得到具体楼层和房间
第3步:使用VLM估计当前楼层
第4步:使用VLM估计楼层高度
第5步:根据3、4计算出下一个航点
第6步:重复3-5步骤,直到到达目标楼层
第7步:使用VLM估计目标窗口,最后移动到目标窗口
实现局限:
1. 目前使用VLM在楼层高度上的估计效果不好,这就导致航点的计算经常容易出错,但比较幸运的是,在多次上上下下往复的调整过程中,最终基本都能找到正确的目标楼层。所以后续的目标是提高VLM在楼层高度上的估计精度;
2. 目前使用传统的规划算法实现的导航,后续的目标将结合VLM进行action的预测输出。
总结
本文聚焦智能物流终端配送难题,针对当前无人机的视觉语言导航任务多关注长距离目标,地面机器人配送精度不足等问题,LogisticsVLN借助VLM模型的强大感知能力,无需进行特定任务训练,也不用预先构建地图,便可以完成无人机自主物流配送任务。
未来可进一步优化模型轻量化程度,提升复杂动态环境下的鲁棒性,加强多模态信息融合的精准度,探索更多应用场景以提升系统通用性,同时研究如何降低能耗、延长无人机续航时间,更好地满足实际物流配送需求。