• 自动驾驶仿真:如何通过TCP方式进行VTD驾驶员仿真



    前言

    1、VTD在仿真领域内出色的是场景渲染,动画效果非常真实。但是他不仅仅是针对场景的仿真软件同时具备动力学控制的能力。外部可以通过TCP的方式直接替换驾驶员的部分参数,从而达部分仿真。

    2、VTD加载自己的动力学模型,会通过TCP发出 RDB_DRIVER_CTRL_t 来控制自己的车辆运行。第三方可以通过TCP发送RDB_DRIVER_CTRL_t,替换VTD发出的RDB_DRIVER_CTRL_t中的值,如修改加速度参数,更改驾驶员模型的控制参数实现部分仿真。


    一、配置sendInternalDriverCtrl

    1、关闭sendInternalDriverCtrl,内部不再发送DriverCtrl的包。如果不关闭,则内部会发送RDB_DRIVER_CTRL_t的包,导致第三方发送的RDB_DRIVER_CTRL_t无法生效,无法成功替换目标控制参数。

    下图是未关闭sendInternalDriverCtrl,用Rdbsniffer读取pkg id = 26的值的效果;
    在这里插入图片描述

    2、因此需要在TaskControl的parameterserver的设置中将RDB里面的sendInternalDriverCtrl设置为了false;
    在这里插入图片描述

    二、配置ModuleManager动力学模型

    1、打开对应Project的ModuleManager.xml,配置任一动力学模型,确保内部的动力学模型参与车辆控制;
    动力学模型一:

    <DynamicsPlugin name="viTrafficDyn">
        <Load     lib="libModuleTrafficDyn.so" path=""/>
        <Player   default="true" />
        <Debug    enable="false" />
    </DynamicsPlugin>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    动力学模型二:

    <DynamicsPlugin name="viTrafficDynComplex">
        <Load     lib="libModuleTrafficDynComplex.so" path=""/>
        <Player   default="true" />
        <Debug    enable="false"
                  dynInput="true"
                  dynOutput="true"
                  CSV="false"
                  packages="true"/>
    </DynamicsPlugin>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    需要注释其一动力学不生效,如:

    <!--DynamicsPlugin name="viTrafficDyn">
        <Load     lib="libModuleTrafficDyn.so" path=""/>
        <Player   default="true" />
        <Debug    enable="false" />
    </DynamicsPlugin-->
    
    • 1
    • 2
    • 3
    • 4
    • 5

    三、外部输入请求加速度案例

    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>
    
    • 1

    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中请求加速度的值或者其他参数,改为由我方输入的值来控制车辆。

  • 相关阅读:
    pandas实现列转行
    MySQL 教程 2.4
    Part7:Pandas 的SettingWithCopyWarning 报警复现、原因、解决方案
    Ruoyi从mysql切换到postgresql的几个坑
    用了10年开源工具,换了Smartbi后,3分钟搞定一份报表
    OpenPose - Pytorch版用于人体姿态检测、关键点提取、摔倒检测
    java毕业设计基于网络平台个人博客系统Mybatis+系统+数据库+调试部署
    原数据治理平台业务架构图V1.1
    ClickHouse 复制粘贴多行sql语句报错
    AutoSAR EcuM系列03- Flex EcuM的状态管理
  • 原文地址:https://blog.csdn.net/zataji/article/details/125458475