基于高通跃龙IQ-9100打造具身智能机器人视觉SLAM与自主导航系统(1): 系统架构与SLAM配置
·
前言
在《基于高通跃龙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加速实现动态障碍物检测与轨迹预测,敬请期待!
更多推荐


所有评论(0)