1、VTD在仿真领域内出色的是场景渲染,动画效果非常真实。但是他不仅仅是针对场景的仿真软件同时具备动力学控制的能力。外部可以通过TCP的方式直接替换驾驶员的部分参数,从而达部分仿真。
2、VTD加载自己的动力学模型,会通过TCP发出 RDB_DRIVER_CTRL_t 来控制自己的车辆运行。第三方可以通过TCP发送RDB_DRIVER_CTRL_t,替换VTD发出的RDB_DRIVER_CTRL_t中的值,如修改加速度参数,更改驾驶员模型的控制参数实现部分仿真。
1、关闭sendInternalDriverCtrl,内部不再发送DriverCtrl的包。如果不关闭,则内部会发送RDB_DRIVER_CTRL_t的包,导致第三方发送的RDB_DRIVER_CTRL_t无法生效,无法成功替换目标控制参数。
下图是未关闭sendInternalDriverCtrl,用Rdbsniffer读取pkg id = 26的值的效果;
2、因此需要在TaskControl的parameterserver的设置中将RDB里面的sendInternalDriverCtrl设置为了false;
1、打开对应Project的ModuleManager.xml,配置任一动力学模型,确保内部的动力学模型参与车辆控制;
动力学模型一:
<DynamicsPlugin name="viTrafficDyn">
<Load lib="libModuleTrafficDyn.so" path=""/>
<Player default="true" />
<Debug enable="false" />
</DynamicsPlugin>
动力学模型二:
<DynamicsPlugin name="viTrafficDynComplex">
<Load lib="libModuleTrafficDynComplex.so" path=""/>
<Player default="true" />
<Debug enable="false"
dynInput="true"
dynOutput="true"
CSV="false"
packages="true"/>
</DynamicsPlugin>
需要注释其一动力学不生效,如:
<!--DynamicsPlugin name="viTrafficDyn">
<Load lib="libModuleTrafficDyn.so" path=""/>
<Player default="true" />
<Debug enable="false" />
</DynamicsPlugin-->
1、需要发送的RDB结构:RDB_DRIVER_CTRL_t + RDB_TRIGGER_t;
1)按照下述结构体组成RDB包,并使用TCP的方式发送:
2)下图是具体每个包的结构体:
按照上图规则,组成有字符串Byte,再发送出去,这里就不举例怎么发了,有需要的可以单独找我,不过按照这个结构体发肯定没问题;
2、使用SCP的方式更改驾驶员的控制方式,因为我们需要输入请求的加速度,因此需要在VTD界面发送SCP指令,告诉VTD使用加速度计算出踏板开度从而控制车辆,这部分工作在VTD内部完成。
<Player name=”Ego”> <Driver sendPedals=”true” /> </Player>
3、我们仔细看RDB_DRIVER_CTRL_t 结构体,会有个ValidityFlags的枚举变量,这个参数非常重要,我们通过给ValidityFlags赋不同的值,来给对应的参数置于标志位,使得参数控制有效。
4、假设RDB_DRIVER_CTRL_t需要控制车辆加速度,则validityFlags = 0x20(TGT_ACCEL) | 0x2000(ADD_ON),最终validityFlags需要发送0x2020,ADD_ON相当于替换VTD内部动力学中的TGT_ACCEL发的值;如需要控制加速度和方向盘;validityFlags = 0x20(TGT_ACCEL) | 0x40(TGT_STEEING) | 0x2000(ADD_ON),validityFlags需要发送0x2060;
总结
上述控制最重要的就是validityFlags中的ADD_ON,这个相当于替换VTD驾驶员模型发出的RDB_DRIVER_CTRL_t中请求加速度的值或者其他参数,改为由我方输入的值来控制车辆。