第二章:感知系统基础
各位同学,今天我们来聊聊感知系统。说白了,就是机器人怎么「看」和「感觉」这个世界。
我刚开始做具身智能那会儿,总觉得算法才是核心。传感器嘛,买来插上就能用。结果呢?第一次做移动机器人,激光雷达装歪了3度,整个导航系统直接崩了。从那以后,我养成了一个习惯——先搞懂传感器,再谈算法。
2.1 传感器分类:本体感知 vs 外部感知
传感器分两大类,这个分类其实很直观。你想想看,人怎么感知世界?
- 本体感知:感知「自己」的状态。比如你的关节角度、身体倾斜、速度。对应到机器人,就是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 选型原则
选传感器,不是越贵越好。我总结了一个「三问法」:
- 你要感知什么?——距离?图像?力?
- 环境条件如何?——室内/室外?光照?温度?
- 预算和算力够吗?——传感器贵,配套的处理器也得跟上。
举个例子。做室内服务机器人,我一般推荐:
| 传感器 | 推荐型号 | 理由 |
|---|---|---|
| 摄像头 | 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