美文网首页
RK3588S Ubuntu 20.4使用rtk硬件接入差分站进

RK3588S Ubuntu 20.4使用rtk硬件接入差分站进

作者: 最小栗子 | 来源:发表于2024-07-11 10:50 被阅读0次

    我的RK3588S安装的是ubuntu 20.4,RTK硬件采用的是北天的BT-468E,其余的RTK硬件理论上来说也是同样可行。

    一、接线

    打开开发板的技术手册,其中有rx、tx、5v、GND


    20240712095618.png

    对应着RTK技术手册将这四根线对应接入,其中rx、tx是交错连接


    20240712095909.png

    接线结果:


    20240712100243.png

    二、接通测试

    RK3588S有一对UART引脚为UART7,对照着RTK技术手册中UART引脚的波特率115200,将串口的波特率设置成一样:

    stty -F /dev/ttyS7 115200
    

    查看串口输出:

    cat /dev/ttyS7
    

    可以看到如下输出就说明连接正确了


    20240712101626.png

    按照协议可以看到GNGGA中的定位质量为单点定位


    20240712102209.png

    三、使用RKTLIB库进行差分定位

    1.下载RTKLIB库

    项目地址:https://github.com/tomojitakasu/RTKLIB

    git clone https://github.com/tomojitakasu/RTKLIB.git
    

    2.编写程序接入差分站进行差分定位

    由于程序涉及到一些纠纷,所以这里只贴关键实现思路的代码,不贴完整程序

    // 打开串口
    fd = open("/dev/ttyS7", O_RDWR | O_NOCTTY);
    if (fd == -1) {
        perror("Unable to open serial port");
        return 1;
    }
    // 设置波特率
    speed_t baud_rate = B115200;
    struct termios options;
    tcgetattr(fd, &options);
    cfsetispeed(&options, baud_rate);
    cfsetospeed(&options, baud_rate);
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;
    options.c_cc[VMIN] = 1;
    options.c_cc[VTIME] = 0;
    tcsetattr(fd, TCSANOW, &options);
    
    // 初始化ntrip协议客户端,并连接至基站
    strinit(&monistr);
    
    if(!stropen(&monistr, STR_NTRIPCLI, STR_MODE_RW, "cpef2895:yd148444@120.253.239.161:8002/RTCM33_GRCEJ")){
        printf("connet fail...\n");
        return 0;
    }
    

    这里的cpef2895:yd148444@120.253.239.161:8002/RTCM33_GRCEJ是你购买的差分信息服务商账号信息,格式为:账号:密码@基站ip:定位类型端口/挂载点

    // 读取串口中的rtk模块定位信息,然后发送到基站
    char buffer[255];
    const char *gga = "GGA";
    while(1) {
        int nbytes = read(fd, buffer, sizeof(buffer));
        if (nbytes > 0) {
            buffer[nbytes] = '\0';
            if(strstr(buffer, gga) != NULL){
                printf("%s\n", buffer);
                if(!strwrite(&monistr, buffer, sizeof(buffer))){
                    printf("strwrite fail!\n");
                    }
                    sleepms(1000);
                }
            }
        }
    
    // 另起一个线程读取基站的差分信息并写入到rtk模块中
    int fd;
    void* threadRead(void* arg) {
        int n;
        static unsigned char buff[16384];
        printf("create read thread\n");
        while (1)
        {
            if (fd == -1)
            {
                sleepms(500);
                continue;
            }
            n=strread(&monistr,buff,sizeof(buff));
            if (n > 0)
            {
                printf("read size: %d\n", n);
                write(fd, buff, sizeof(buff));
                memset(buff,0,sizeof(buff));
                sleepms(1000);
            }
        }
        return NULL;
    }
    

    等基站收到模块的定位数据,然后会返回最近站点的差分信息,程序收到差分信息写入到rtk模块中,rtk根据差分信息自动进行差分计算,最终得到厘米级的定位信息,例如下面返回,定位精度为4,代表得到rtk固定解

    20240712104429.png

    相关文章

      网友评论

          本文标题:RK3588S Ubuntu 20.4使用rtk硬件接入差分站进

          本文链接:https://www.haomeiwen.com/subject/hxqxhjtx.html