第二章:感知系统基础

各位同学,今天我们来聊聊感知系统。说白了,就是机器人怎么「看」和「感觉」这个世界。

我刚开始做具身智能那会儿,总觉得算法才是核心。传感器嘛,买来插上就能用。结果呢?第一次做移动机器人,激光雷达装歪了3度,整个导航系统直接崩了。从那以后,我养成了一个习惯——先搞懂传感器,再谈算法。

2.1 传感器分类:本体感知 vs 外部感知

传感器分两大类,这个分类其实很直观。你想想看,人怎么感知世界?

  • 本体感知:感知「自己」的状态。比如你的关节角度、身体倾斜、速度。对应到机器人,就是IMU、编码器、关节力矩传感器。
  • 外部感知:感知「环境」的状态。比如前面有没有墙、物体是什么颜色、距离多远。对应到机器人,就是摄像头、激光雷达、触觉传感器。

我个人习惯把这两类比作「内观」和「外观」。本体感知告诉你「我在哪、我怎么了」,外部感知告诉你「周围有什么、我该怎么动」。两者缺一不可。

核心观点:没有本体感知,机器人就是个「盲人」;没有外部感知,机器人就是个「瘫痪的盲人」。两者必须协同工作。

这里我画了一张图,帮你理清整个感知系统的知识体系:

感知系统知识体系 感知系统 本体感知 外部感知 IMU 编码器 关节力矩 摄像头 激光雷达 触觉传感器 位姿估计 · 运动控制 环境建图 · 物体识别 传感器选型 → 标定 → 数据融合 → 控制决策

2.2 常用传感器原理

2.2.1 摄像头

摄像头是机器人的「眼睛」。原理其实很简单——光线通过镜头,落在CMOS或CCD感光元件上,转换成电信号,再变成数字图像。

但这里有个坑。我记得第一次做视觉SLAM,买了个USB摄像头,参数看着挺漂亮。结果一跑算法,帧率只有15fps,图像还带畸变。后来才明白,全局快门 vs 卷帘快门这个参数有多重要。

我的经验:做移动机器人,尽量选全局快门摄像头。卷帘快门在快速运动时会产生「果冻效应」,图像都扭曲了,算法根本没法用。

摄像头选型时,重点关注这几个参数:

  • 分辨率:不是越高越好。640×480够用,1080P更好,但4K对算力要求太高。
  • 帧率:至少30fps,做高速运动需要60fps以上。
  • 视场角:我一般选90°-120°,太窄了看不到旁边,太宽了畸变严重。
  • 接口:USB3.0或GigE,别用USB2.0,带宽不够。

2.2.2 激光雷达

激光雷达,说白了就是「用激光测距」。发射一束激光,打到物体上反射回来,根据时间差算出距离。

激光雷达分两种:

  • 2D激光雷达:单线扫描,只能测一个平面。适合室内导航、避障。
  • 3D激光雷达:多线扫描(16线、32线、64线),能测三维空间。适合自动驾驶、复杂环境建图。

嗯,这里要注意。激光雷达的角分辨率测距精度是核心指标。我做过一个项目,用了便宜的RPLIDAR,角分辨率只有1°,建出来的地图边缘全是锯齿。后来换了0.3°的,效果天差地别。

避坑指南:我曾经在室外用2D激光雷达做导航,结果阳光直射时雷达直接「瞎了」。后来才知道,室外强光会干扰激光接收。如果你做室外项目,要么加遮光罩,要么直接上3D激光雷达。

2.2.3 IMU(惯性测量单元)

IMU是机器人的「内耳」,负责感知自身的加速度和角速度。它由三部分组成:

  • 加速度计:测三轴加速度,可以算出倾斜角度。
  • 陀螺仪:测三轴角速度,可以算出旋转角度。
  • 磁力计(可选):测地磁场,辅助确定方向。

IMU有个致命问题——漂移。加速度计有噪声,陀螺仪有零偏,积分时间一长,位置就飞了。你想想看,手机导航走路,几分钟后定位就偏了,就是这个原因。

我个人习惯用IMU做短时间姿态估计,或者和视觉/激光雷达做融合。纯IMU定位?不靠谱。

2.2.4 触觉传感器

触觉传感器是机器人「皮肤」的一部分。它让机器人能感知「接触」——有没有碰到东西、碰到了多大力、接触面是什么形状。

常见的触觉传感器原理:

  • 电阻式:压力改变电阻值,简单便宜,但精度一般。
  • 电容式:压力改变电容值,灵敏度高,适合精细操作。
  • 压电式:压力产生电荷,适合动态力检测。

我记得有一次做机械臂抓取鸡蛋,用电阻式触觉传感器,反馈太粗糙,鸡蛋直接捏碎了。后来换成电容式,能感知到0.1N的力变化,抓鸡蛋稳稳的。

2.3 传感器选型与标定

2.3.1 选型原则

选传感器,不是越贵越好。我总结了一个「三问法」:

  1. 你要感知什么?——距离?图像?力?
  2. 环境条件如何?——室内/室外?光照?温度?
  3. 预算和算力够吗?——传感器贵,配套的处理器也得跟上。

举个例子。做室内服务机器人,我一般推荐:

传感器 推荐型号 理由
摄像头 Intel RealSense D435 全局快门,深度+RGB,性价比高
激光雷达 RPLIDAR A3 16m测距,0.3°角分辨率,室内够用
IMU ICM-20948 9轴,低功耗,I2C/SPI接口
触觉传感器 Gelsight Mini 高分辨率触觉,适合抓取实验

2.3.2 标定方法

标定,说白了就是「让传感器知道自己的位置和参数」。不标定?数据全是错的。

摄像头标定:用棋盘格,拍20-30张不同角度的照片,用OpenCV算内参(焦距、畸变系数)和外参(位置、姿态)。

# 摄像头标定示例(Python + OpenCV)
import cv2
import numpy as np

# 准备棋盘格角点
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6*9, 3), np.float32)
objp[:,:2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2)

# 读取图像并找角点
img = cv2.imread('calib.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (9, 6), None)

if ret:
    corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
    # 标定得到内参矩阵和畸变系数
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
        [objp], [corners2], gray.shape[::-1], None, None)
    print("内参矩阵:\n", mtx)
    print("畸变系数:\n", dist)

激光雷达标定:主要是标定雷达和车体/机械臂的安装角度。我习惯用「三线法」——找三个已知距离的平面,测出实际距离,反推安装角度偏差。

IMU标定:重点是消除零偏。把IMU静止放置,采集1分钟数据,取平均值就是零偏。然后每次使用前减去这个值。

我的小技巧:IMU标定后,最好做一次「六面法」——把IMU分别朝上、朝下、朝左、朝右、朝前、朝后各静止10秒,这样可以标定出更精确的零偏和尺度因子。

2.4 本章小结

感知系统是具身智能的「感官」。没有好的感知,再牛的算法也是空中楼阁。

这一章我们讲了:

  • 传感器分本体感知和外部感知两大类
  • 摄像头、激光雷达、IMU、触觉传感器的工作原理和选型要点
  • 传感器选型的「三问法」和标定的基本方法

下一章,我们会把这些传感器「串」起来,讲讲数据融合和感知算法。但在此之前,我建议你亲手做一次摄像头标定。别怕麻烦,标定一次,后面省心一百次。


公众号:蓝海资料掘金营,微信deep3321