RK3588S Ubuntu 20.4使用rtk硬件接入差分站进行差分定位
我的RK3588S安装的是ubuntu 20.4,RTK硬件采用的是北天的BT-468E,其余的RTK硬件理论上来说也是同样可行。
一、接线
打开开发板的技术手册,其中有rx、tx、5v、GND
对应着RTK技术手册将这四根线对应接入,其中rx、tx是交错连接
接线结果:
二、接通测试
RK3588S有一对UART引脚为UART7,对照着RTK技术手册中UART引脚的波特率115200,将串口的波特率设置成一样:
1
| stty -F /dev/ttyS7 115200
|
查看串口输出:
可以看到如下输出就说明连接正确了
按照协议可以看到GNGGA中的定位质量为单点定位
三、使用RKTLIB库进行差分定位
1.下载RTKLIB库
项目地址:https://github.com/tomojitakasu/RTKLIB
1
| git clone https://github.com/tomojitakasu/RTKLIB.git
|
2.编写程序接入差分站进行差分定位
由于程序涉及到一些纠纷,所以这里只贴关键实现思路的代码,不贴完整程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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);
|
1 2 3 4 5 6 7
| 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:定位类型端口/挂载点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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); } } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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固定解