physics_simulation

第14章:传感器仿真与噪声建模

本章概述

传感器仿真是缩小仿真与现实差距的关键环节。真实机器人系统中,控制策略必须基于带噪声、延迟和偏差的传感器数据做出决策。本章深入探讨各类传感器的物理建模、噪声特性分析以及标定方法,帮助读者构建更真实的仿真环境,提高强化学习策略的现实部署成功率。我们将从视觉传感器的光学仿真开始,逐步覆盖力觉、触觉等多模态感知系统,最后讨论系统级的传感器融合与标定技术。

学习目标

完成本章学习后,您将能够:

14.1 视觉传感器仿真

14.1.1 针孔相机模型与内参

视觉传感器是机器人感知的核心。从物理原理出发,相机成像过程可以用针孔模型近似描述。三维世界点 $\mathbf{X}_w = [X_w, Y_w, Z_w]^T$ 到像素坐标 $[u, v]$ 的映射涉及多个坐标系变换:

\[s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \mathbf{K} \mathbf{P} \mathbf{T}_{cw} \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix}\]

其中内参矩阵 $\mathbf{K}$ 包含焦距和主点:

\[\mathbf{K} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}\]
投影矩阵 $\mathbf{P} = [\mathbf{I}_{3×3} \mathbf{0}{3×1}]$ 执行透视投影,$\mathbf{T}{cw}$ 是相机外参变换矩阵。

14.1.2 镜头畸变模型

真实镜头存在径向和切向畸变。Brown-Conrady模型是工业标准:

径向畸变: \(\begin{aligned} x_d &= x_u(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) \\ y_d &= y_u(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) \end{aligned}\)

切向畸变: \(\begin{aligned} x_d &= x_u + [2p_1 x_u y_u + p_2(r^2 + 2x_u^2)] \\ y_d &= y_u + [p_1(r^2 + 2y_u^2) + 2p_2 x_u y_u] \end{aligned}\)

其中 $r^2 = x_u^2 + y_u^2$ 是归一化平面上的径向距离。

14.1.3 成像噪声建模

相机噪声源包括:

光子噪声(Shot Noise):遵循泊松分布 \(P(k; \lambda) = \frac{\lambda^k e^{-\lambda}}{k!}\) 其中 $\lambda$ 是期望光子数,与光强成正比。

读出噪声(Read Noise):高斯分布 \(n_{read} \sim \mathcal{N}(0, \sigma_{read}^2)\)

暗电流噪声(Dark Current):热电子产生 \(n_{dark} = \sqrt{D \cdot t_{exp}} \cdot \xi, \quad \xi \sim \mathcal{N}(0, 1)\)

总噪声模型: \(I_{observed} = g \cdot (I_{photon} + n_{dark}) + n_{read} + n_{quantization}\)

14.1.4 运动模糊与快门效应

全局快门的运动模糊可用时间积分表示: \(I_{blur}(x, y) = \frac{1}{t_{exp}} \int_0^{t_{exp}} I(x + v_x(t), y + v_y(t)) dt\)

滚动快门(Rolling Shutter)产生几何畸变: \(t_{row}(y) = t_0 + \frac{y}{H} \cdot t_{readout}\)

每行的曝光时间不同,导致快速运动物体的扭曲。

14.1.5 深度相机仿真

结构光深度相机通过投影编码图案测量深度: \(Z = \frac{f \cdot b}{d}\) 其中 $b$ 是基线,$d$ 是视差。

ToF相机测量光飞行时间: \(d = \frac{c \cdot \Delta\phi}{4\pi f_{mod}}\)

深度噪声模型: \(\sigma_z = \alpha \cdot z^2 + \beta\)

14.2 力/力矩传感器

14.2.1 六维力/力矩传感器原理

六轴F/T传感器测量三个力分量和三个力矩分量。应变片布置遵循惠斯通电桥原理:

\[\begin{bmatrix} F_x \\ F_y \\ F_z \\ M_x \\ M_y \\ M_z \end{bmatrix} = \mathbf{C} \begin{bmatrix} V_1 \\ V_2 \\ \vdots \\ V_n \end{bmatrix}\]

