前言

在《基于高通跃龙IQ-9100打造具身智能机器人多传感器融合感知系统》文中,我们基于高通跃龙IQ-9100平台完成了具身智能机器人的硬件选型,并利用其强大的100 TOPS NPU实现了多摄像头AI感知系统

然而,感知只是第一步。机器人要真正实现自主行动,还必须解决三个核心问题:我在哪?(定位)、环境什么样?(建图)、以及我该怎么过去?(导航)。这正是经典的SLAM与路径规划问题。

本文将基于高通跃龙IQ-9100的架构,正式启动机器人“行动力”的实战开发。我们将结合ROS 2 Nav2导航框架,实战搭建一套完整的视觉SLAM建图 + 自主导航 + 动态避障系统。本篇重点介绍系统整体架构、SLAM方案选型、Cartographer激光SLAM配置以及多源融合定位EKF的部署。

1. 导航系统整体架构

高通跃龙IQ-9100是高通打造的高性能工业级平台
在这里插入图片描述
可以完美应用到具身智能机器人场景。

1.1 导航任务分解

机器人自主导航 = 三个核心问题:

1. 我在哪? (Localization)
   ├── 视觉里程计 (VO/VIO)
   ├── 激光SLAM定位
   ├── 轮式里程计
   └── 多源融合定位

2. 世界长什么样? (Mapping)
   ├── 2D栅格地图 (导航用)
   ├── 3D点云地图 (避障用)
   ├── 语义地图 (任务理解用)
   └── 动态物体图层

3. 怎么过去? (Planning & Control)
   ├── 全局路径规划 (A*/Dijkstra/Theta*)
   ├── 局部避障 (DWB/TEB/MPPI)
   ├── 行为规划 (Recovery/Replanning)
   └── 速度控制 → CAN-FD → 电机

1.2 系统架构

系统分为四个层次:

层次 硬件/模块 数据接口
感知层 (NPU TP0 + ISP) 双目立体、环视4路鱼眼、2D LiDAR、IMU+轮式里程计 /scan, /imu, /odom
SLAM & 定位层 (CPU Core 2-3) ORB-SLAM3视觉里程计、Cartographer激光SLAM、EKF多源融合 /vo/odom, /map, /odometry/filtered
Nav2导航栈 (CPU Core 4-5) 全局规划器(NavFn/Smac)、局部规划器(MPPI/DWB)、行为树(BT) 全局/局部代价地图,AI动态障碍物层(NPU TP1加速)
底盘控制(Safety Island) CAN-FD → 电机驱动器 /cmd_vel
┌─────────────────────────────────────────────────────────────────────┐
│                  IQ-9100 自主导航系统架构                             │
│                                                                     │
│  ┌───────────── 感知层 (NPU TP0 + ISP) ───────────────────────────┐  │
│  │                                                                │  │
│  │  ┌────────┐ ┌────────┐ ┌────────────┐ ┌──────────────────────┐ │  │
│  │  │ 双目   │ │ 环视   │  │ 2D LiDAR   │ │ IMU + 轮式里程计      │ │  │
│  │  │ 立体   │ │ 4路    │  │            │ │                      │ │  │
│  │  │ 视觉   │ │ 鱼眼   │  │ /scan      │ │ /imu + /odom         │ │  │
│  │  └───┬────┘ └───┬────┘ └─────┬──────┘ └────────┬─────────────┘ │  │
│  └──────┼──────────┼────────────┼─────────────────┼───────────────┘  │
│         │          │            │                 │                  │
│  ┌──────▼──────────▼────────────▼─────────────────▼──────────────┐  │
│  │                    SLAM & 定位层 (CPU Core 2-3)                │  │
│  │                                                                │  │
│  │  ┌─────────────┐  ┌──────────────┐  ┌────────────────────────┐ │  │
│  │  │ ORB-SLAM3   │  │ Cartographer │  │ 多源融合定位            │ │  │
│  │  │ 视觉里程计   │  │ 激光SLAM     │  │ EKF (robot_localize)   │ │  │
│  │  │ /vo/odom    │  │ /map         │  │ /odometry/filtered     │ │  │
│  │  └─────────────┘  └──────────────┘  └────────────────────────┘ │  │
│  └──────────────────────────┬─────────────────────────────────────┘  │
│                             │                                        │
│  ┌──────────────────────────▼─────────────────────────────────────┐  │
│  │                   Nav2 导航栈 (CPU Core 4-5)                   │  │
│  │                                                               │  │
│  │  ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐   │  │
│  │  │ 全局规划器    │ │ 局部规划器    │ │ 行为树 (BT)          │   │  │
│  │  │ NavFn/Smac   │ │ MPPI/DWB     │ │ 任务编排/恢复策略     │   │  │
│  │  └──────────────┘ └──────────────┘ └──────────────────────┘   │  │
│  │                                                               │  │
│  │  ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐   │  │
│  │  │ 全局代价地图  │ │ 局部代价地图  │ │ AI动态障碍物层        │   │  │
│  │  │ (静态+膨胀)   │ │ (滚动窗口)   │ │ (NPU TP1加速)         │   │  │
│  │  └──────────────┘ └──────────────┘ └──────────────────────┘   │  │
│  └──────────────────────────┬────────────────────────────────────┘  │
│                             │ /cmd_vel                              │
│  ┌──────────────────────────▼────────────────────────────────────┐  │
│  │             底盘控制 (Safety Island)                           │  │
│  │             CAN-FD → 电机驱动器                                │  │
│  └───────────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────────┘

2. SLAM方案选型与配置

2.1 SLAM方案对比

