4. 感知系统入门:摄像头、激光雷达、IMU、触觉传感器——机器人如何“看”和“感觉”
大家好,我是你们的老朋友。
上一章我们聊了机器人的“小脑”——运动控制。这一章,我们来聊聊机器人的“眼睛”和“皮肤”。说白了,就是感知系统。
人形机器人要走进家庭、走进工厂,它得先知道自己在哪,周围有什么,手里抓的是鸡蛋还是铁块。这些信息从哪来?就靠传感器。
我个人习惯把感知系统分成两大类:外部感知(看世界)和内部感知(感受自己)。今天咱们就把这几个核心传感器挨个捋一遍。
4.1 摄像头:机器人的“眼睛”
摄像头是感知系统里最直观的传感器。它采集的是二维图像,但我们要的是三维世界的信息。
4.1.1 单目 vs 双目 vs RGB-D
这里有个经典问题:单目摄像头能测距吗?理论上可以,但需要移动或者已知物体大小。说白了,单目就像你闭上一只眼睛,很难判断远处物体到底有多远。
| 类型 | 原理 | 优点 | 缺点 | 典型应用 |
|---|---|---|---|---|
| 单目 | 单镜头成像 | 成本低、体积小 | 无法直接测距 | 视觉SLAM、目标分类 |
| 双目 | 双镜头视差 | 被动测距、纹理丰富 | 计算量大、弱纹理失效 | 避障、深度估计 |
| RGB-D | 结构光/ToF | 直接输出深度图 | 易受环境光干扰 | 抓取、建图 |
4.1.2 视觉处理流水线
摄像头采集到原始图像后,不是直接拿来用的。一般要经过这么几步:
- 去畸变:镜头都有畸变,尤其是广角。先校正。
- 特征提取:找角点、边缘、纹理。常用ORB、SIFT、SuperPoint。
- 特征匹配:把当前帧和上一帧的特征对上,或者和地图对上。
- 位姿估计:通过PnP或直接法,算出相机(也就是机器人)的位置和姿态。
嗯,这里要注意,每一步都可能引入误差。我曾经在调试一个视觉SLAM系统时,发现定位老是漂移。查了两天,最后发现是去畸变参数标错了。一个小数点,毁了一周的工作。
4.2 激光雷达:精确的“尺子”
激光雷达(LiDAR)发射激光束,测量反射时间,直接得到距离信息。它不依赖光照,精度高,是建图和定位的利器。
4.2.1 2D vs 3D LiDAR
- 2D LiDAR:扫描一个平面,常用于室内导航、避障。比如扫地机器人用的就是这种。
- 3D LiDAR:扫描多个平面,生成点云。人形机器人一般用这种,能感知三维环境。
我建议,如果你做的是足式机器人,至少用16线以上的3D LiDAR。线数太少,地面点太稀疏,容易把平地误判成悬崖。
4.2.2 点云处理基础
激光雷达输出的是一堆点,每个点有(x, y, z)坐标。处理点云常用的库是PCL(Point Cloud Library)。
// 点云滤波示例:去除离群点
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
sor.setMeanK(50);
sor.setStddevMulThresh(1.0);
sor.filter(*cloud_filtered);
4.3 IMU:机器人的“内耳”
IMU(惯性测量单元)包含加速度计和陀螺仪。它测量的是机器人自身的加速度和角速度。说白了,就是感受“我在动”和“我在转”。
4.3.1 IMU的致命弱点:漂移
IMU通过积分得到位置和姿态。但积分会累积误差。你想想看,加速度计有噪声,积分一次变速度,再积分一次变位置。几秒钟还行,几分钟就飞到天边去了。
所以,IMU不能单独用。它必须和摄像头或激光雷达做融合。最常见的方案是视觉-惯性里程计(VIO)或激光-惯性里程计(LIO)。
4.3.2 IMU标定
买回来的IMU,零偏、尺度因子、轴间误差都不一样。必须标定。
我记得第一次做IMU标定,用了著名的imu_utils工具包。把IMU静置两个小时,采集数据,然后分析Allan方差。结果发现,我买的廉价IMU零偏稳定性差得离谱,根本不适合做VIO。后来换了工业级的,才勉强能用。
4.4 触觉传感器:机器人的“皮肤”
人形机器人要抓取物体,光靠视觉不够。你想想看,你闭着眼睛也能拿起一个鸡蛋,靠的就是触觉。机器人也一样。
4.4.1 触觉传感器的类型
| 类型 | 原理 | 测量量 | 典型应用 |
|---|---|---|---|
| 压阻式 | 压力改变电阻 | 法向力 | 指尖抓取力控制 |
| 电容式 | 压力改变电容 | 法向力、切向力 | 滑觉检测 |
| 压电式 | 压力产生电荷 | 动态力 | 碰撞检测 |
| 光学式 | 相机拍摄弹性体变形 | 高分辨率力分布 | 精细操作 |
4.4.2 触觉在抓取中的应用
我做过一个实验:让机器人抓一个纸杯。只用视觉,机器人一抓就捏扁了。加上触觉反馈后,它能检测到指尖和杯壁的接触力,然后调整抓取力,稳稳地拿起来。
触觉传感器的数据通常要融合到控制回路中。一个简单的力控策略:
# 伪代码:力控抓取
desired_force = 2.0 # 牛顿
while True:
current_force = read_tactile_sensor()
error = desired_force - current_force
position_adjustment = Kp * error
move_fingers(position_adjustment)
4.5 多传感器融合:1+1 > 2
单个传感器都有短板。摄像头怕暗、怕纹理少;激光雷达怕雨雪、怕反射面;IMU会漂移;触觉传感器覆盖范围有限。所以,必须融合。
最常见的融合框架是扩展卡尔曼滤波(EKF)或因子图优化。以视觉-惯性融合为例:
- 摄像头提供低频的位姿观测(比如30Hz)
- IMU提供高频的运动预测(比如200Hz)
- EKF把两者揉在一起,输出平滑且无漂移的位姿估计
下面这张图,是我自己总结的感知系统知识体系,希望能帮你理清思路。