其中 $\mathbf{C}$ 是标定矩阵,$V_i$ 是电桥输出电压。

14.2.2 动态响应模型

力传感器的动态响应可用二阶系统建模: \(\ddot{x} + 2\zeta\omega_n\dot{x} + \omega_n^2 x = \omega_n^2 F_{applied}\)

频率响应: \(H(j\omega) = \frac{1}{1 - (\omega/\omega_n)^2 + j2\zeta(\omega/\omega_n)}\)

带宽限制导致高频力信号衰减和相位滞后。

14.2.3 温度漂移与迟滞

温度影响: \(F_{measured} = F_{true}(1 + \alpha \Delta T) + F_{offset}(T)\)

迟滞效应用Preisach模型描述: \(y(t) = \int\int_{\alpha \geq \beta} \mu(\alpha, \beta) \gamma_{\alpha\beta}[u(t)] d\alpha d\beta\)

14.2.4 串扰与非线性

传感器轴间串扰: \(\mathbf{F}_{measured} = (\mathbf{I} + \mathbf{X})\mathbf{F}_{true} + \mathbf{n}\)

其中 $\mathbf{X}$ 是串扰矩阵,典型值为1-3%。

14.3 触觉与本体感知

14.3.1 触觉阵列建模

触觉传感器将接触力分布转换为空间采样信号:

    Contact Force Distribution
    ┌─────────────────────┐
    │  ╱╲    ╱╲    ╱╲   │
    │ ╱  ╲  ╱  ╲  ╱  ╲  │  → Taxel Grid
    │╱    ╲╱    ╲╱    ╲ │
    └─────────────────────┘
         ↓ ↓ ↓ ↓ ↓
    [p₁, p₂, p₃, ..., pₙ]

单个触觉单元(taxel)响应: \(p_i = \int_{\Omega_i} \sigma(\mathbf{x}) \cdot w_i(\mathbf{x}) d\mathbf{x}\)

其中 $\sigma(\mathbf{x})$ 是压力分布,$w_i$ 是空间权重函数。

14.3.2 关节编码器

增量式编码器: \(\theta_{measured} = \theta_0 + \frac{2\pi \cdot N_{counts}}{N_{resolution}}\)

量化噪声: \(\epsilon_{quant} \sim \mathcal{U}(-\Delta\theta/2, \Delta\theta/2)\)

其中 $\Delta\theta = 2\pi/N_{resolution}$。

14.3.3 IMU传感器模型

加速度计测量: \(\mathbf{a}_{measured} = \mathbf{R}_{sb}(\mathbf{a}_{true} - \mathbf{g}) + \mathbf{b}_a + \mathbf{n}_a\)

陀螺仪测量: \(\boldsymbol{\omega}_{measured} = \mathbf{R}_{sb}\boldsymbol{\omega}_{true} + \mathbf{b}_g + \mathbf{n}_g\)

偏差随机游走: \(\dot{\mathbf{b}} = \mathbf{n}_b, \quad \mathbf{n}_b \sim \mathcal{N}(0, \sigma_b^2\mathbf{I})\)

14.3.4 电机电流反馈

电机电流与输出力矩的关系: \(\tau = K_t \cdot i - \tau_{friction}(sign(\dot{\theta}))\)

电流测量噪声: \(i_{measured} = i_{true} + n_{ADC} + i_{ripple}(\theta_{elec})\)

14.4 噪声模型与标定

14.4.1 噪声类型分类

加性高斯白噪声(AWGN): \(y = x + n, \quad n \sim \mathcal{N}(0, \sigma^2)\)

乘性噪声: \(y = x(1 + n), \quad n \sim \mathcal{N}(0, \sigma_m^2)\)

量化噪声: \(y = \lfloor x/\Delta + 0.5 \rfloor \cdot \Delta\)

$1/f$ 噪声(粉红噪声): \(S(f) = \frac{K}{f^\alpha}, \quad \alpha \approx 1\)

14.4.2 Allan方差分析

