我正在开发一个Java程序,它将通过网络传输实体状态PDU,以便在网络模拟中使用。我正在使用open-DIS库帮助完成这项工作。
目前,当我运行程序时,我有一些实体在一个模拟上运行,并希望通过让第二个模拟接收第一个模拟发送的PDU来在其他模拟中显示它们,并代表它们以图形方式包含的信息。
就目前而言,我能够在第二次模拟中看到第一次模拟中的所有实体,但是当前第一次模拟中的任何实体移动时,尽管我看到那些相同的实体朝着他们的方向移动应该在第二次模拟中,它们保持与原来相同的方向......即它们不会转向面向它们现在移动的方向。
我知道open-DIS库有一个'Orientation'类,setPhi
,setPsi
&我需要设置setTheta
方法来设置它们应该面对的方向/角度,但我不确定的是我如何计算出给出这些方法的值...是否有库可用,提供获得这些值的数学方法,或者这是我必须自己写的东西?
修改
我已经尝试将以下行添加到我的EntitStateFormatter.java
类(这是创建将要发送到第二个模拟的PDU的类,已获取从接收到的PDU中的数据第一次模拟):
orientation.setPhi((float) (entity.getLocation().getAzimuth()));
orientation.setPsi((float) (entity.getLocation().getElevation()));
orientation.setTheta((float) (entity.getLocation().getTilt()));
'orientation'是一个'Orientation'变量(edu.nps.moves.dis.Orientation
),我用该行创建了它:
Orientation orientation = new Orientation();
'entity'是一个'Entity'变量(Entity是我程序中的另一个类),我已经使用该行传递了该方法的参数:
public static EntityStatePdu createPdu(Entity entity){...
但由于某种原因,在运行我的程序时,虽然我可以看到在第二次模拟中显示的第一次模拟中创建的实体,但是当在地形上移动时(按照第一次模拟时的命令),第二,他们不转向面向他们移动的方向,他们只是向那个方向移动(即车辆侧向移动等)。
运行我的程序时,我打开一个控制台窗口,显示一些调试 - 一次又一次,抛出一条消息说:
INTERNAL ERROR:java.lang.ArrayIndexOutOfBoundsException:154
我不知道为什么会这样 - 特别是因为我在EntityStateFormatter.java类中实际上没有任何数组......
有人有什么想法吗?提前谢谢!
答案 0 :(得分:0)
phi / psi / theta是欧拉角。现在,您应该能够在PDU的方向部分设置用于每个实体的2个或3个角度(取决于您是否需要滚动),然后在接收端使用关联 getter,不考虑你自己与DIS的角度的正确性(这仅在你的PDU被第三方仿真组件使用时才有意义,但你应该首先进行内部数据交换)。例如(伪代码),
// sender:
pdu.orientation.setPhi(entity.heading)
pdu.orientation.setPsi(entity.pitch)
pdu.orientation.setTheta(entity.roll)
// receiver:
entity.heading = pdu.orientation.getPhi()
entity.pitch = pdu.orientation.getPsi()
entity.roll = pdu.orientation.getTheta()
一旦你证明上面的方法有效,你就可以弄清楚如何将角度转换为phi,psi和theta。查看维基百科上的Euler Angles页面,它包含许多转换公式,您需要确定的是您使用的实体中所讨论的哪个定向系统。