OpenC2X模块介绍

     openC2X 能够将发送和接收的CAM消息,DENM消息,GPS,OBD2消息存储在LDM中,可通过web界面查询相关消息的内容,在web界面显示。

      整个openC2X包含了如下模块,不同模块的之间通过通信机制进行消息发送和接收。GPS模块主要获取车辆的经纬度坐标,OBD2模块主要是获取车载的信息如速度,CAM模块主要是接收和发送CAM消息集包含周围车辆的速度、位置等各种信息,详见CAM消息中的数据组成,DENM模块主要接收和发送DENM消息,DENM消息的内容详见其数据组成。LDM模块主要存储GPS、OBD2、DENM、CAM等消息生成对应的表格,并且对http Server提供查询服务。

以CAM为例 在caservice.cc文件中的caservice类的构造函数中有如下程序:

       mReceiverFromDcc = new CommunicationReceiver("5555", "CAM", *mLogger);

       mSenderToDcc = new CommunicationSender("6666", *mLogger);

       mSenderToLdm = new CommunicationSender("8888", *mLogger);

 

       mReceiverGps = new CommunicationReceiver( "3333", "GPS", *mLogger);

       mReceiverObd2 = new CommunicationReceiver("2222", "OBD2", *mLogger);

CAM接收 DCC的 为端口5555 ,GPS的为端口3333 和OBD2的为端口2222

CAM发送 给LDM为端口8888,发送给DCC为端口6666。

通信接收器包含端口号,模块号,消息日志三个参数。

通信发送器包含端口号,消息日志两个参数

其它模块对应的类在类的构造函数中同样也生成了对应通信接收器或者发送器。不同模块之间通信遵循protobuf协议

注:Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。百度Apollo 中不同模块之间的通信同样是通过protobuf实现。

AM模块主要看caservice.cc 和caservice.h文件,整个模块的流程流程如下所示。

针对其中的部分进行重点介绍。

1)

caservice中main函数下新建了一个Caservice类,类的构造函数中创建了mThreadReceive 、mThreadGpsDataReceive、mThreadObd2DataReceive 来接收数据,总是建立新一个0.1s的定时器来不断将CAM消息的数据存入至LDM中

mTimer = new boost::asio::deadline_timer(mIoService, boost::posix_time::millisec(100));

              mTimer->async_wait(boost::bind(&CaService::alarm, this, boost::asio::placeholders::error)); //异步操作

 

2)

cam/src文件夹下的Caservice::receive函数将接收的CAM消息 转变为protobuf发送至LDM中。Caservice通过检测位置、速度、航向角,最小时间是否变化来决定是否触发generate CAM and send to LDM and DCC  ,由send()函数实现。

触发条件

位置条件//|current position - last CAM position| > 5 m

速度条件//|current speed - last CAM speed| > 1 m/s

航向角条件//|current heading (towards North) - last CAM heading| > 4 deg

时间条件//max. time interval 1s

 

3)

在读取GPS数据来确定了航向角、位置是发生变动时,

首先将GPS的数据进行锁定

mMutexLatestGps.lock();

在比较完成后将锁定解除

mMutexLatestGps.unlock();

类似的在从OBD读取速度数据时类似

mMutexLatestObd2.lock();

mMutexLatestObd2.unlock();

通过上述方式保证在读取数据进行比较时,原始数据不能变动。

mMutexLatestGps和mMutexLatestObd2是C++11标准中的std::mutex类,它是一个基本的互斥量。

lock()函数与unlock()函数是一对的,当使用lock()后一定要记得unlock()。

 

4)

CaService::~CaService()析构函数主要功能

  1)等待线程结束

       mThreadReceive->join();

       mThreadGpsDataReceive->join();

       mThreadObd2DataReceive->join();

   2)将线程删除

       delete mThreadReceive;

       delete mThreadGpsDataReceive;

       delete mThreadObd2DataReceive;

   3)将通信发送和接收器的指针删除

       delete mReceiverFromDcc;

       delete mSenderToDcc;

       delete mSenderToLdm;

 

       delete mReceiverGps;

       delete mReceiverObd2;

   4)删除日志记录相关指针

       delete mLogger;

       delete mMsgUtils;

  5)删除定时器

       mTimer->cancel();

       delete mTimer;