Allan方差用于识别惯性传感器噪声特性: \(\sigma_y^2(\tau) = \frac{1}{2}\langle(y_{k+1} - y_k)^2\rangle\)

不同噪声源在log-log图上的斜率:

14.4.3 系统辨识方法

最小二乘标定: \(\min_{\boldsymbol{\theta}} \sum_{i=1}^N \|y_i - f(\mathbf{x}_i; \boldsymbol{\theta})\|^2\)

贝叶斯标定考虑先验: \(p(\boldsymbol{\theta}|\mathbf{y}) \propto p(\mathbf{y}|\boldsymbol{\theta}) p(\boldsymbol{\theta})\)

14.4.4 在线自适应标定

卡尔曼滤波器用于在线参数估计: \(\begin{aligned} \hat{\mathbf{x}}_{k|k-1} &= \mathbf{F}\hat{\mathbf{x}}_{k-1|k-1} \\ \mathbf{P}_{k|k-1} &= \mathbf{F}\mathbf{P}_{k-1|k-1}\mathbf{F}^T + \mathbf{Q} \\ \mathbf{K}_k &= \mathbf{P}_{k|k-1}\mathbf{H}^T(\mathbf{H}\mathbf{P}_{k|k-1}\mathbf{H}^T + \mathbf{R})^{-1} \end{aligned}\)

14.5 RL应用:多模态感知的仿真

14.5.1 传感器选择策略

不同任务的传感器配置:

抓取任务

运动控制

14.5.2 噪声鲁棒性训练

域随机化中的传感器噪声增强: \(\mathbf{o}_{train} = \mathbf{o}_{clean} + \alpha \cdot \mathbf{n}_{random}\)

其中 $\alpha \sim \mathcal{U}[\alpha_{min}, \alpha_{max}]$ 控制噪声强度。

14.5.3 传感器延迟补偿

预测控制补偿传感器延迟: \(\hat{\mathbf{s}}_{t+\Delta t} = \mathbf{s}_t + \int_t^{t+\Delta t} f(\mathbf{s}, \mathbf{a}) d\tau\)

14.5.4 多传感器融合

互补滤波器融合IMU和编码器: \(\theta_{fused} = \alpha \cdot \theta_{IMU} + (1-\alpha) \cdot \theta_{encoder}\)

其中 $\alpha$ 根据频率特性选择。

历史人物:Kalman与1960年滤波理论的建立

Rudolf E. Kálmán在1960年发表的论文”A New Approach to Linear Filtering and Prediction Problems”彻底改变了状态估计领域。作为匈牙利裔美国数学家,Kalman提出的递归滤波算法不仅在阿波罗登月计划中发挥关键作用,更成为现代传感器融合的理论基石。

Kalman滤波器的优雅之处在于其贝叶斯框架下的最优性:给定线性系统和高斯噪声假设,它提供最小均方误差估计。这一理论突破使得从噪声测量中提取有用信息成为可能,直接推动了GPS、自动驾驶和机器人导航等技术的发展。

高级话题:量子传感器与测量理论极限

量子传感器的原理

量子传感器利用量子叠加和纠缠实现超越经典极限的测量精度。量子态 $ \psi\rangle$ 对参数 $\theta$ 的Fisher信息:
\[F_Q(\theta) = 4(\langle\partial_\theta\psi|\partial_\theta\psi\rangle - |\langle\partial_\theta\psi|\psi\rangle|^2)\]

量子Cramér-Rao界限: \(\Delta\theta \geq \frac{1}{\sqrt{n F_Q(\theta)}}\)

海森堡不确定性原理的影响

位置-动量不确定性: \(\Delta x \cdot \Delta p \geq \frac{\hbar}{2}\)

这对力传感器的带宽-灵敏度权衡施加了基本限制。

量子增强的应用前景

  1. 量子陀螺仪:利用原子干涉测量旋转,精度提高$10^3$倍
  2. 量子重力仪:检测微小重力变化,用于地下导航
  3. 量子磁力计:SQUID传感器测量纳特斯拉级磁场
  4. 量子成像:利用纠缠光子实现亚衍射极限分辨率

