我有一架无人机将传感器遥测数据发送到我的电脑。在我的PC上,我开发的地面站点应用程序读取此文本数据并将其解析为有用的java对象,这些对象进入用于图表,表格等的UI。
我的问题是随着我添加越来越多的状态和调试信息,来自无人机的数据格式不断发展。因此,我最终重新编写了java类以及使用Scanner
编写的关联解析器。以下是我从无人机获得的数据
{ ms 5 gy -0.14 1.32 -1.04 ac -2.40 3.24 -106.67 acfil -2.40 3.29 -107.53 ang -0.93 1.83 -2.30 rc6 1 1 1 6 1 motor 1000 1000 1000 1000 pid 1 100 0 0 -100 0 -3 0 }
{ ms 5 gy -0.14 1.32 -1.04 ac -2.12 2.96 -107.43 acfil -2.25 3.63 -107.53 ang -2.09 0.33 -17.55 rc6 1 1 1 6 1 motor 1000 1000 1000 1000 pid 1 100 0 0 -100 0 -3 0 }
{
和}
表示数据包的开始和结束。陀螺的gy
和加速度计的ac
等缩写文本告诉传感器类型,后跟每个轴的值
解析器的片段
case "ms":
if (scanner.hasNextDouble()) {
timedelta = scanner.nextDouble();
}
break;
case "gy":
if (scanner.hasNextDouble()) {
gX = scanner.nextDouble();
}
if (scanner.hasNextDouble()) {
gY = scanner.nextDouble();
}
if (scanner.hasNextDouble()) {
gZ = scanner.nextDouble();
}
break;
和域类
public static final class SensorData {
//internal
public double frame;
//time
public double timestamp, delta;
//raw gyro+accelerometer
public double gX, gY, gZ, aX, aY, aZ;
//raw receiver
public double rcRoll, rcPitch, rcYaw, rcThrottle, rcMode;
//computed filtered accelerometer + absolute angle
public double filaX, filaY, filaZ;
public double absX, absY, absZ;
//motor commands
public double motorFL, motorFR, motorRR, motorRL;
//PID
double pitchP, pitchI, pitchD;
double rollP, rollI, rollD;
double yawP, yawD;
.
.
所以我需要一个能够根据我给出的规范自动生成域类和解析器的库。
我不能在我的项目中使用二进制序列化格式。但我准备采用不同的文字格式
到目前为止,我遇到了可以生成解析器和域类的Google Protocol Buffers,我正在研究它的文本序列化格式。
Apache Thrift类似但缺乏文档。
我想知道其他替代方案是什么,或者这些东西通常如何完成。
我尝试了很多,但谷歌并没有给我确切的点击。