基于QGroundControl的RTK数据接收及转发

一、相关说明

  • 1.地面站:基于QGC编译的Android地面站。
  • 2.需求:RTK接入,地面站接收RTK基准站数据,然后将数据打包通过MavLink转发至飞控。
  • 3.需求目的:为无人机提供RTK高精度定位提供数据支持。
  • 4.基准站数据格式:RTCM数据流。

二、开发方案

  目前海星达RTK支持BlueToothWifi传输数据,但是 BlueTooth收到的数据并非RTCM数据流,无法满足我们的需求。经过与厂家技术开发沟通,Wifi发送的数据是RTCM流数据,那么下面开始通过TCP连接接收数据。
该RTK基准站提供IP及端口,能够支持TCP连接,通过TCP接入开发,实现了以xD3开头的RTCM数据的接收:

\xD3\x00\x16""C\x01)3\xF9""B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xDD\x84P
\xD3\x00\x16""C\xC0\x01""B\x93.\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xE4\x99k
\xD3\x00\x16""F@\x01)3\x1E\x82\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x96\x93\xC5
\xD3\x00\x15>\xE0\x01\x03z\x93 \x9F\xC9\f\x8Eyo#\x05\xC3?[|\x00\x00\xC7`3\
xD3\x00\x04HXHDP\xBC$
\xD3\x00\x06?\x00\x01\x00\x00\x00\xAF,\x98


RTCM 3.1数据格式:
在这里插入图片描述

三、数据处理关键流程分析

1.创建TCP通信类TCPLink
  该类作为TCP连接的客户端。主要任务是实现TCP通信连接,接收服务端(RTK基准站)的数据,再通过“信号-槽”机制将数据转发至MAVLinkProtocal类中的receiveBytes函数。
  TCP通信具体实现流程略,后期会发表“QT创建TCP Socket通信”的文章进行详细阐述。

2.MAVLinkProtocal接收RTCM数据的函数receiveBytes
  其中参数link表示当前的TCPLink,参数b表示RTCM数据。
(注:限于篇幅,后文均只展示关键代码,并非全部)

void MAVLinkProtocol::receiveBytes(LinkInterface* link, QByteArray b)
{
   
//...
    if (!_linkMgr->containsLink(link)) {
   
        return;
    }
    QmlObjectListModel& vehicles = *_toolbox->multiVehicleManager()->vehicles();
    //RTK Data
    if (b[0
  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
接收RTK差分基站数据并将差分数据转发到终端设备,可以使用Spring Boot框架和一些第三方库来实现。下面是一些基本步骤: 1. 确认RTK差分基站数据的格式和传输协议,例如NTRIP或者RTCM等。 2. 使用Spring Boot框架创建一个Web应用程序,用于接收差分数据。 3. 将第三方库(例如JNR-SerialComm)导入到项目中,用于连接差分基站设备并读取数据。 4. 在应用程序中编写代码,将读取到的差分数据转发到终端设备,可以使用TCP或者UDP协议。 5. 配置应用程序的端口和网络参数,确保它能够与差分基站设备和终端设备正确通信。 下面是一个简单的示例代码,可以进行参考: ```java @RestController public class RtkController { private SerialPort serialPort; // 差分基站设备连接实例 @GetMapping("/rtk") public void getRtkData() throws IOException { // 读取差分数据 InputStream inputStream = serialPort.getInputStream(); byte[] buffer = new byte[1024]; int len = inputStream.read(buffer); String data = new String(buffer, 0, len, StandardCharsets.UTF_8); // 转发数据到终端设备 DatagramSocket socket = new DatagramSocket(); InetAddress address = InetAddress.getByName("192.168.1.100"); // 终端设备IP地址 int port = 1234; // 终端设备端口号 byte[] sendData = data.getBytes(); DatagramPacket packet = new DatagramPacket(sendData, sendData.length, address, port); socket.send(packet); } @PostConstruct public void init() throws Exception { // 初始化差分基站设备连接 serialPort = SerialPort.getCommPort("/dev/ttyUSB0"); // 差分基站设备串口号 serialPort.setComPortParameters(9600, 8, 1, SerialPort.NO_PARITY); serialPort.setFlowControl(SerialPort.FLOW_CONTROL_DISABLED); serialPort.openPort(); } @PreDestroy public void destroy() { // 关闭差分基站设备连接 serialPort.closePort(); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffersonGO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值