LDM,DENMservice类的析构函数类似,后面不在做介绍。

  • DENM模块

DENM模块主要看denservice.cc 和denservice.h文件,整个模块的流程流程如下所示。

denmservice main函数中通过构造函数建立以下几个线程,主要作用是接收GPS的数据,接收OBD的数据,接收APP触发的DENM, 在mThreadReceive线程中将DENM消息存入LDM中。

       mThreadReceive = new boost::thread(&DenService::receive, this);

       mThreadGpsDataReceive = new boost::thread(&DenService::receiveGpsData, this);

       mThreadObd2DataReceive = new boost::thread(&DenService::receiveObd2Data, this);

       mThreadAppTrigger = new boost::thread(&DenService::triggerAppDenm, this);

建立线程后由CPU进行调度。

  • LDM模块

LDM模块主要看ldm.cc 和ldm.h文件,整个模块的流程流程如下所示。

在ldm中生成的五个线程,前四个线程主要接收数据,并将生成的数据插入至对应的表格中,第五个线程mThreadServer线程是接收服务查询,根据需要查询的内容,查询对应的LDM表格,并将查询结果返回。

       openC2X 采用的是SQLite数据库,数据库存放的表格有CAM表、DENM表、GPS表、OBD2表、DccInfo 表、CamInfo表。

注:openC2X中定义的table与safespot项目中定义的表格不一致。

CAM表所包含的内容

       sqlCommand = (char*) "CREATE TABLE IF NOT EXISTS CAM(" \

                     "key INTEGER PRIMARY KEY, protocolVersion INTEGER, messageId INTEGER, stationId INTEGER, "\

                     "genDeltaTime INTEGER, stationType INTEGER, latitude INTEGER, longitude INTEGER, semiMajorConfidence INTEGER, "\

                     "semiMinorConfidence INTEGER, semiMajorOrientation INTEGER, altitude INTEGER, altitudeConfidenc INTEGER, "\

                     "type  INTEGER, heading INTEGER, headingConfidence INTEGER, speed INTEGER, speedConfidence INTEGER, driveDirection INTEGER, "\

                     "vehicleLength INTEGER, vehicleLengthConfidence INTEGER, vehicleWidth INTEGER, longitudinalAcceleration INTEGER, "\

                     "longitudinalAccelerationConfidence INTEGER, curvature INTEGER, curvatureConfidence INTEGER, curvatureCalcMode INTEGER, "\

                     "yawRate INTEGER, yawRateConfidence INTEGER, accelerationControl INTEGER, lanePosition INTEGER, steeringWheelAngle INTEGER, "\

                     "steeringWheelAngleConfidence INTEGER, lateralAcceleration INTEGER, lateralAccelerationConfidence INTEGER, verticalAcceleration INTEGER, "\

                     "verticalAccelerationConfidence INTEGER, performanceClass INTEGER, protectedZoneLatitude INTEGER, protectedZoneLongitude INTEGER, "\

                     "cendSrcTollingZoneId INTEGER);";

 

DENM表中包含的内容

       sqlCommand = (char*) "CREATE TABLE IF NOT EXISTS DENM("\

                            "key INTEGER PRIMARY KEY, protocolVersion INTEGER, messageId INTEGER, stationId INTEGER, "\

                            "sequenceNumber INTEGER, detectionTime INTEGER, referenceTime INTEGER, latitude INTEGER, longitude INTEGER, "\

                            "semiMajorConfidence INTEGER, semiMinorConfidence INTEGER, semiMajorOrientation INTEGER, altitude INTEGER, "\

                            "altitudeConfidence INTEGER, validityDuration INTEGER, stationType INTEGER);";

 

GPS表格中包含的内容

sqlCommand = (char*) "CREATE TABLE IF NOT EXISTS GPS(" \

                            "key INTEGER PRIMARY KEY, latitude DOUBLE, longitude DOUBLE, altitude DOUBLE, epx DOUBLE, epy DOUBLE, time INTEGER, online INTEGER, satellites INTEGER);";

 

OBD2表格中包含的内容

       sqlCommand = (char*) "CREATE TABLE IF NOT EXISTS OBD2(" \

                            "key INTEGER PRIMARY KEY, time INTEGER, speed DOUBLE, rpm INTEGER);";

 

