RK3588S Ubuntu 20.4使用rtk硬件接入差分站進行差分定位

我的RK3588S安裝的是ubuntu 20.4,RTK硬件采用的是北天的BT-468E,其余的RTK硬件理論上來說也是同樣可行。

一、接線

打開開發(fā)板的技術手冊,其中有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

按照協(xié)議可以看到GNGGA中的定位質(zhì)量為單點定位


20240712102209.png

三、使用RKTLIB庫進行差分定位

1.下載RTKLIB庫

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

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

2.編寫程序接入差分站進行差分定位

由于程序涉及到一些糾紛,所以這里只貼關鍵實現(xiàn)思路的代碼,不貼完整程序

// 打開串口
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協(xié)議客戶端,并連接至基站
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模塊定位信息,然后發(fā)送到基站
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;
}

等基站收到模塊的定位數(shù)據(jù),然后會返回最近站點的差分信息,程序收到差分信息寫入到rtk模塊中,rtk根據(jù)差分信息自動進行差分計算,最終得到厘米級的定位信息,例如下面返回,定位精度為4,代表得到rtk固定解

20240712104429.png
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容