【转载】VTD_RDB_TrafficLights 数据解析提取

0 前言

利用VTD作为虚拟仿真软件,并对场景中的信号灯数据进行解析提取。

关于场景的搭建可参照官方的ScenarioEditorRevM.pdf文档,本文建立在场景已搭建成功的基础上。

1 RDB总线介绍

VTD将所有的数据分类别存储至自定义的结构体中,并在RDB总线上进行传输。当要取出某种数据时,则需要连接RDB总线,对其上的数据流进行筛选,筛选出我们所需要的结构体数据,而后再进行进一步的解析。

RDB总线通过tcp连接。成功安装VTD后,在 /Develop /Communication /RDBClientSample/ 目录下找到ExampleConsole.cpp,是官方所给的RDB总线解析的源码示例。

连接RDB总线以及提取数据流的功能已经写好了,我们需要做的就是在parseRDBMessageEntry函数中筛选出我们所需要的数据所在的结构体,而后再做进一步的解析,如下所示:

void parseRDBMessageEntry( const double & simTime, const unsigned int & simFrame, RDB_MSG_ENTRY_HDR_t* entryHdr )
{
    if ( !entryHdr )
        return;
    
    int noElements = entryHdr->elementSize ? ( entryHdr->dataSize / entryHdr->elementSize ) : 0;
    
    if ( !noElements )  // some elements require special treatment
    {
        switch ( entryHdr->pkgId )
        {
            case RDB_PKG_ID_START_OF_FRAME:
                fprintf( stderr, "void parseRDBMessageEntry: got start of frame\n" );
                break;
                
            case RDB_PKG_ID_END_OF_FRAME:
                fprintf( stderr, "void parseRDBMessageEntry: got end of frame\n" );
                break;
                
            default:
                return;
                break;
        }
        return;
    }

    unsigned char ident   = 6;
    char*         dataPtr = ( char* ) entryHdr;
        
    dataPtr += entryHdr->headerSize;
        
    while ( noElements-- )
    {
        bool printedMsg = true;
            
        switch ( entryHdr->pkgId )
        {                  
            case RDB_PKG_ID_OBJECT_STATE:
                handleRDBitem( simTime, simFrame, *( ( RDB_OBJECT_STATE_t* ) dataPtr ), entryHdr->flags & RDB_PKG_FLAG_EXTENDED );
                break;
            case RDB_PKG_ID_TRAFFIC_LIGHT:
                handleTrafficLight(simTime, simFrame, *( ( RDB_TRAFFIC_LIGHT_t* ) dataPtr ), entryHdr->flags & RDB_PKG_FLAG_EXTENDED);
                break;                                       
            default:
                printedMsg = false;
                break;
        }
        dataPtr += entryHdr->elementSize;
     }
}

当要提取信号灯数据时,只需要在switch case中添加信号灯结构体对应PKG_ID的判断,并触发自己的自定义处理函数。

关于结构体以及相应的PKG_ID定义,可通过打开/Doc/RDB_HTML/下的annotated.html进行HTML导引查看,如下所示:
RDB HTML

在html中可以很直观的通过结构体名找到自己所要提取的数据所在结构体,继而按照结构体定义自定义解析函数,而后在上述parseRDBMessageEntry中添加相应PKG_ID的case判断,并触发自定义的解析函数。

2 TrafficLight结构体解读

2.1 RDB_TRAFFIC_LIGHT_t

关于信号灯的数据均在RDB_TRAFFIC_LIGHT_t中,该结构体也是我们进行数据解析的入口,其共有两个成员变量:base和ext。其中base是信号灯的基础信息(详细定义见2.1);ext为信号灯的一些扩展信息(详细定义见2.2)。

在这里插入图片描述

2.2 RDB_TRAFFIC_LIGHT_BASE_t

—— information about a traffic light (state) ——

int32_tidunique ID of the traffic light
floatstatecurrent state (normalized)
uint32_tstateMaskcurrent state mask (light mask, e.g. for gfx)

如上所示为RDB_TRAFFIC_LIGHT_BASE_t 结构体的定义,其中:

  • id为当前信号灯的id;
  • state为当前信号灯处于一段循环周期(如绿-黄-红循环变换)中的哪一阶段,简单地说,就是处于当前信号灯循环周期内的哪一时间点,其大小为0.0…1.0,可用于判断当前灯光的剩余时间;
  • stateMask为当前信号灯的灯光状态,0x100000为绿灯,0x1000000为黄灯,0x10000000为红灯。

2.3 RDB_TRAFFIC_LIGHT_EXT_t

—— extended information about a traffic light (phases, state details) ——

int32_tctrlIdID of the traffic light’s controller
floatcycleTimeduration of a complete cycle of all phases
uint16_tnoPhasesnumber of phases provided by this traffic light
uint32_tdataSizetotal size of phase data following the package

this package is followed immediately by “dataSize” bytes of data, containing “noPhases” phase information entries RDB_TRAFFIC_LIGHT_PHASE_t