维度 Cartographer (2D激光) ORB-SLAM3 (视觉) RTAB-Map (视觉+激光)
传感器 2D LiDAR 单目/双目/RGB-D 双目/RGB-D + 可选LiDAR
地图类型 2D栅格 稀疏3D点云 3D点云 + 2D栅格
CPU占用 低(单核30%) 中(双核60%) 高(双核80%)
建图精度 高(室内cm级) 中(特征点依赖) 高(多模态融合)
回环检测
动态环境 一般 较好(特征筛选) 较好
Nav2集成 原生支持 需适配 原生支持
推荐场景 室内导航首选 视觉丰富环境 需要3D地图

本文方案:Cartographer(主建图)+ 视觉里程计(辅助定位)+ EKF多源融合

2.2 Cartographer 激光SLAM配置

-- config/cartographer_2d.lua
-- Cartographer 2D SLAM 配置(针对IQ-9100优化)

include "map_builder.lua"
include "trajectory_builder.lua"

options = {
  map_builder = MAP_BUILDER,
  trajectory_builder = TRAJECTORY_BUILDER,
  map_frame = "map",
  tracking_frame = "imu_link",
  published_frame = "odom",
  odom_frame = "odom",
  provide_odom_frame = false,   -- 使用外部里程计
  publish_frame_projected_to_2d = true,
  use_odometry = true,
  use_nav_sat = false,
  use_landmarks = false,
  num_laser_scans = 1,
  num_multi_echo_laser_scans = 0,
  num_subdivisions_per_laser_scan = 1,
  num_point_clouds = 0,
  lookup_transform_timeout_sec = 0.2,
  submap_publish_period_sec = 0.3,
  pose_publish_period_sec = 5e-3,        -- 200Hz 位姿发布
  trajectory_publish_period_sec = 30e-3,
  rangefinder_sampling_ratio = 1.,
  odometry_sampling_ratio = 1.,
  fixed_frame_pose_sampling_ratio = 1.,
  imu_sampling_ratio = 1.,
  landmarks_sampling_ratio = 1.,
}

-- 前端 Local SLAM 参数
MAP_BUILDER.use_trajectory_builder_2d = true

TRAJECTORY_BUILDER_2D.use_imu_data = true
TRAJECTORY_BUILDER_2D.min_range = 0.2
TRAJECTORY_BUILDER_2D.max_range = 12.0      -- LiDAR最大范围
TRAJECTORY_BUILDER_2D.min_z = -0.3
TRAJECTORY_BUILDER_2D.max_z = 0.5
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 5.0
TRAJECTORY_BUILDER_2D.num_accumulated_range_data = 1

-- Scan Matching (CSM) 参数优化
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.linear_search_window = 0.15
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.angular_search_window = math.rad(20.)
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.translation_delta_cost_weight = 1e1
TRAJECTORY_BUILDER_2D.real_time_correlative_scan_matcher.rotation_delta_cost_weight = 1e1

-- Ceres Scan Matcher 精细配准
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.occupied_space_weight = 1.
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight = 10.
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.rotation_weight = 40.

-- 子地图参数
TRAJECTORY_BUILDER_2D.submaps.num_range_data = 90
TRAJECTORY_BUILDER_2D.submaps.grid_options_2d.resolution = 0.05   -- 5cm分辨率
TRAJECTORY_BUILDER_2D.submaps.range_data_inserter.probability_grid_range_data_inserter.hit_probability = 0.55
TRAJECTORY_BUILDER_2D.submaps.range_data_inserter.probability_grid_range_data_inserter.miss_probability = 0.49

-- 后端优化参数
POSE_GRAPH.optimization_problem.huber_scale = 1e1
POSE_GRAPH.optimize_every_n_nodes = 90
POSE_GRAPH.constraint_builder.min_score = 0.65
POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7
POSE_GRAPH.constraint_builder.sampling_ratio = 0.3

return options

2.3 多源融合定位 (EKF)

# config/ekf_params.yaml
# robot_localization EKF 配置
# 融合:轮式里程计 + 视觉里程计 + IMU

ekf_filter_node:
  ros__parameters:
    frequency: 50.0
    two_d_mode: true
    publish_tf: true
    map_frame: map
    odom_frame: odom
    base_link_frame: base_link
    world_frame: odom

    # 轮式里程计(高频,短期准确)
    odom0: /wheel_odom
    odom0_config: [true, true, false,   # x, y, z
                   false, false, true,  # roll, pitch, yaw
                   true, true, false,   # vx, vy, vz
                   false, false, true,  # vroll, vpitch, vyaw
                   false, false, false] # ax, ay, az
    odom0_differential: false
    odom0_relative: false

    # 视觉里程计(补充信息)
    odom1: /vo/odom
    odom1_config: [true, true, false,
                   false, false, true,
                   false, false, false,
                   false, false, false,
                   false, false, false]
    odom1_differential: true

    # IMU(角速度和加速度)
    imu0: /imu/data
    imu0_config: [false, false, false,
                  false, false, true,   # yaw
                  false, false, false,
                  false, false, true,   # vyaw
                  true, true, false]    # ax, ay
    imu0_differential: false
    imu0_remove_gravitational_acceleration: true

    process_noise_covariance: [
      0.05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0.05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0.06, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0.03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0.03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0.06, 0, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0.025, 0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0.025, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0.04, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.02, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0,
      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.015
    ]

下篇预告
至此,我们已经完成了系统的整体架构设计、SLAM方案选型与配置,以及多源融合定位EKF的部署。下一篇将深入Nav2导航栈的实战配置,包括AMCL定位、MPPI控制器、SmacPlanner规划器,并利用IQ-9100的NPU加速实现动态障碍物检测与轨迹预测,敬请期待!

Logo

电影级数字人,免显卡端渲染SDK,十行代码即可调用,工业级demo免费开源下载!

更多推荐