跳到主要内容

Imu

数据结构

字节索引类型字段含义
0-7float64X 轴姿态四元数
8-15float64Y 轴姿态四元数
16-23float64Z 轴姿态四元数
24-31float64W 轴姿态四元数
32-39float64X 轴角速度
40-47float64Y 轴角速度
48-55float64Z 轴角速度
56-63float64X 轴线加速度
64-71float64Y 轴线加速度
72-79float64Z 轴线加速度

Imu 固定为 80 字节

示例

C++ 示例
struct Vector3 {
double x;
double y;
double z;
};

struct Quaternion {
double x;
double y;
double z;
double w;
};

struct Imu {
Quaternion orientation;
Vector3 angular_velocity;
Vector3 linear_acceleration;
};
Rust 示例
#[repr(C)]
#[derive(Clone, Copy, Debug, Default)]
pub struct Vector3 {
pub x: f64,
pub y: f64,
pub z: f64,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, Default)]
pub struct Quaternion {
pub x: f64,
pub y: f64,
pub z: f64,
pub w: f64,
}

#[repr(C)]
#[derive(Clone, Copy, Debug, Default)]
pub struct Imu {
pub orientation: Quaternion,
pub angular_velocity: Vector3,
pub linear_acceleration: Vector3,
}

const _: () = {
assert!(core::mem::size_of::<Vector3>() == 24);
assert!(core::mem::size_of::<Quaternion>() == 32);
assert!(core::mem::size_of::<Imu>() == 80);
assert!(core::mem::align_of::<Imu>() == 8);
};

Dart 示例
import 'dart:typed_data';

final class ImuView {
static const int byteLength = 80;

final ByteData data;

ImuView(ByteBuffer buffer, [int offsetInBytes = 0])
: data = ByteData.view(buffer, offsetInBytes, byteLength);

double get orientationX => data.getFloat64(0, Endian.little);
set orientationX(double value) => data.setFloat64(0, value, Endian.little);

double get orientationY => data.getFloat64(8, Endian.little);
set orientationY(double value) => data.setFloat64(8, value, Endian.little);

double get orientationZ => data.getFloat64(16, Endian.little);
set orientationZ(double value) => data.setFloat64(16, value, Endian.little);

double get orientationW => data.getFloat64(24, Endian.little);
set orientationW(double value) => data.setFloat64(24, value, Endian.little);

double get angularVelocityX => data.getFloat64(32, Endian.little);
set angularVelocityX(double value) => data.setFloat64(32, value, Endian.little);

double get angularVelocityY => data.getFloat64(40, Endian.little);
set angularVelocityY(double value) => data.setFloat64(40, value, Endian.little);

double get angularVelocityZ => data.getFloat64(48, Endian.little);
set angularVelocityZ(double value) => data.setFloat64(48, value, Endian.little);

double get linearAccelerationX => data.getFloat64(56, Endian.little);
set linearAccelerationX(double value) => data.setFloat64(56, value, Endian.little);

double get linearAccelerationY => data.getFloat64(64, Endian.little);
set linearAccelerationY(double value) => data.setFloat64(64, value, Endian.little);

double get linearAccelerationZ => data.getFloat64(72, Endian.little);
set linearAccelerationZ(double value) => data.setFloat64(72, value, Endian.little);
}

Java 示例
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.DoubleBuffer;

public final class ImuView {
public static final int BYTE_LENGTH = Double.BYTES * 10;

private final DoubleBuffer values;

public ImuView(ByteBuffer buffer, int offset) {
if (offset < 0 || offset + BYTE_LENGTH > buffer.capacity()) {
throw new IndexOutOfBoundsException("Imu payload requires 80 bytes");
}
this.values = buffer.order(ByteOrder.LITTLE_ENDIAN)
.slice(offset, BYTE_LENGTH)
.asDoubleBuffer();
}

public double orientationX() { return values.get(0); }
public void orientationX(double value) { values.put(0, value); }

public double orientationY() { return values.get(1); }
public void orientationY(double value) { values.put(1, value); }

public double orientationZ() { return values.get(2); }
public void orientationZ(double value) { values.put(2, value); }

public double orientationW() { return values.get(3); }
public void orientationW(double value) { values.put(3, value); }

public double angularVelocityX() { return values.get(4); }
public void angularVelocityX(double value) { values.put(4, value); }

public double angularVelocityY() { return values.get(5); }
public void angularVelocityY(double value) { values.put(5, value); }

public double angularVelocityZ() { return values.get(6); }
public void angularVelocityZ(double value) { values.put(6, value); }

public double linearAccelerationX() { return values.get(7); }
public void linearAccelerationX(double value) { values.put(7, value); }

public double linearAccelerationY() { return values.get(8); }
public void linearAccelerationY(double value) { values.put(8, value); }

public double linearAccelerationZ() { return values.get(9); }
public void linearAccelerationZ(double value) { values.put(9, value); }
}