如上所示为RDB_TRAFFIC_LIGHT_EXT_t结构体的定义,其中:

  • ctrId为当前信号灯的控制id,信号灯所能变换的灯光便在controller里进行定义,如:红灯-stop等,未定义的灯光不会出现在信号灯的变换次序中;
  • cycleTime为当前信号灯的循环周期时间,如13s,则当前信号灯完整变换所有定义的灯光共需13s,每隔13s进行重复变换;
  • noPhases为当前信号灯所拥有的相位数(灯光数),若只有红绿黄灯,则其值为3;
  • dataSize为该结构体后面所拥有的额外的字节数,即phase数组,其数据用来详细指示当前信号灯所拥有的灯光状态、各自的持续时间以及灯光变换顺序(ps: phase数组的顺序仅表征controller中所定义灯光的先后顺序,与灯光如何变换无关),在对其进行解析时,需要将RDB_TRAFFIC_LIGHT_t后面的数据地址给到RDB_TRAFFIC_LIGHT_PHASE_t指针,这样便可以按照RDB_TRAFFIC_LIGHT_PHASE_t结构体的定义来解析后续的数据。

2.4 RDB_TRAFFIC_LIGHT_PHASE_t

—— traffic light phase information entry ——
获取信号灯各相位的持续时间(红绿黄灯各自的持续时间)

floatdurationnormalized duration of the phase, invalid phases will have duration 0.0
uint8_ttypetype of the phase RDB_TRLIGHT_PHASE
uint8_tspare [3]spares for future use
0RDB_TRLIGHT_PHASE_OFFPHASE OFF
1RDB_TRLIGHT_PHASE_STOPPHASE STOP
2RDB_TRLIGHT_PHASE_STOP_ATTNSTOP/ATTENTION
3RDB_TRLIGHT_PHASE_GOGO
3RDB_TRLIGHT_PHASE_GO_EXCLGO EXCLUSIVELY
5RDB_TRLIGHT_PHASE_ATTNATTENTION
6RDB_TRLIGHT_PHASE_BLINKBLINK
7RDB_TRLIGHT_PHASE_UNKNOWNUNKNOWN

如上所示为RDB_TRAFFIC_LIGHT_PHASE_t结构体的定义,注意这里的数据都是静态数据,即仅是用来指示说明而用,并不会随着灯光的变化而变化。其中:

  • duration为当前灯光的持续时间,大小为0.0…1.0,与上面base.
  • state的定义类似,为当前信号灯循环周期的占比,如0.3,则当前灯光持续时间占循环周期时间的1/3;
  • type为当前的灯光种类,关于type的定义见下图;
  • spare用于未来扩充使用。

3 总结

以上便是VTD中信号灯数据的提取及解析,由此可知,若想判断当前信号灯的状态以及所剩时间需要结合当前信号灯的状态state、信号灯各相位的持续时间duration、信号灯所有相位的循环周期cycletime以及各相位的变换顺序,其中除变换顺序外的数据,都可以直接从RDB总线中取得,但是变换顺序却无法直接获取,这里只能在场景定义时就将其严格按照标准灯光变换顺序来定义,如此对数据进行一定的处理转换后,便可用于填充CSAE SPAT消息集,后续再写如何用拿到的数据填充SPAT。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 自动驾驶软件VTD的输出RDB(Road DataBase)结构是用于描述道路环境的一种数据结构。RDB是一个三维的地图数据库,包含了道路的几何形状、车道信息、车道标线、信号灯等元素,以及障碍物、交通标志和标识等物体。 在RDB结构中,首先定义了全局坐标系,用于定位整个地图中的各个元素。接着,道路被分割成小的区块,每个区块都包含了具体的几何形状,以及该区块的ID和父区块的ID等信息。每个区块内又细分为车道段(Lane Segment),车道段包含了车道的几何形状和车道标线等信息,以及连接到其他车道段的链接信息。 在车道段中,还有车道对象(Lane Object)的定义,车道对象表示车道的属性和特征,包括车道类型、车道限速、车道宽度等。此外,车道段中还包含了路口定义和信号灯的状态。 另外,RDB结构中也包含了障碍物和交通标志等物体的定义。障碍物(Obstacle)用于描述道路上的其他车辆、行人或其他动态物体,包含了位置、速度等信息。交通标志(Traffic Sign)用于描述道路上的各种标志和标识,包括停车标志、限速标志等。 总的来说,VTD的输出RDB结构是一种用于描述道路环境的数据结构,可以帮助自动驾驶软件更好地理解道路和周围环境的特征,从而做出更准确的决策和控制。 ### 回答2: 自动驾驶软件VTD的RDB(Road Data Base)输出是一种用于描述道路和交通环境的数据结构。RDB是一种基于XML的格式,由许多不同的节点组成,每个节点都代表着不同的信息。 在RDB的结构中,最高级别的节点是“RDB-Root”,它包含了整个RDB的信息。在RDB-Root下面,有两个重要的子节点:“Road”和“Connections”。 在“Road”节点下面,每个道路都有一个独立的子节点,其中包含了道路的详细信息,例如道路的ID、车道数目、限速等。此外,还有一个名为“Boundary”节点,用于描述道路的空间范围。 在“Connections”节点下面,存储着与道路连接的各种交通元素的信息。例如,“Junction”节点描述了交叉口的信息,包括交叉口的类型、位置和连接的道路等。“TrafficSign”节点描述了交通标志的信息,包括标志的类型、位置和含义等。此外,“TrafficLight”节点描述了交通信号灯的信息,包括信号灯的类型、位置和配时等。 总体而言,VTD的RDB输出结构清晰明了,每个节点都包含了特定信息的详细描述。这种结构使得自动驾驶软件能够准确地理解和解析道路和交通环境的信息,为车辆的决策和控制提供了重要的依据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值