读取刚体状态
需要:uBotSensor 0.1.x(含依赖 uBotCore)
位姿、里程计和 IMU 在机体有刚体状态源(Body State Source)时直接读它给出的速度和加速度,不再对位姿做差分,这一行为从 uBotSensor 0.1.2 起提供。
刚体状态源由插件在 C++ 里实现:无人机的 Movement 组件是一个(见无人机的刚体状态),物理后端的绑定也是。蓝图里不用做任何事,传感器自己判断。
| 传感器 | 状态模式下从状态读 | 仍取自组件变换 |
|---|---|---|
| 位姿传感器 | 线速度、角速度,从第一个样本起就有 | 位置、姿态 |
| 里程计 | 本地坐标系下的线速度和角速度 | 相对起点的位姿、协方差 |
| IMU 传感器 | 姿态、角速度、比力,三者属于同一时刻 | 瞬移判断、样本间隔判断 |
什么时候读状态
Section titled “什么时候读状态”每个样本都重新判断,状态源可以随时出现或消失:
- 从传感器沿附着链向上,找最近的、被某个状态源驱动的刚体。里程计从被跟踪的组件开始找。
- 找到了,并且传感器的
Use Body State开着(默认开),就是状态模式;否则是差分模式。位姿传感器还要求Reference Frame是World。 - 差分模式与 0.1.1 的算法相同,没有状态源的场景行为不变。
刚体到传感器之间的部分按刚性连接处理:传感器相对刚体的位置(杠杆臂)取当前的组件变换,IMU 和里程计的速度、加速度已换算到传感器所在的点。传感器装在会自己运动的部件上(例如云台)时,关闭 Use Body State。
- 帧头的时间戳始终是取样时刻(仿真时间),不是状态的时刻。
- 状态是最近一个物理步的结果,传感器直接使用,不外推。取样时刻减去状态时刻是状态的年龄,通常不到一个物理步。
- 年龄超出 [-1e-6 s, 上限] 时,IMU 和里程计给出
Invalid Delta Time并重新开始。IMU 的上限是Max Sample Delta Seconds,里程计的是Maximum Valid Delta Seconds。位姿传感器不检查年龄。
| 节点 | 说明 |
|---|---|
Use Body State |
属性,默认 true;关闭后总是差分 |
Is Using Body State |
最新样本是否取自状态源。状态模式下为 true,包括暖机和 Invalid Delta Time 的样本;差分模式,以及刚体被驱动但还没有状态时为 false |
Get Body State Age Seconds |
最新样本的年龄,单位 s;没有用到状态时为 0 |
暖机与模式切换
Section titled “暖机与模式切换”- IMU 的第一个样本是
Warming Up,状态模式下第二个样本起有效;差分模式要前两个样本都是Warming Up。状态不带加速度时,IMU 用相邻两个状态时刻的速度变化推算,状态时刻没有前进就沿用上一次的值。 - 里程计和以前一样,第一个样本是
Warming Up。 - 相邻两个样本的模式不同(状态源出现或消失,或者改了
Use Body State),IMU 重置历史,里程计重新记录上一个样本且起点不动,这个样本是Warming Up。 - 刚体被驱动但还没有状态时(例如无人机还没有 BeginPlay),IMU 和里程计给出
Warming Up,位姿传感器给出有效位姿但没有速度。 - 噪声、偏置随机游走、低通滤波和限幅作用在真值上,两种模式是同一段代码。
与 0.1.1 的区别
Section titled “与 0.1.1 的区别”- 没有状态源时,输出与 0.1.1 相同,只有角速度例外:相邻两个样本间转角小于 2e-4 rad 时,0.1.1 把转轴错报成 X 轴,现在按真实转轴计算。
- 有状态源时,速度和加速度是状态给出的真值,不是对位姿的差分。