仿真中的量子效应

虽然当前机器人系统主要使用经典传感器,但在纳米尺度操作和极端环境下,量子效应不可忽略:

\[\langle\Delta F^2\rangle_{quantum} = \langle\Delta F^2\rangle_{classical} + \frac{\hbar\omega}{2}\coth\left(\frac{\hbar\omega}{2k_BT}\right)\]

本章小结

本章系统介绍了机器人仿真中的传感器建模方法:

关键概念

  1. 视觉传感器的完整成像链:几何投影→畸变→噪声→量化
  2. 力/力矩传感器的动态特性:带宽限制、温度漂移、迟滞
  3. 触觉和本体感知:空间分辨率、量化效应、偏差演化
  4. 噪声建模:加性/乘性、白噪声/有色噪声、系统/随机

核心公式

实践要点

  1. 传感器噪声是Sim-to-Real的关键因素
  2. 不同传感器的噪声特性需要针对性建模
  3. 标定是连接仿真与现实的桥梁
  4. 多模态融合可以提高感知鲁棒性

练习题

基础题

14.1 相机内参标定 给定棋盘格标定图像,其中一个角点的世界坐标为$(0, 0, 0)$,像素坐标为$(320, 240)$。相机距离棋盘格500mm,像素尺寸为5μm。计算焦距$f_x$和$f_y$(假设无畸变)。

Hint: 使用针孔相机模型的投影关系。

答案 根据针孔模型:$u = f_x \cdot X/Z + c_x$ 已知条件: - $(u, v) = (320, 240)$ 是主点(假设图像中心) - $Z = 500$mm - 像素尺寸 = 5μm = 0.005mm 对于点$(0,0,0)$投影到$(320, 240)$,说明这是主点位置。 若考虑另一个点$(X,0,Z)$,其像素坐标偏移为: $\Delta u = f_x \cdot X/Z$ (以像素为单位) 物理焦距与像素焦距的关系: $f_x = f_{physical} / pixel\_size = f_{physical} / 0.005$ 典型35mm等效焦距约为50mm,则: $f_x = f_y = 50 / 0.005 = 10000$ 像素 验证:1mm的物体在500mm处产生的像素偏移: $\Delta u = 10000 \cdot 1/500 = 20$ 像素 对应物理尺寸:$20 \cdot 0.005 = 0.1$mm,符合缩放比例。

14.2 力传感器带宽分析 一个力传感器的自然频率$\omega_n = 1000$Hz,阻尼比$\zeta = 0.7$。计算: a) -3dB带宽 b) 100Hz正弦力信号的幅值衰减和相位滞后

Hint: 使用二阶系统的频率响应函数。

答案 频率响应:$H(j\omega) = 1/(1 - (\omega/\omega_n)^2 + j2\zeta(\omega/\omega_n))$ a) -3dB带宽($|H| = 1/\sqrt{2}$): 设$\Omega = \omega/\omega_n$,求解: $|H|^2 = 1/[(1-\Omega^2)^2 + (2\zeta\Omega)^2] = 1/2$ $(1-\Omega^2)^2 + (2\zeta\Omega)^2 = 2$ 对于$\zeta = 0.7$: $(1-\Omega^2)^2 + 1.96\Omega^2 = 2$ 解得:$\Omega \approx 1.03$ 带宽:$f_{-3dB} = 1.03 \cdot 1000 = 1030$Hz b) 100Hz响应($\Omega = 0.1$): $H(j0.1) = 1/(1 - 0.01 + j0.14) = 1/(0.99 + j0.14)$ 幅值:$|H| = 1/\sqrt{0.99^2 + 0.14^2} = 1/1.00 \approx 1.00$(无衰减) 相位:$\phi = -\arctan(0.14/0.99) = -8.0°$

14.3 IMU噪声参数估计 给定IMU陀螺仪的Allan方差数据点:

识别主要噪声源并估计参数。

Hint: 不同噪声源在log-log图上有特定斜率。

