现在开一个新坑,后面慢慢填~
2022-07-23更新:测试视频 NTRIP_ROS测试
一、前言
首先,什么RTK呀、NTRIP呀,RTKLIB呀,我都还是新手不是很懂,所以可能会有搞错的地方,望包涵~(什么?你也不懂,那就上百度必应一下吧~)
之前在跑GVINS的时候,发现曹博(就是GVINS作者)写的 ublox_driver 不仅可以解析ZED-F9P模块的 UBX-RXM-RAWX 、 UBX-RXM-SFRBX 、 UBX-NAV-PVT 数据 (废话~因为GVINS要用呀~),还可以接收RTCM数据以实现RTK,于是想利用它配合F9P实现实时的RTK,可以作为算法的参考。
不过呢, ublox_driver 中获取RTK的方式也存在一些问题,就是它只能使用免费、免认证、无需提供GGA语句的NTRIP server(NTRIP caster),而需要认证,也就是要用户名和密码、需要提供GGA语句的NTRIP server就不行了,比如说我在用的千寻位置就是这种。具体原因是这样的:
1)ublox_driver 的readme告诉我们,在 ublox_driver 中可以指定一个TCP端口,利用这个端口接收RTCM 数据流;
2)这个RTCM数据流是通过RTKLIB从NTRIP server那里获取的,具体来说就是利用了RTKLIB里面的 str2str 这个小程序拿到了RTCM数据(可以简单理解为差分修正数据),然后通过指定的TCP端口发送给ublox_driver,然后ublox_driver利用RTCM数据拿到RTK解,具体可以看 ublox_driver 里面写的很详细;
3)str2str 通过指定NTRIP caster 域名、端口号、挂载点(也就是in),再指定将数据输出到指定的TCP端口(也就是out),比如说 ublox_driver 给出的格式(具体的的格式说明得参考RTKLIB的使用手册):
./str2str -in ntrip://${NTRIP_SITE}:${NTRIP_PORT}/${MOUNT_POINT} -out tcpsvr://:3503
其实问题就出现在上面的第三点。
这里如果使用的是免费、无需认证的NTRIP caster(比如说我试过的 rtk2go.com:2101,挂载点选择的杭州的 )那么上述方法似乎好像是可以使用的,但是在我这里始终没有收敛到固定解,一直是浮点解。
(PS: 上面这种情况我猜测是因为我没有将GGA 语句发送给NTRIP caster)
当我尝试使用付费的NTRIP caster(比如千寻位置,因为我买了)时,在上述操作的基础上添加了用户名和密码,但是不行。于是查了好久,才发现千寻不仅需要认证,而且需要你的GGA语句,而 str2str 其实是可以生成并发送GGA语句的,只需要提供一个给定的经纬高即可。具体可以看我在github上提的 issue 9 。
但是,问题又来了,运行 str2str 的时候输入的是一个固定的经纬高,如果我移动了呢?我总不能又Ctrl + C把 str2str 停掉,然后再输入一个新的当前位置吧?也就是说用 str2str 这种方式在移动过程中可能会不能用(当然,也有可能是我打开方式不对)。
于是,一个简单的想法来了:既然我们可以通过 ublox_driver 的PVT 消息获取当前的经纬高,然后再给到 str2str 不就行了?很遗憾,我不会~可能得改 str2str 部分的源码吧。
那么,既然 str2str 不会搞,我们自己搞一个获取RTCM差分修正数据的程序行不行?那当然可以的啦~于是开始到万能的 github 上找,不过没找到完全合适的,于是就参考着别人的代码来改。
这几个月挺忙,经过断断续续的努力,反反复复的测试,最终搞出了一个 beta 版的小程序,已经放到 github 上面了,可供参考~
小程序链接: NTRIP_ROS
或者直接上镜像站: NTRIP_ROS(镜像站)
(PS: 没有木弟子的时候也可以考虑上github的镜像站哦~只需要把前面的域名换掉就行)
二、NTRIP_ROS
这个小程序主要是配合曹博的 ublox_driver 使用哒~大概是这么一个机制:
1)从 ublox_driver 获取PVT消息(订阅pvt topic),然后转成GGA语句;
2)利用用户名、密码、GGA语句向NTRIP caster发送请求,然后从response中拿到RTCM数据;
3)再将收到的RTCM数据发送给Ublox F9P模块的UART2(因为UART1已经被 ublox_driver 用掉啦);
4)等到pvt topic 的 carr_soln 变为2的时候,说明差分已经收敛了,这时候pvt topic里面的就是RTK定位结果啦。
当然,为了实时运行,除了F9P模块本身以外,还需要一个4G模块用来实时联网。
更具体的教程直接看我 Github 上面写的 NTRIP_ROS(镜像站)吧,有空了再搬到这里来。
(写的比较随性~仅供参考)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)