效果图

本文基于 Qualcomm qrb_ros_samples 中的 simulation_remote_assistant 项目进行完整工程实战。

我们将在 PC 端运行 Gazebo 办公室仿真环境,在 Qualcomm Dragonwing IQ-9075 EVK 上完成 SLAM、重定位、Nav2 自主导航、YOLOv8 目标检测以及任务编排,最终实现:

go to office to check person

输入任务后,机器人自动前往办公室,在目标位置调用高通端侧 AI 推理能力检测 person,并返回任务结果。

1.1 硬件环境

本次采用:

项目配置
AI 计算平台Qualcomm Dragonwing IQ-9075 EVK
仿真主机x86 PC
Host 系统Ubuntu 24.04
ROSROS 2 Jazzy
仿真环境Gazebo
AI 模型YOLOv8 Detection
AI RuntimeQualcomm QNN
AI 后端HTP
通信ROS 2 DDS
推荐网络千兆有线 Ethernet

这里有一个需要提前理解的架构设计:

Gazebo 不跑在 IQ-9075 上。

系统拆成:
系统拆解图

也就是说,这是一个非常典型的:

Simulator + Edge AI Computer架构。


1.2 BOM 清单

由于本次属于 Simulation Demo,因此不需要真实激光雷达、摄像头和机器人底盘。

类别设备是否必须说明
边缘计算IQ-9075 EVK是运行机器人算法
仿真电脑Ubuntu PC是Gazebo
Ethernet千兆网线强烈建议PC 与开发板通信
摄像头Gazebo Camera是虚拟设备
LiDARGazebo 2D LiDAR是虚拟设备
IMUGazebo IMU可选虚拟设备
Robot BaseGazebo Robot Base Mini是虚拟机器人
显示器普通显示器建议观察 Gazebo/RViz

真正迁移到实体机器人以后,只需要将:

Gazebo Camera
Gazebo LiDAR
Gazebo Odometry
Gazebo Robot Base

分别替换成:

真实 Camera
真实 LiDAR
真实里程计/IMU
真实底盘 Driver

上层 ROS 接口原则上仍然可以保持不变。


2. 先理解系统,而不是马上敲命令

这个 Demo 可以拆成 5 个层级:

任务层
Task Manager

导航层
Nav2

定位建图层
SLAM / Localization

AI 感知层
YOLOv8 + QNN + HTP

仿真与硬件抽象层
Gazebo / Camera / LiDAR / Base

对应职责如下:

层级负责什么
Task Manager解析用户任务、导航、启动检测
Nav2路径规划、避障、运动控制
SLAM地图构建、定位
YOLO + QNN视觉目标检测
Gazebo模拟机器人和传感器

2.1 整个任务实际上分成两个阶段

不要把它理解为只是输入一句话以后机器人运行,真正发生的是:

阶段 A:系统准备

Gazebo 启动
    ↓
Sensor Topic 发布
    ↓
SLAM 建图
    ↓
保存地图
    ↓
重新加载地图
    ↓
机器人重定位
    ↓
Nav2 启动
    ↓
YOLO Pipeline 启动

阶段 B:执行任务

用户输入任务
    ↓
解析地点
    ↓
解析目标物
    ↓
NavigateToPose
    ↓
到达目标地点
    ↓
允许目标检测
    ↓
等待 person
    ↓
任务结束

这是后面调试整个项目最重要的认知。


3. 环境调研与软件版本矩阵

正式搭建前,建议先建立环境矩阵,不要因为ROS 能运行,就认为整个 Demo 一定能运行。

机器人项目最常见的问题其实是:系统版本+ROS Distribution+BSP+QNN Runtime+ROS Package+模型格式之间不匹配。

本次实验统一如下:

项目本文环境
HardwareDragonwing IQ-9075 EVK
Device OSQualcomm Ubuntu
Host OSUbuntu 24.04
ROSJazzy
Simulationqrb_ros_simulation
Samplesimulation_remote_assistant
DetectionYOLOv8
RuntimeQNN
BackendHTP
ModelQNN Context Binary .bin

建议实验开始前记录:

uname -a
lsb_release -a
ros2 --version

以及:

printenv ROS_DISTRO

正常应该能够看到:

jazzy

4. 系统数据流:这几个 ROS Topic 必须先搞清楚

