我的RK3588S安裝的是ubuntu 20.4,RTK硬件采用的是北天的BT-468E,其余的RTK硬件理論上來(lái)說(shuō)也是同樣可行。
一、接線
打開(kāi)開(kāi)發(fā)板的技術(shù)手冊(cè),其中有rx、tx、5v、GND

20240712095618.png
對(duì)應(yīng)著RTK技術(shù)手冊(cè)將這四根線對(duì)應(yīng)接入,其中rx、tx是交錯(cuò)連接

20240712095909.png
接線結(jié)果:

20240712100243.png
二、接通測(cè)試
RK3588S有一對(duì)UART引腳為UART7,對(duì)照著RTK技術(shù)手冊(cè)中UART引腳的波特率115200,將串口的波特率設(shè)置成一樣:
stty -F /dev/ttyS7 115200
查看串口輸出:
cat /dev/ttyS7
可以看到如下輸出就說(shuō)明連接正確了

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

20240712102209.png
三、使用RKTLIB庫(kù)進(jìn)行差分定位
1.下載RTKLIB庫(kù)
項(xiàng)目地址:https://github.com/tomojitakasu/RTKLIB
git clone https://github.com/tomojitakasu/RTKLIB.git
2.編寫(xiě)程序接入差分站進(jìn)行差分定位
由于程序涉及到一些糾紛,所以這里只貼關(guān)鍵實(shí)現(xiàn)思路的代碼,不貼完整程序
// 打開(kāi)串口
fd = open("/dev/ttyS7", O_RDWR | O_NOCTTY);
if (fd == -1) {
perror("Unable to open serial port");
return 1;
}
// 設(shè)置波特率
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é)議客戶(hù)端,并連接至基站
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是你購(gòu)買(mǎi)的差分信息服務(wù)商賬號(hào)信息,格式為:賬號(hào):密碼@基站ip:定位類(lèi)型端口/掛載點(diǎn)
// 讀取串口中的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);
}
}
}
// 另起一個(gè)線程讀取基站的差分信息并寫(xiě)入到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ù),然后會(huì)返回最近站點(diǎn)的差分信息,程序收到差分信息寫(xiě)入到rtk模塊中,rtk根據(jù)差分信息自動(dòng)進(jìn)行差分計(jì)算,最終得到厘米級(jí)的定位信息,例如下面返回,定位精度為4,代表得到rtk固定解

20240712104429.png