主要概念
正解:根据传动链的关节角度计算位置信息、旋量、姿态四位数、旋转矩阵
逆解:根据位置信息、旋量、姿态四位数、旋转矩阵计算传动链的关节角度
主要指责
下图为逆解的主要数据格式,Java端主要负责作为服务端接受客户端的报文消息,然后利用jni技术调用C++的native方法,实现计算功能后返回客户端对应的数据报文。
也就是说,
Java作为服务端接收到byte数组->转为float数字传给C++调用native方法->C++端返回float结果->将float数组转为byte数组返回给客户端
核心难点:
如何将float数组生成byte数组,如何将byte数组转成float数组
/**
* 通过float数组生成byte数组
*
* @param twist1Res
* @return byte[]
* @author lst
* @date 2022/12/22 9:44
*/
public static byte[] generateBytesArray(float[] twist1Res) {
//1个float等于4个字节
byte[] bytes = new byte[twist1Res.length * 4];
for (int i = 0; i < twist1Res.length; i++) {
byte[] newBytes = float2byte(twist1Res[i]);
System.arraycopy(newBytes, 0, bytes, i * 4, newBytes.length);
}
return bytes;
}
/**
* @param resourceBytes 原数组
* @param mySrcPos 原数组从哪里开始截取
* @param myLength 截取长度float形式
* @return float[]
* @author lst
* @date 2022/12/22 9:11
*/
private static float[] generateFloatsArray(byte[] resourceBytes, int mySrcPos, int myLength) {
//截取长度byte形式
int twist1ByteLength = myLength * 4;
byte[] twist1Byte = new byte[twist1ByteLength];
System.arraycopy(resourceBytes, mySrcPos, twist1Byte, 0, twist1ByteLength);
float[] floats = new float[myLength];
//每4个字节一个数字
for (int i = 0; i < myLength; i++) {
float key = bytes2Float(twist1Byte, 4 * i);
floats[i] = key;
}
return floats;
}