整个 Demo 最核心的 Topic 可以整理成:

Topic数据类型作用
/scanLaserScanLiDAR
/odomOdometry机器人里程计
/tfTFMessage坐标变换
/mapOccupancyGrid地图
/cmd_velTwist底盘控制
/camera/color/image_rawImageRGB 图像
/qrb_inference_input_tensorTensorListYOLO 输入 Tensor
/yolo_detect_tensor_outputTensorList推理输出
/yolo_detect_resultDetection2DArrayYOLO 检测结果
/yolo_detect_overlayImage带检测框的图像

整个数据链:

/scan

/odom

/map / tf

/cmd_vel

image_raw

Tensor

Tensor

Detection2DArray

NavigateToPose

Gazebo

RGB Camera

LiDAR

Odometry

SLAM

Nav2

YOLO Preprocess

QNN / HTP

YOLO Postprocess

Task Manager

以后遇到问题,基本都可以按照这张图向上逐层排查。


5. 第一阶段:搭建 PC 端 Gazebo 仿真环境

这一阶段目标只有一个:

让 PC 能稳定发布 Camera、LiDAR、Odom、TF。

先不要碰 YOLO,也不要碰 Task Manager。


5.1 创建 Workspace

mkdir -p ~/qrb_sim_ws/src

cd ~/qrb_sim_ws/src

拉取 QRB Simulation:

git clone https://github.com/qualcomm-qrb-ros/qrb_ros_simulation.git

进入项目:

cd qrb_ros_simulation

如果仓库提供模型资源下载脚本:

chmod +x scripts/meshes_download.sh

./scripts/meshes_download.sh

返回 Workspace:

cd ~/qrb_sim_ws

安装依赖:

source /opt/ros/jazzy/setup.bash

rosdep install \
    --from-paths src \
    --ignore-src \
    -r \
    -y

编译:

colcon build --symlink-install

加载环境:

source install/setup.bash

5.2 设置 ROS Domain

本文统一:

export ROS_DOMAIN_ID=78

注意:

PC 和 IQ-9075 必须完全一致。

检查:

echo $ROS_DOMAIN_ID

5.3 启动 Office World

执行:

ros2 launch qrb_ros_sim_gazebo \
    gazebo_robot_base_mini.launch.py \
    world_model:=office \
    initial_x:=1.0 \
    initial_y:=6.0 \
    enable_depth_camera:=false

启动之后先什么都不要做。

重新打开一个 Terminal:

source /opt/ros/jazzy/setup.bash

source ~/qrb_sim_ws/install/setup.bash

export ROS_DOMAIN_ID=78

检查:

ros2 topic list

重点应该能找到:

/scan
/odom
/tf
/camera/color/image_raw
/cmd_vel

5.4 第一阶段验收

LiDAR

ros2 topic hz /scan

应该持续收到数据。


Odometry

ros2 topic echo /odom --once

应该能得到:

pose:
  pose:
    position:
      x: ...
      y: ...

Camera

ros2 topic hz /camera/color/image_raw

也可以检查带宽:

ros2 topic bw /camera/color/image_raw

如果这一阶段就不正常:

不要继续安装 AI。

先把 Gazebo Sensor Pipeline 修好。


6. 第二阶段:打通 PC 与 IQ-9075 的 DDS 通信

现在开始让两个计算节点真正通信。

假设:

Host:
192.168.50.10

IQ-9075:
192.168.50.20

先执行:

ping 192.168.50.20

反方向:

ping 192.168.50.10

但要注意:

Ping 通 ≠ ROS 2 DDS 一定正常。


6.1 两边设置相同 Domain

PC:

export ROS_DOMAIN_ID=78

IQ-9075:

export ROS_DOMAIN_ID=78

同时建议检查:

printenv | grep ROS

如果看到类似:

ROS_LOCALHOST_ONLY=1

需要取消:

unset ROS_LOCALHOST_ONLY

6.2 在 IQ-9075 上观察 PC Topic

板端:

ros2 topic list

应该能够看到 PC Gazebo 发布的:

/scan
/odom
/tf
/camera/color/image_raw

进一步:

ros2 topic echo /odom --once

然后:

ros2 topic hz /scan

再检查:

ros2 topic hz /camera/color/image_raw