答案 在log-log图上分析斜率: 1. τ = 0.01s → 1s: $\log(0.1) - \log(0.01) = -1$ $\log(1) - \log(0.01) = 2$ 斜率 = -1/2 → 角度随机游走(ARW) 2. τ = 1s → 100s: $\log(0.1) - \log(0.01) = 1$ $\log(100) - \log(1) = 2$ 斜率 = +1/2 → 偏差不稳定性(BI) 参数估计: - ARW: $N = \sigma(\tau=1) = 0.01$ deg/s/√Hz - BI: 在τ ≈ 10s处最小值,$B \approx 0.005$ deg/s

挑战题

14.4 深度相机误差建模 设计一个实验来标定结构光深度相机的误差模型$\sigma_z = \alpha z^2 + \beta$。描述: a) 实验设置 b) 数据采集协议 c) 参数拟合方法 d) 验证策略

Hint: 考虑不同距离、不同材质的标定板。

答案 a) 实验设置: - 平面标定板(棋盘格),垂直于相机光轴 - 电动滑轨,精度<0.1mm - 距离范围:0.3m - 3m,间隔0.1m - 多种材质:白色哑光、黑色、金属、透明塑料 b) 数据采集: 1. 每个距离采集1000帧 2. 计算每个像素的深度均值和标准差 3. 选择中心区域(避免边缘效应) 4. 记录环境光照、温度 c) 参数拟合: 最小二乘法: ``` z_actual = [0.3, 0.4, ..., 3.0] σ_measured = std(depth_samples) A = [z_actual^2, ones(size(z_actual))] [α, β] = A \ σ_measured ``` 加权最小二乘(考虑异方差): $W = diag(1/\sigma_i^2)$ $[\alpha, \beta] = (A^TWA)^{-1}A^TWy$ d) 验证: 1. 交叉验证:留一法 2. 不同场景测试:倾斜平面、曲面 3. 动态场景:运动物体的深度跟踪 4. 与激光测距仪对比

14.5 多传感器时间同步 设计一个算法来估计和补偿相机(30Hz)、IMU(200Hz)和力传感器(1kHz)之间的时间偏移。考虑:

Hint: 利用运动事件在不同传感器中的相关性。

答案 算法设计: 1. **硬件同步信号**: - PPS (Pulse Per Second) 信号 - 共同时钟源 (PTP/NTP) 2. **基于运动的软同步**: 快速旋转测试: - IMU检测角速度峰值:$t_{IMU}$ - 相机检测运动模糊开始:$t_{cam}$ - 时间偏移:$\Delta t = t_{cam} - t_{IMU}$ 3. **互相关方法**: ```python # 相机位姿变化率 pose_rate = diff(camera_poses) * 30 # IMU积分位姿 imu_pose = cumsum(imu_angular_vel) * dt # 互相关 correlation = xcorr(pose_rate, imu_angular_vel) time_offset = argmax(correlation) * dt ``` 4. **卡尔曼滤波器估计**: 状态:$\mathbf{x} = [t_{offset}, t_{drift}]^T$ 测量模型: $z_k = t_{offset} + t_{drift} \cdot k + n_k$ 5. **在线补偿**: - 时间戳修正:$t_{corrected} = t_{raw} + \hat{t}_{offset}$ - 插值对齐:cubic spline插值到共同时间网格 验证:已知运动轨迹的重建误差。

14.6 触觉SLAM 提出一种基于触觉传感器的SLAM(Simultaneous Localization and Mapping)算法框架。考虑:

Hint: 借鉴视觉SLAM但考虑触觉的独特性。

答案 触觉SLAM框架: 1. **触觉特征**: - 表面纹理:频域特征 (FFT) - 刚度:力-位移比 - 温度:热特征 - 几何:边缘、角点 2. **前端:里程计**: ``` 接触序列:C_t = {p_i, f_i, texture_i} 运动估计: minimize Σ||f(T, C_t) - C_{t+1}||^2 其中T是机器人位姿变换 ``` 3. **后端:图优化**: 节点:机器人位姿、触觉地标 边: - 里程计约束 - 触觉观测约束 - IMU预积分约束 4. **回环检测**: 触觉指纹匹配: - 词袋模型 (Bag of Tactile Words) - 深度触觉描述子 5. **地图表示**: - 稀疏点云:{位置, 触觉属性} - 触觉网格地图 - 高斯过程隐式表面 6. **特殊挑战**: - 主动探索:信息增益驱动 - 多指协调:并行触觉流融合 - 滑动处理:检测并补偿 实现考虑: - 使用因子图 (GTSAM) - 边缘化老的位姿 - 触觉特征的不变性设计

