前情提要
前期准备可以看我之前的文章
1、ros2订阅发布
2、ros2订阅发布1对n
3、ros2串口通信
报文获取
首先尝试从虚拟串口进行报文发送,在代码中设置/dev/pts/x来接收报文。之后选择虚拟机从windows向ubuntu发送报文,更加贴近实际。
在惯导接收程序中设置了g_qianxun_recv_data的变量,来接收存在recv_buf中的报文数据,并在终端打印。打印结果如下:
报文解析
报文从recv_buf中复制到g_qianxun_recv_data中,再进入proc函数中进行解析。
首先判断报文中是否含有$GPYBM,若存在,则进入ntzx_gpybm_proc程序中具体解析。若不存在,则等待报文继续发送。处理好的解析数据放在结构体g_gps_data中。
接收、解析、具体解析函数的每一次跳转都经过打印测试,流程清晰。
报文发布
发布部分,采用鱼香肉丝的发布订阅模块,通过消息发送解析好的数据。
对结构体中的数据进行操作,在回调函数中发出需要用到的结构体中的数据。
遇到的问题
1、主函数中创建两个线程
两个线程函数不能同步进行,在接收线程中,存在一个对数据接收的while(1)死循环,不知道如何跳出,进入到proc中。之后查阅资料,采用鱼香肉丝的回头函数。
回头函数可以对main中的两个线程不断的循环遍历,问题解决。
2、采用socat虚拟串口助手时,接收到的报文一直显示没有报头($GPYBM),尝试多次后,选择更换虚拟串口助手,问题解决。
3、解析报文时,设备号不能直接通过判断协议格式‘,’来得到完整数据。需要设置dev_GPYBM的变量,存储“SNxxxxxxxxxx”,之后通过提取‘,’前的数据,覆盖原来的dev_GPYBM数据才行。
4、报文发布时,借鉴的订阅发布代码不含回调函数,另找了csdn的一位博主的代码,创建了msg后添加变量。
变量未全部设置好,仅仅测试了时间数据中的一小部分。
以上测试均使用虚拟设备(前期虚拟串口,后期虚拟机),仅收取报文部分用到了RTK实物。
下一步准备在实物上完成完整循环,之后着手准备将rtk安装到小车上,通过gnss对小车进行寻迹测试。