提示:主要介绍使用的是Carsim、Veristand、NI-Veristand 三个软件联合仿真,为了更好的展现内容,这里先讲NI-Veristand和VTD的联合仿真,其实就是传感器模型、驾驶员模型与实时系统之间的交互,这里先脱离动力控制系统做场景及传感器仿真的叙述。
文章目录
前言一、NI实时系统1、制作NI Custom Device对VTD RDB包的收发3、接收并转发VTD发送来的传感器数据包4、使用CAN卡发送报文给对应的控制器:5、使用Veristand的Stimulus Profile Edito功能控制逻辑;二、如何组包并发送给VTD?1、组包方式一2、Trigger包的Labview发送方法2、RDB_DRIVER_CTRL_t的拆包3、RDB_SENSOR_OBJECT_t的组包5、RDB_CONTACT_POINT_t的拆包三、如何设置VTD的通讯参数?1、VTD的配置参数四、NI如何拆收到VTD的包?1、拆包代码2、拆包规则五、总结前言
提示:下图为Casim、Veritand、VTD之间的关系,彼此都在做什么事情:
下图为整个HIL的台架方案:
这里需要特别注意的是动力学软件Carsim不做车辆方向盘控制,因为场景用的VTD的,所以必须由VTD的驾驶员去判断走向,动力学无法判断车辆的方向。
提示:这里讲的是NI和VTD之间的交互。
一、NI实时系统
硬件:NI-PXle8880-2F18CD99
软件:Veristand、Labview
责任项细分:
1、制作NI Custom Device对VTD RDB包的收发
NI Custom Device主要通过接收和发送下列的包来与VTD进行联合仿真,NI和VTD之间的通讯是通过TCP方式进行的,协议是VTD定义的RDB格式,下面会讲到;
1)RDB_DRIVER_CTRL_t,PKG ID = 26
此包为VTD的驾驶员模型参数,主要有节气门开度,制动踏板,请求加速度,请求速度,请求方向盘角度等参数,
VTD将这些请求参数给到Carsim,Carsim会响应真实的Postion、Yaw、Roll、Pitch(Carsim的动力学比较专业)等参数用来控制VTD中车辆的运动。相当于VTD只做了控制的请求,Carsim执行VTD的请求。
2)RDB_OBJECT_CFG_t,PKG ID = 9
Carsim会响应真实的Postion、Yaw、Roll、Pitch,则需要通过这个包将这些参数转发到VTD从而控制车辆。
3)RDB_TRIGGER_t, PKG ID = 25
当VTD收到一帧trigger,则渲染一帧画面,这个包是必须要发的。
3、接收并转发VTD发送来的传感器数据包
制作Custom device用于VTD中传感器模型的数据接收:
1)接收由VTD发送过来的传感器数据(上图红色箭头),并通过NI的CAN卡或者以太网卡将数据转发到对应的控制器等需要仿真的节点。
4、使用CAN卡发送报文给对应的控制器:
1)假设收到VTD发送过来的超声波参数,我们在NI-Veristand可以做比例变化,再以报文形式将数据通过CAN卡转发到对应的控制器等需要仿真的节点;
5、使用Veristand的Stimulus Profile Edito功能控制逻辑;
假设你想写一个逻辑,你就可以通过方式给自己的信号进行逻辑运算,非常方便。
二、如何组包并发送给VTD?
1、组包方式一
VTD的通讯组包方式有两种:
1、一个包一个整包 ,下图是发送了两个整包。整包就是拥有完整包头、起始帧、子包头、子包体、结束帧的结构。
2、多个包一个整包
2、Trigger包的Labview发送方法
1)当VTD收到trigger后会进行画面的渲染,相当于触发命令,循环发送Trigger时间假设为10ms,那VTD的画面就是10ms渲染一帧;
2)我们可以通过结构体,判断这个trigger有多少个字节,bytes=24+16+16+12+16 = 84,trigger包的数据结构严格按照下列结构排序;
4)在NI-Labview中按照自己的方式去组包(实际的交互是通过Veristand的Custom device去完成的,而Custom device是使用Labview生成的,暂不介绍Veristand生成CD的方法,如果有需要可以找我,或者网上找资料),下述写的组包案例,可以参考一下,反正能正常组包就行了,不一定需要按照下面的方法,(先建立TCP连接,再写入字符串);
以上大家参考一下。
注意:simtime和frameNo值每帧都在变化;
1)frameNo每帧需要+1,我这里的时间是0.043s加1;
2)simtime = deltatime(0.043) * frameNo;
2、RDB_DRIVER_CTRL_t的拆包
如何拆包,是根据RDB协议去实行的。
3、RDB_SENSOR_OBJECT_t的组包
5、RDB_CONTACT_POINT_t的拆包
三、如何设置VTD的通讯参数?
1、VTD的配置参数
1)点击左侧红框中的设置按钮,在弹出的界面中先在下拉框中选择PROJECT进行设置;
2)为确保VTD在该台架下正常运行,RDB–composeSingleMessage设为True、Sunc–source选择RDB(即VTD通过RDB接收外部Trigger进行触发)、Sync–frameTimeMs/idleFrameTimeMs 设置为10ms与NI中CD的设置值保持一致,点击保存或另存为;
3)在红框中的下拉框中选择Setup继续配置,其各参数需与Projects中保持一致。
四、NI如何拆收到VTD的包?
1、拆包代码
1)先建立TCP连接,读取相应MSG包的Datasize,将后面的子包和PKG ID拆成二维数组,随后再通过PKG ID去找到自己的包和内容;
如下图所示,解出PKG ID 和 PKG ID 对应的内容:
2、拆包规则
每个子包的组包规则RDB_ENTRY_HDR_t+RDB_PKG_t,具体的数据结构可以查表,这里不做详细的解说,跟上述拆包规则一样,按照图3的规则;
五、总结
综上,完成NI与VTD之间的通讯教程,简单的组包和拆包规则,需要有一定的Labview编程基础,另外Custom device的制作也有一点点难度,后续会将Veristand上的操作教程,不懂的大家可以互相交流。