到这里,才可以认为:

Gazebo
   ↓
Ethernet
   ↓
DDS
   ↓
IQ-9075

链路真正打通。


6.3 为什么推荐有线网

机器人 ROS 系统并不是普通 Web API。

这里持续存在:

Camera
LiDAR
Odometry
TF

多个实时 Topic。

如果 Wi-Fi 出现:

延迟
抖动
丢包

影响的不只是画面。

还有:

SLAM
Localization
Navigation
Control Loop

因此基线测试阶段建议:

PC 与开发板直接走 Ethernet。


7. 第三阶段:IQ-9075 安装 Remote Assistant

板端执行:

source /opt/ros/jazzy/setup.bash

添加软件源:

sudo add-apt-repository ppa:ubuntu-qcom-iot/qcom-ppa

sudo add-apt-repository ppa:ubuntu-qcom-iot/qirp

sudo apt update

安装 Sample:

sudo apt install \
    ros-jazzy-simulation-remote-assistant

完成后检查:

ros2 pkg prefix simulation_remote_assistant

再查看可执行程序:

ros2 pkg executables simulation_remote_assistant

重点会涉及:

build_map_node
nav_preparation_node
task_manager_node

8. 第四阶段:建图、保存地图、重定位、启动 Nav2

这一阶段实际上承担了:

SLAM
+
自动运动
+
保存地图
+
重新定位
+
Nav2 Bringup

启动:

source /opt/ros/jazzy/setup.bash

export ROS_DOMAIN_ID=78

执行:

ros2 launch simulation_remote_assistant \
    map_nav_setup.launch.py

这时候你会看到 Gazebo 中的机器人开始自己移动。


8.1 它不是自主探索

这一点非常重要。

build_map_node 本质上实现了一套固定运动脚本:

FORWARD
TURN
FORWARD
TURN
...

思想可以简化成:

steps = [
    ("FORWARD", distance_a),
    ("TURN", angle_a),
    ("FORWARD", distance_b),
    ("TURN", angle_b),
]

然后通过:

/odom

判断:

已经走了多少米
已经转了多少度

再向:

/cmd_vel

发送速度。


8.2 一个简化版自动建图控制器

我们自己写一个容易理解的版本:

class MotionStep:
    def __init__(self, action, value):
        self.action = action
        self.value = value


route = [
    MotionStep("forward", 4.0),
    MotionStep("turn", -90),
    MotionStep("forward", 7.0),
    MotionStep("turn", -90),
]

控制逻辑:

if current_step.action == "forward":

    if moved_distance < current_step.value:
        cmd.linear.x = linear_speed
    else:
        stop_robot()
        next_step()


elif current_step.action == "turn":

    if rotated_angle < target_angle:
        cmd.angular.z = angular_speed
    else:
        stop_robot()
        next_step()

对应工程数据流:

/odom

Build Map Node

/cmd_vel

Gazebo Robot

/scan

SLAM

Map


8.3 为什么有时候机器人转弯撞墙

默认控制循环周期可以理解为:

0.2 s

如果某些机器上出现:

目标:90°
实际:明显超过 90°

机器人可能直接撞墙。

可以缩短:

ros2 launch simulation_remote_assistant \
    map_nav_setup.launch.py \
    control_period:=0.05

这比上来就修改 SLAM 参数更加合理。


8.4 建图后的状态转换

地图构建完成以后,不是直接进入 Nav2。

完整状态是:

Failed

Success

StartMapping

Moving

SaveMap

LoadMap

StartLocalization

Relocalizing

CheckLocalization

StartNav2

Ready


8.5 重定位实际上做了什么

nav_preparation_node 的逻辑非常典型:

LOAD_MAP
    ↓
START_RELOCALIZE
    ↓
机器人原地旋转
    ↓
不断检查重定位状态
    ↓
成功
    ↓
停止旋转
    ↓
启动 Nav2

简化代码如下:

if state == "LOAD_MAP":

    slam_command("load_map")


elif state == "START_RELOCALIZE":

    slam_command("start_localization")


elif state == "WAIT_RELOCALIZE":

    cmd.angular.z = 0.3

    cmd_vel_pub.publish(cmd)

    success = check_relocalization()

    if success:
        stop_robot()
        start_nav2()