DccInfo表格包含的内容

sqlCommand = (char*) "CREATE TABLE IF NOT EXISTS DccInfo(" \

                            "key INTEGER PRIMARY KEY, time INTEGER, channelLoad DOUBLE, state TEXT, AC TEXT, availableTokens INTEGER, queuedPackets INTEGER, dccMechanism INTEGER, txPower DOUBLE, tokenInterval DOUBLE, datarate DOUBLE, carrierSense DOUBLE, flushReqPackets INTEGER, flushNotReqPackets INTEGER);";

 

CamInfo表格中包含的内容

sqlCommand = (char*) "CREATE TABLE IF NOT EXISTS CamInfo(" \

                            "key INTEGER PRIMARY KEY, time INTEGER, triggerReason TEXT, delta DOUBLE);";

  • DCC模块

       DCC的全称为decentralized congestion control (分散拥塞控制),这是ETSI ITS-G5中独有的,针对由于车辆的密度变化导致的无线通信出现超负荷的现象进行处理。出现通信过负荷的情况会导致丢包情况发生,导致OBU的性能不可控。

  • GPS模块

       GPS模块是将采集实际的或者仿真的GPS数据发送给CAM模块或者DENM模块。整个GPS模块的流程图如下图所示。

  • OBD模块

OBD模块是将采集的车辆的速度等信息发送给CAM模块桌DENM模块。整个OBD模块的程序流程图如下所示。

  • 其它

  1. 在/etc/config/文件夹配置的common,gps,denm, cam等的参数,在cam/src ,caservice.h 中的loadConfig函数中定义,在其对应的caservice.cc文件中的CaService类构造函数调用,gps的配置参数在gps/src/GpsService.h 中loadConfig函数中进行了定义,其它类似。
  2. 在openC2X的gps/gpsdata文件夹下存储三组数据sample_data.csv, sample_data1.csv, sample_data2.csv ,里面存着三组不同的车辆路径数据。
  3. 在openC2X的common/buffer/文件夹下cam.proto, denm.proto  ,ldmData.proto,gps.proto 文件 通过google的protobuf编译器生成对应的*.pb.cc *.pb.h文件。
  4. 在openC2X的common/asn1/文件夹下ITS_DENM_v1.2.2.asn, ITS_CAM_V1.3.2.asn  ,its_facilities_pdu_all.asn 文件 通过ASN1 编译器生成对应的*.c *.h文件。
  5. openC2X 的采样的GPS数据文件所在目录/usr/share/openc2x/gpsdata/sample-data.csv 如果需要更改GPS数据,则首先在终端中输入sudo gedit /etc/config/openc2x_gps 修改对应的文件的路径,如下框所示

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它包含了许多用于计算机视觉和机器学习的基础算法和工具。OpenCV 是一个跨平台的库,可以运行在 Windows、Linux、Mac OS X、Android 和 iOS 等多种操作系统上。 OpenCV 的主要模块包括: 1. Core:提供基础的数据结构和算法支持,如图像处理、矩阵操作、数据结构、文件操作等。 2. imgproc:提供图像处理和分析的函数和算法,包括图像滤波、边缘检测、形态学操作、颜色空间转换等。 3. video:提供视频处理和分析的函数和算法,包括视频采集、视频压缩、运动估计、背景建模、物体跟踪等。 4. highgui:提供图形用户界面和输入输出功能的支持,包括图像显示、窗口操作、键盘鼠标事件处理、视频播放、视频录制等。 5. objdetect:提供目标检测和识别的函数和算法,包括人脸检测、行人检测、车辆检测等。 6. ml:提供机器学习算法的支持,包括分类、回归、聚类、支持向量机等。 7. features2d:提供图像特征提取和匹配的函数和算法,包括关键点检测、描述符提取、特征匹配等。 8. calib3d:提供摄像机标定和三维重建的函数和算法,包括摄像机内外参数标定、立体匹配、三维重建等。 9. stitching:提供图像拼接的函数和算法,包括图像配准、图像融合等。 以上是 OpenCV 的主要模块,每个模块都提供了丰富的函数和算法,可以应用于不同领域的计算机视觉和机器学习任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值