1. 庞大时间节点分析,可以在程序中加入log书写程序来进行编写,将数据到出到文件,通过excel进行分析。

log编写的方法:

编写C++的容器(不断写入容器,再关闭时候一次放入)
双线程的log(一面主线程工作,一面线程用来记录log)
log的编写思想

  1. AG215S的通信可以用作全双工通信,双线程通信时候发生堵塞。

    解决过程:将整个通信的程序做成半双工的主从机应答程序,在解决时候发现主机总会堵塞,从机没有问题,主机是发送线程开启在前无延迟,从机是接收线程开启再后中间有延迟函数,由此判断可能是延迟的问题。
    结论: 将两个接收线程开启之间添入延时函数,这样才不会堵塞,必须错时开启。

  2. 两台设备如果服务开启失败,AG18的license过期了。
    解决方案:沟通移远的工程师要一个,用QFlash进行烧录。

  3. 三个线程一个线程tcp发送,一个线程加锁从tcp接收线程copy数据,一个线程tcp读取,测试过程中总会出现一些丢包的情况。
    解决过程是将代码进行分块测试,发现加锁的逻辑代码并不会造成丢包,各个线程挨个屏蔽测试发现并无影响,最后在第三个线程中发现从v2v的接收函数和tcp的发送放入一个线程会造成丢包的情况。
    ​ 解决方法:将v2v和tcp四个收发部分进行分为四个线程。

  4. 将整个v2v的东西做成传输的黑盒,20ms的tcp进入黑盒,tcp发出去,经过测试v2v在4ms的周期具有最短的传输延迟,数据在经过ROS端设备到v2v的一条,从v2v另一端出来是5条数据,用结构体进行解析这个缓冲区char类型的数据,经过判别id后发出去,保证是一条数据,但是ROS端设备接收数据发现总有相同的数据被接受到。
    解决过程:使用正常数据经过测试发现判别逻辑没有问题,测试发现ROS端设备程序的数据结构体占240字节,在v2v的结构体将ROS::time用uint64_t进行替换后,测试为248字节,而且id信息是结构体的第三位,所以怀疑是数据ID解析出现问题。
    解决方法:将ROS端程序数据结构体的ID放到第一位,并且在v2v端数据传输时候将char类型数据强制转换为int类型,使用指针指向地址提取ID信息来解析,之后判别后发出程序。

  5. 实际测试过程中发现在传输字节数不变的情况下,传输间隔减小,小到超过了一个传输最优的界限时候,传输的延迟会增大。这大概率是系统频繁调度造成的一个延迟增大,还有可能是无线传输需要建立连接,短时间内的建立连接次数增大导致了时间增多。