机器人原地旋转的原因也很好理解。

LiDAR 需要获得足够环境特征:

当前扫描
        ↓
与已有地图匹配
        ↓
估计机器人所在位置

8.6 第二个验收门

执行:

ros2 action list

如果系统完成重定位并启动 Nav2,应该找到:

/navigate_to_pose

如果找不到:

不要运行 Task Manager。

先查:

地图是否加载
↓
重定位是否成功
↓
Nav2 是否真正启动

9. 第五阶段:搭建 YOLOv8 + QNN + HTP 推理链

这一部分是高通端侧 AI 的核心。

数据链路:

/camera/color/image_raw

Preprocess
Resize / Normalize

Input Tensor

QNN

Hexagon HTP

Output Tensor

YOLO Postprocess

Detection2DArray

Overlay


9.1 默认图像预处理

当前 Pipeline 采用的核心输入规格包括:

640 × 640
NHWC
Normalize
float32

也就是:

Camera Image
    ↓
Resize 640×640
    ↓
Normalize
    ↓
NHWC Tensor
    ↓
QNN

9.2 准备模型目录

创建:

sudo mkdir -p /opt/model

准备:

/opt/model/
├── yolov8_det_qcs9075.bin
└── coco8.yaml

确认:

ls -lh /opt/model

这里:

.bin

代表为对应 Qualcomm 平台准备的 QNN 模型。


9.3 启动 YOLO Pipeline

板端打开一个新的 Terminal:

source /opt/ros/jazzy/setup.bash

export ROS_DOMAIN_ID=78

启动:

ros2 launch simulation_remote_assistant \
    yolo_detectcion.launch.py \
    model:=/opt/model/yolov8_det_qcs9075.bin \
    backend_option:=libQnnHtp.so \
    label_file:=/opt/model/coco8.yaml

注意:

yolo_detectcion.launch.py

当前项目文件名确实采用:

detectcion

不要自行改成:

detection

否则 Launch 文件可能找不到。


9.4 Launch 内部到底启动了什么

为了把它真正理解透,可以将 Launch 简化为:

ComposableNodeContainer
│
├── yolo_preprocess_node
│
├── nn_inference_node
│
├── yolo_detection_postprocess_node
│
└── yolo_detection_overlay_node

其中:

Preprocess

/camera/color/image_raw
          ↓
Resize
Normalize
Tensor Conversion
          ↓
/qrb_inference_input_tensor

Inference

/qrb_inference_input_tensor
          ↓
QNN
          ↓
HTP
          ↓
/yolo_detect_tensor_output

Postprocess

Output Tensor
     ↓
Decode
     ↓
Confidence Filter
     ↓
NMS
     ↓
Detection2DArray

10. 第六阶段:Task Manager 如何把导航和视觉串起来

现在终于进入真正的 Remote Assistant。

运行:

ros2 run simulation_remote_assistant \
    task_manager_node

Terminal 会等待输入任务。

输入:

go to office to check person

10.1 这里并没有使用 LLM

这是非常值得说明的地方。

当前命令解析方式并不是:

Natural Language
       ↓
LLM
       ↓
Planning

而是:

字符串
 ↓
转小写
 ↓
在 locations 中寻找关键字
 ↓
在 objects 中寻找关键字

例如:

go to office to check person

得到:

location = office
object   = person

所以更准确地说,它现在是:

自然语言形式的关键词任务接口。


10.2 我们实现一个更清晰的解析器

import re


def find_keyword(text, candidates):

    text = text.lower()

    for item in candidates:

        pattern = rf"\b{re.escape(item.lower())}\b"

        if re.search(pattern, text):
            return item

    return None


def parse_command(text):

    locations = [
        "office",
        "meeting_room",
        "reception",
    ]

    objects = [
        "person",
        "chair",
        "laptop",
    ]

    location = find_keyword(
        text,
        locations,
    )

    target = find_keyword(
        text,
        objects,
    )

    if location is None:
        raise ValueError(
            "Location not found"
        )

    if target is None:
        raise ValueError(
            "Object not found"
        )

    return {
        "location": location,
        "object": target,
    }

测试:

task = parse_command(
    "Please go to office and check person"
)

print(task)

得到:

{
    "location": "office",
    "object": "person"
}