14.7 传感器故障检测与容错 设计一个基于模型的传感器故障检测系统,能够: a) 检测传感器故障(突变、漂移、卡死) b) 隔离故障传感器 c) 重构丢失的测量

Hint: 使用解析冗余和观测器设计。

答案 故障检测与隔离(FDI)系统: 1. **残差生成**: Luenberger观测器: $$\begin{aligned} \dot{\hat{\mathbf{x}}} &= \mathbf{A}\hat{\mathbf{x}} + \mathbf{B}\mathbf{u} + \mathbf{L}(\mathbf{y} - \mathbf{C}\hat{\mathbf{x}}) \\ \mathbf{r} &= \mathbf{y} - \mathbf{C}\hat{\mathbf{x}} \end{aligned}$$ 2. **故障特征**: - 突变:$|r_k - r_{k-1}| > \theta_{abrupt}$ - 漂移:$\sum_{i=k-N}^k r_i/N > \theta_{drift}$ - 卡死:$\text{var}(r_{k-N:k}) < \theta_{stuck}$ 3. **银行观测器**: 为每个传感器设计专用观测器: ``` Observer_i: 使用除传感器i外的所有测量 若传感器j故障,则Observer_j的残差最小 ``` 4. **GLR检测器**: 广义似然比: $$\Lambda = \max_{\theta_1} \frac{p(\mathbf{r}|H_1, \theta_1)}{p(\mathbf{r}|H_0)}$$ 5. **虚拟传感器重构**: - 运动学冗余:$\hat{v} = \mathbf{J}\dot{\mathbf{q}}$ - 动力学冗余:$\hat{F} = \mathbf{M}\ddot{\mathbf{q}} + \mathbf{C}\dot{\mathbf{q}} + \mathbf{g}$ - 贝叶斯估计:$p(x|z_{healthy}) \propto p(z_{healthy}|x)p(x)$ 6. **自适应阈值**: $$\theta_k = \mu_r + k_\sigma \cdot \sigma_r \cdot \sqrt{1 + 1/N}$$ 7. **容错控制切换**: ``` if sensor_failed[i]: controller.disable_feedback(i) controller.use_virtual_sensor(i) controller.reduce_gains(safety_factor) ``` 验证:注入已知故障,测试检测延迟和误报率。

常见陷阱与错误 (Gotchas)

1. 相机仿真陷阱

错误:忽略有限曝光时间

# 错误:瞬时采样
image = render(scene, t)

# 正确:时间积分
image = integrate(lambda t: render(scene, t), t0, t0+exposure_time)

错误:线性化畸变模型

2. 力传感器陷阱

错误:忽略安装刚度

错误:静态标定用于动态测量

3. IMU集成陷阱

错误:直接积分加速度获取位置

# 错误:误差快速累积
position += velocity * dt
velocity += acceleration * dt

# 正确:使用滤波器融合
ekf.predict(imu_data)
ekf.update(external_measurement)

4. 时间同步陷阱

错误:假设即时通信

5. 噪声模型陷阱

错误:所有噪声都是高斯白噪声

调试技巧

  1. 可视化传感器数据流
    • 原始数据时序图
    • 频谱分析
    • 统计分布直方图
  2. 离线vs在线处理
    • 先用录制数据调试算法
    • 确认后再部署实时系统
  3. 渐进式集成
    • 单传感器→多传感器
    • 无噪声→带噪声
    • 静态→动态
  4. 地面真值对比
    • 使用高精度参考系统
    • 动作捕捉系统验证

最佳实践检查清单

设计审查要点