跳转到内容

读取刚体状态

需要:uBotSensor 0.1.x(含依赖 uBotCore)

位姿、里程计和 IMU 在机体有刚体状态源(Body State Source)时直接读它给出的速度和加速度,不再对位姿做差分,这一行为从 uBotSensor 0.1.2 起提供。

刚体状态源由插件在 C++ 里实现:无人机的 Movement 组件是一个(见无人机的刚体状态),物理后端的绑定也是。蓝图里不用做任何事,传感器自己判断。

传感器 状态模式下从状态读 仍取自组件变换
位姿传感器 线速度、角速度,从第一个样本起就有 位置、姿态
里程计 本地坐标系下的线速度和角速度 相对起点的位姿、协方差
IMU 传感器 姿态、角速度、比力,三者属于同一时刻 瞬移判断、样本间隔判断

每个样本都重新判断,状态源可以随时出现或消失:

  1. 从传感器沿附着链向上,找最近的、被某个状态源驱动的刚体。里程计从被跟踪的组件开始找。
  2. 找到了,并且传感器的 Use Body State 开着(默认开),就是状态模式;否则是差分模式。位姿传感器还要求 Reference Frame 是 World。
  3. 差分模式与 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
  • IMU 的第一个样本是 Warming Up,状态模式下第二个样本起有效;差分模式要前两个样本都是 Warming Up。状态不带加速度时,IMU 用相邻两个状态时刻的速度变化推算,状态时刻没有前进就沿用上一次的值。
  • 里程计和以前一样,第一个样本是 Warming Up。
  • 相邻两个样本的模式不同(状态源出现或消失,或者改了 Use Body State),IMU 重置历史,里程计重新记录上一个样本且起点不动,这个样本是 Warming Up。
  • 刚体被驱动但还没有状态时(例如无人机还没有 BeginPlay),IMU 和里程计给出 Warming Up,位姿传感器给出有效位姿但没有速度。
  • 噪声、偏置随机游走、低通滤波和限幅作用在真值上,两种模式是同一段代码。
  • 没有状态源时,输出与 0.1.1 相同,只有角速度例外:相邻两个样本间转角小于 2e-4 rad 时,0.1.1 把转轴错报成 X 轴,现在按真实转轴计算。
  • 有状态源时,速度和加速度是状态给出的真值,不是对位姿的差分。