11. 任务执行核心:NavigateToPose + YOLO

整个 Task Manager 可以拆成:

Parse
 ↓
Navigate
 ↓
Wait Navigation
 ↓
Enable Detection
 ↓
Wait Detection
 ↓
Finish

11.1 Navigation Goal

地点实际保存在:

locations.yaml

例如:

office:

  position:
    x: 3.087
    y: 0.108
    z: 0.101

  orientation:
    x: 0.0
    y: 0.0
    z: 0.33
    w: 0.944

Task Manager 再构造:

NavigateToPose.Goal

一个简化实现:

goal = NavigateToPose.Goal()

goal.pose.header.frame_id = "map"

goal.pose.pose.position.x = location["position"]["x"]
goal.pose.pose.position.y = location["position"]["y"]
goal.pose.pose.position.z = location["position"]["z"]

goal.pose.pose.orientation.x = location["orientation"]["x"]
goal.pose.pose.orientation.y = location["orientation"]["y"]
goal.pose.pose.orientation.z = location["orientation"]["z"]
goal.pose.pose.orientation.w = location["orientation"]["w"]

然后:

nav_client.send_goal_async(goal)

11.2 为什么 Orientation 不能省

很多开发者只记录:

x
y

这是错误的。

考虑以下场景:

机器人已经到办公室
       ↓
Camera 朝向墙
       ↓
YOLO 看不到 person
       ↓
检测失败

所以目标 Pose 应该是:

Position
+
Orientation

也就是完整:

x
y
z

qx
qy
qz
qw

11.3 导航成功以后才开启检测

这是项目中一个不错的设计。

不要一开始就让 Task Manager 处理 YOLO Result。

而是:

self.detection_enabled = False

导航成功:

if navigation_success:

    self.detection_enabled = True

Detection Callback:

def detection_callback(msg):

    if not self.detection_enabled:
        return

    for detection in msg.detections:

        for result in detection.results:

            class_id = (
                result
                .hypothesis
                .class_id
            )

            if class_id == self.target_class:

                self.result_event.set()

                self.detection_enabled = False

                return

这样可以避免:

机器人还没到办公室
↓
路上 Camera 看见一个 person
↓
任务被提前判定成功

12. 最终泳道图:从一句指令到任务结束

YOLO PostprocessQNN/HTPPreprocessCameraRobotNav2Task ManagerUserYOLO PostprocessQNN/HTPPreprocessCameraRobotNav2Task ManagerUserloop[Navigation]go to office to check personParse office + personNavigateToPose/cmd_vel/scan/odom/tfNavigation Successdetection_enabled = trueRGB ImageInput TensorHTP InferenceOutput Tensorperson Detectionclass_id == personFound person at office

到这里,整个工程闭环才真正建立起来:

自然语言形式任务
       ↓
任务解析
       ↓
空间导航
       ↓
视觉感知
       ↓
目标确认
       ↓
任务结果

13. 工程踩坑与定位方法

下面比单纯列 ERROR 更重要。

13.1 ROS_DOMAIN_ID 不一致

PC:

echo $ROS_DOMAIN_ID

Board:

echo $ROS_DOMAIN_ID

必须一样。

否则最常见现象:

Gazebo 正常
ROS 正常
Board 正常

但是:
ros2 topic list
看不到对方

13.2 Ping 通,但 ROS Topic 看不到

检查:

printenv | grep ROS

重点排除:

ROS_LOCALHOST_ONLY=1

然后检查:

Firewall
DDS Discovery
网卡
ROS_DOMAIN_ID

13.3 机器人建图时撞墙

优先试:

ros2 launch simulation_remote_assistant \
    map_nav_setup.launch.py \
    control_period:=0.05

然后再考虑:

linear_speed
angular_speed

不要上来就改 SLAM。


13.4 换 World 后自动建图失效

因为当前:

build_map_node

不是:

Exploration Algorithm

而是一条固定运动路线。

所以:

Office World
可以工作

Warehouse World
未必能工作

如果要做通用方案,建议替换为:

Teleop 建图

或者:

Frontier Exploration

13.5 Camera 正常,但检测没有结果

一定要逐层检查。

第一层

ros2 topic hz \
    /camera/color/image_raw

第二层

ros2 topic hz \
    /qrb_inference_input_tensor

