前端控制台
- 提交自然语言任务与图像
- 展示会话、计划、执行状态
- 调用 /api/chat 与 runtime probe
该项目围绕 Jetson Orin 上的机器人导航链路,将高层任务拆成观测、规划、执行和安全审查模块, 并通过 Search Loop + Replan、端云混合推理、ROS 2/Nav2/Stream-VLN 执行适配,把自然语言任务落到可运行的机器人闭环。
从前端任务输入到 Jetson 端侧执行,所有模块围绕“可观测、可重规划、可执行、可审查”的导航闭环组织。
常规 VLM 一次性静态规划容易在“找灭火器/找目标物”这类任务中失败,因此这里把搜索显式做成可重复的运行时闭环。
从相机和运行时状态生成 PerceptionContext,包含图像、机器人位姿、可见对象和地图上下文。
Observer 判断目标是否出现、方向和置信度;低置信度结果不会直接转换成导航目标。
Planner 根据新观测决定继续 search、靠近目标、保持停止或回退到 Nav2。
SearchRuntime 执行旋转、捕获、视觉伺服或导航动作,并把结果写回会话。
端侧 vLLM 服务的重点不是“能启动一次”,而是把模型路径、缓存、端口、健康检查、日志和配置切换固定下来,能稳定接入主链路。
执行层不是固定写死 Nav2,而是根据任务类型、视觉可见性、位姿/地图上下文和传感器条件动态路由。
任务类型、目标是否可见、观测置信度、robot_pose、map context、Nav2 readiness。
将 Planner 的语义计划转换为可执行动作,并选择 Nav2、visual_servo、Stream-VLN 或 search_pattern。
成功、失败、hold/stop、继续搜索或触发 replan,结果回写会话供下一轮决策使用。
这些代码段不是完整项目源码,而是用于讲清“如何实现”的核心骨架。
def run_search_loop(task, max_steps=4):
session.bind(task)
for step in range(max_steps):
ctx = collect_perception_context()
obs = observer.detect_target(ctx)
if obs.confidence >= 0.7 and obs.visible:
plan = planner.replan(task, obs)
return executor.run(plan)
action = search_skill.next_action(ctx, step)
search_runtime.execute(action)
return safety.hold("target_not_found")
switch {
case target.Visible && target.Distance < visualServoRange:
backend = "visual_servo"
case navContext.HasMapPose && runtime.Nav2Ready:
backend = "nav2"
case task.NeedsLanguageTrajectory:
backend = "stream_vln"
default:
backend = "search_pattern"
}
result := execution.Run(ctx, backend, plan)
session.AppendExecutionResult(result)
services:
skill-vllm:
image: vllm-jetson:0.19.0
runtime: nvidia
ports:
- "8001:8000"
volumes:
- "/models/qwen:/models/qwen:ro"
- "/data/vllm-cache:/root/.cache"
command:
- "--model=/models/qwen/Qwen3.5-0.8B"
- "--host=0.0.0.0"
- "--port=8000"
# Planner / Observer 留在云端,Skill 切到 Jetson 本地 vLLM
export PLANNER_BASE_URL="https://cloud.example/v1"
export OBSERVER_BASE_URL="https://cloud.example/v1"
export SKILL_BASE_URL="http://jetson-orin:8001/v1"
export SKILL_MODEL="Qwen3.5-0.8B"
curl -fsS "$SKILL_BASE_URL/models" >/dev/null
./start_nav_server.sh