第三层

ros2 topic hz \
    /yolo_detect_tensor_output

第四层

ros2 topic echo \
    /yolo_detect_result

逻辑:

Camera 有
↓
Tensor 没有
=
Preprocess 问题
Input Tensor 有
↓
Output Tensor 没有
=
Model/QNN/Backend 问题
Output Tensor 有
↓
Detection 没有
=
YOLO Postprocess/Threshold/Label 问题

13.6 YOLO 能检测,但任务还是失败

执行:

ros2 topic echo \
    /yolo_detect_result

重点看:

class_id

Task Manager 是拿:

检测 class_id

与:

objects.yaml

配置进行匹配。

例如:

objects:

  - person

那么 YOLO 输出必须能够对应:

person

13.7 导航 Action 不存在

检查:

ros2 action list

没有:

/navigate_to_pose

就先不要研究 Task Manager。

排查:

Map 是否保存
 ↓
Map 是否加载
 ↓
Localization 是否启动
 ↓
Relocalization 是否成功
 ↓
Nav2 是否启动

14. 一套更加体系化的故障决策树

否

是

否

是

否

是

否

是

否

是

否

是

否

是

否

是

否

是

否

是

否

是

否

是

Remote Assistant 失败

Gazebo 正常?

修复 Simulation

Host Sensor Topic 正常?

检查 ros-gz / Sensor

IQ-9075 能看到 Topic?

检查 Ethernet / DDS / Domain

Map 正常?

检查 Scan / Odom / SLAM

Relocalization 成功?

检查 TF / Map / SLAM Localization

NavigateToPose 存在?

检查 Nav2 Bringup

能导航到目标?

检查 Goal / Costmap / TF

Camera 正常?

检查 Gazebo Camera

Input Tensor 正常?

检查 Preprocess

Output Tensor 正常?

检查 Model / QNN / HTP

Detection Result 正常?

检查 NMS / Label / Threshold

Task Manager 匹配?

检查 class_id / objects.yaml

End-to-End PASS

整个排查原则只有一句:

从数据源开始,沿数据流逐层确认数据在哪一层消失。

不要跨层猜问题。


15. 验证:工程上不能只以“机器人动了”为成功

建议至少做 6 层验收。

Level验证内容验证方法
L1网络Ping
L2DDSTopic Discovery
L3SensorCamera/LiDAR/Odom
L4LocalizationMap/TF
L5NavigationNavigateToPose
L6AIYOLO Result
L7E2ECommand → Navigation → Detection

15.1 快速检查脚本

可以写一个:

#!/usr/bin/env bash

echo "==========================="
echo " QRB Remote Assistant Test "
echo "==========================="

echo
echo "[ROS DOMAIN]"

echo "${ROS_DOMAIN_ID:-NOT_SET}"

echo
echo "[TOPICS]"

TOPICS=$(ros2 topic list)

check_topic () {

    if echo "$TOPICS" | grep -qx "$1"; then

        echo "[OK] $1"

    else

        echo "[MISS] $1"

    fi
}

check_topic "/scan"

check_topic "/odom"

check_topic "/tf"

check_topic "/camera/color/image_raw"

check_topic "/qrb_inference_input_tensor"

check_topic "/yolo_detect_tensor_output"

check_topic "/yolo_detect_result"

echo
echo "[NAVIGATION]"

if ros2 action list \
    | grep -q "/navigate_to_pose"; then

    echo "[OK] NavigateToPose"

else

    echo "[MISS] NavigateToPose"

fi

保存:

chmod +x check_remote_assistant.sh

运行:

./check_remote_assistant.sh

如果输出类似:

[OK] /scan
[OK] /odom
[OK] /tf
[OK] /camera/color/image_raw
[OK] /qrb_inference_input_tensor
[OK] /yolo_detect_tensor_output
[OK] /yolo_detect_result
[OK] NavigateToPose

再做最终任务测试。


16. 常见问题 FAQ

Q1:为什么一定推荐 PC + IQ-9075 两台设备?

因为本项目本身就很适合这种架构:

PC
→ Gazebo Simulation

IQ-9075
→ Robot Computing

这样更接近真实机器人:

真实世界
→ Sensor

Edge Computer
→ SLAM/Nav2/AI

未来迁移真机时更自然。


Q2:为什么 YOLO 不直接跑 PC?

当然可以。

但那样会丢失这个项目最重要的一部分:

验证机器人视觉 AI 在 Qualcomm Edge Platform 上的实际运行链。

本项目真正值得学习的是:

ROS 2
+
Robotics
+
Edge AI

的组合。


Q3:为什么已经检测到人,还需要机器人导航?

因为真正机器人任务不是:

Camera Detection

而是:

找到一个地点
↓
到达这个地点
↓
获取该地点信息
↓
完成任务

这就是具身任务和普通 CV Demo 最大的区别之一。


Q4:可以增加 meeting room 吗?

可以。

增加:

meeting_room:

  position:
    x: ...
    y: ...
    z: ...

  orientation:
    x: ...
    y: ...
    z: ...
    w: ...

即可。

但是坐标必须来自实际 Map。

不要随便填写。


Q5:可以检测 laptop、chair 吗?

只要:

模型支持
+
Label 支持
+
objects.yaml 配置

即可。

例如:

objects:

  - person
  - chair
  - laptop

Q6:能不能升级成真正的 LLM Agent?

可以。

当前:

用户输入
↓
关键词查找
↓
Task Manager

可以升级为:

用户自然语言
        ↓
LLM
        ↓
Structured Output
        ↓
Task Validator
        ↓
Robot Skill

例如 LLM 输出:

{
    "action": "inspect",
    "location": "meeting_room",
    "target": "person"
}

注意:

不建议让 LLM 直接发布 /cmd_vel。

更合理的架构是:

LLM
 ↓
任务级决策
 ↓
ROS Action / Service
 ↓
确定性机器人模块

17. 从这个 Demo 到真正具身智能 Agent

跑通当前项目后,它已经拥有:

空间感知
+
地图
+
定位
+
路径规划
+
运动
+
视觉检测
+
任务管理

接下来可以增加:

ASR
+
LLM
+
VLM
+
Memory
+
Task Planning

最终架构:

User

ASR

LLM Agent

Task Planner

Robot Skill Layer

Nav2

YOLO / VLM

SLAM

Camera / LiDAR

Robot Base

那么机器人面对的任务就可以从:

go to office to check person

进一步扩展成:

去会议室看看有没有人。

甚至:

去会议室看看投影仪是不是还开着,
如果没人就告诉我。

此时整个任务已经从:

Navigation + Detection

进入:

Navigation
+
Visual Understanding
+
Reasoning
+
Planning
+
Robot Action

18. 结论

这个 Sample 最值得学习的并不是:

机器人在 Gazebo 里走到了办公室。

真正值得研究的是它串起了一个完整机器人闭环:

Gazebo
   ↓
Camera / LiDAR / Odom
   ↓
ROS 2 DDS
   ↓
SLAM
   ↓
Localization
   ↓
Nav2
   ↓
YOLOv8
   ↓
QNN
   ↓
HTP
   ↓
Task Manager

如果把它按照工程层次进一步抽象,就是:

环境层
Simulation / Real World

        ↓

设备层
Camera / LiDAR / Base

        ↓

感知层
SLAM / YOLO

        ↓

能力层
Localization / Navigation

        ↓

任务层
Task Manager

        ↓

Agent 层
LLM / VLM / Planner

因此对于希望学习 高通机器人平台、ROS 2、端侧 AI、Nav2 和具身智能 Agent 的开发者来说,这个项目非常适合作为一个中间起点:

它不是只有一个目标检测模型的 AI Demo,也不是只会在 Gazebo 中运动的 ROS Demo,而是已经具备了一个完整机器人任务:

接收任务 → 理解目标 → 自主移动 → 环境感知 → 返回结果。

在此基础上继续接真实底盘、真实 Camera/LiDAR,再加入 VLM 和 Agent Planner,就可以逐步从 Simulation Remote Assistant 演进成真正的端侧具身智能机器人系统。


参考项目

  • Qualcomm QRB ROS Samples
  • robotics/simulation_remote_assistant
  • Qualcomm QRB ROS Simulation
  • Qualcomm QRB ROS NN Inference
  • Qualcomm QRB ROS Tensor Process
  • ROS 2 Jazzy
  • Navigation2
  • Qualcomm QNN
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