小学生
最后登录1970-1-1
在线时间 小时
注册时间2018-7-6
|
本帖最后由 Abner_ux47Y 于 2024-11-15 23:39 编辑
1. 系统概述
1.1 GNSS系统
[size=10.5000pt] [size=10.5000pt] GNSS(全球卫星导航系统 Global NavigaTIon Satellite System )接收器出货量将在未来十年持续增长,从 2021 年的 18 亿台增加到2031 年的 25 亿台。2023年的卫星定位市场收入录得2,620亿欧元,保持着约15%的复合年增长率,预计未来十年复合年增长率8.4%。2033年可达5,800亿欧元。
[size=10.5000pt]
对国内而言,2023年我国卫星导航与位置服务产业总体产值达到5362亿元人民币,较2022年增长7.09%。其中,包括与卫星导航技术研发和应用直接相关的芯片、器件、算法、软件、导航数据、终端设备、基础设施等在内的产业核心产值同比增长5.5%,达到1611 亿元人民币,在总体产值中占比为30.04%。由卫星导航应用和服务所衍生带动形成的关联产值同比增长 7.79%,达到3751亿元人民币,在总体产值中占比达到 69.96%。
实时动态定位(Real-Time Kinematic,简称RTK)是一种用于提高全球导航卫星系统(如GPS、GLONASS、Galileo、北斗等)定位精度的技术。RTK系统通常由两部分组成:一个基准站(Base Station)和一个或多个流动站(Rover)。基准站位于已知精确坐标的位置上,它收集卫星数据并通过无线数据链路发送到流动站。流动站使用这些数据来纠正其自己的卫星测量值,从而达到厘米级的定位精度。
通过无线通信设备接收单基站或者网络 RTK 播发的北斗/GNSS 载波相位实时动态差分数据,自主进行实时解算,提供高精度定位结果的终端设备。
1.2 OpenCAN电机控制OpenCAN是一款专为与各种CAN(Controller Area Network,控制区域网络)设备进行交互而设计的软件平台。OpenCAN提供了一个高度抽象化的C++接口,开发者无需深入了解CAN协议的具体细节,就能轻松地控制和管理CAN设备。这种抽象化的设计不仅降低了学习曲线,还提高了开发效率。OpenCAN的插件系统允许用户通过添加插件来扩展对特定设备的支持。这意味着无论开发者面对的是何种类型的CAN设备,OpenCAN都能够提供相应的支持,极大地扩展了其应用范围。OpenCAN提供了一套简洁的API,这些API经过精心设计,使得开发者能够快速上手,并且能够轻松地实现所需的功能。无论是简单的数据读取还是复杂的设备控制,OpenCAN的API都能提供必要的支持。
在高精度电机控制领域,OpenCAN平台可以通过其强大的功能和灵活的插件系统,实现对电机的精确控制和管理。精确控制:OpenCAN平台可以实现对电机的精确控制,包括速度、位置、扭矩等多个参数。这得益于其高效的数据传输和处理能力,以及对CAN协议的深度支持。实时监控:通过OpenCAN平台,开发者可以实时监控电机的运行状态,包括电流、电压、温度等关键参数。这有助于及时发现并处理潜在问题,提高系统的稳定性和可靠性。灵活配置:OpenCAN的插件系统使得开发者可以根据实际需求灵活配置电机控制参数。无论是调整控制算法还是修改通信协议,都可以通过简单的插件开发来实现。高效通信:OpenCAN平台支持高效的CAN通信协议,可以实现电机与控制器之间的快速数据传输。这有助于降低延迟,提高系统的响应速度和控制精度。
本项目基于基于野火瑞萨耀阳RA8开发板设计,野火耀阳RA8开发板是一款功能强大的开发板,基于瑞萨电子的RA系列R7FA8D1BHECBD微控制器作为主控,该微控制器基于Arm Cortex-M85内核,具有高性能和低功耗的特点。开发板上集成了丰富的外设和接口,包括USB_OTG接口、USB_UART接口、16位SDRAM、32M字节容量QSPI Flash等,百兆网口,CANFD接口,RS485接口,OLED LCD显示屏接口,满足开发者多样化的需求。通过瑞萨的代码初始化工具(如RA Smart Configurator)进行图形化配置,方便开发者快速搭建项目框架和配置底层驱动。
本设计基于OpenCAN协议驱动无刷电机,融合RTK GNSS高精度定位系统,实现高精度运控。
2 .系统总体设计
[size=10.5000pt]
[size=10.5000pt]
[size=12.0000pt]
1 是RTK模块:首先需要一个支持RTK技术的GPS接收模块。这个模块能够接收来自多个GPS北斗等卫星的信号,并通过载波相位差分技术实现高精度定位。全系统全频高精度定位定向模块和芯星通科技UM982或者司南K823。,这些模块通常具有串口(如UART、SPI等)或其他通信接口,以便与微控制器进行通信。
2 是物联网模组:基站站通过物联网模组CAT4 EG25全球通模块将测站点坐标、伪距观测值载波相位观测值、卫星跟踪状态和接收机工作状态等通过无线数据链发送给流动站,流动着接受差分数据实现固定解,实现高精度位置定位。可以解析来自第三方的千寻(如千寻位置网络)的差分数据,以提高其定位精度。千寻位置网络是一种基于CORS(连续运行参考站系统)技术的高精度位置服务网络,它通过覆盖全国的CORS基站,向用户提供实时、高精度的差分数据,从而帮助RTK接收机实现厘米级甚至毫米级的定位精度。
3 是基于OpenCAN协议高精度伺服电机
CANOPEN作为一种广泛应用于工业自动化领域的现场总线协议,通过其高效的数据传输机制和标准化的对象字典,使得设备间的通信更加简洁、可靠。本项目对于在瑞萨RA平台上集成CANOPEN功能以控制特定电机控制。
实物小车:
[size=14.0000pt]
3.软件开发
IDE基于keil+FSP
[size=12.0000pt]
[size=12.0000pt]配置时钟和外设([size=12.0000pt]IIC,CAN,[size=12.0000pt]UART用于串口通信)[size=12.0000pt],[size=12.0000pt]配置UART:在UART的配置选项中,设置波特率(如9600或更高,具体取决于RTK模块的要求)、数据位、停止位和校验位等。生成代码:
[size=12.0000pt]编写RTK解析代码[size=12.0000pt]初始化USART:在代码中初始化USART外设,以便与RTK模块进行通信。
[size=12.0000pt]接收RTK数据:通过USART中断或DMA(直接存储器访问)等方式接收RTK模块发送的数据。
[size=12.0000pt]解析RTK数据:根据RTK模块的数据协议(如NMEA 0183协议)解析接收到的数据,提取出纬度、经度、高度和精度等定位信息。
[size=12.0000pt]处理定位信息:将解析出的定位信息进行处理,如转换为特定的坐标系、进行滤波或平滑处理等。
[size=12.0000pt]发送定位信息:将处理后的定位信息通过串口、网络或其他方式发送给上位机或其他设备。
[size=12.0000pt]实现的NMEA数据解析函数。这解析GGA语句(GPS Fix Data),可以根据需要扩展以解析其他类型的NMEA语句。
[size=12.0000pt]
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- void ParseNMEA(char *nmea)
- {
- if (strncmp(nmea, "$GPGGA", 6) == 0) // 检查是否是GGA语句
- {
- char *token = strtok(nmea, ",");
- int field = 0;
- char utcTime[11];
- char latitude[10];
- char northSouth;
- char longitude[11];
- char eastWest;
- int fixQuality;
- int numSatellites;
- float hdop;
- float altitude;
- float altitudeUnits;
- float geoidHeight;
- float geoidUnits;
-
- while (token != NULL)
- {
- switch (field)
- {
- case 1: strcpy(utcTime, token); break; // UTC时间
- case 2: // 纬度
- strncpy(latitude, token, 2);
- latitude[2] = '.';
- strncpy(latitude + 3, token + 2, strlen(token) - 2);
- break;
- case 3: northSouth = *token; break; // 北/南
- case 4: // 经度
- strncpy(longitude, token, 3);
- longitude[3] = '.';
- strncpy(longitude + 4, token + 3, strlen(token) - 3);
- break;
- case 5: eastWest = *token; break; // 东/西
- case 6: fixQuality = atoi(token); break; // 定位质量
- case 7: numSatellites = atoi(token); break; // 使用卫星数量
- case 8: hdop = atof(token); break; // 水平精度稀释
- case 9: altitude = atof(token); break; // 海拔高度
- case 10: altitudeUnits = atof(token); break; // 海拔单位(一般为米)
- case 11: geoidHeight = atof(token); break; // 大地水准面高度
- case 12: geoidUnits = atof(token); break; // 大地水准面高度单位(一般为米)
- }
- token = strtok(NULL, ",");
- field++;
- }
-
- // 打印解析结果
- printf("UTC Time: %s\n", utcTime);
- printf("Latitude: %s %c\n", latitude, northSouth);
- printf("Longitude: %s %c\n", longitude, eastWest);
- printf("Fix Quality: %d\n", fixQuality);
- printf("Number of Satellites: %d\n", numSatellites);
- printf("HDOP: %.2f\n", hdop);
- printf("Altitude: %.2f %c\n", altitude, (altitudeUnits == 1.0 ? 'm' : 'f')); // 假设单位是米或英尺
- printf("Geoid Height: %.2f %c\n", geoidHeight, (geoidUnits == 1.0 ? 'm' : 'f'));
- }
- }
复制代码
系统成功实现固定解:
[size=12.0000pt]
[size=12.0000pt]高精度定位数据
OpenCAN电机驱动设计 实现RTK位置高精度闭环控制
发送控制指令:RA8开发板通过发送SDO(服务数据对象)报文或配置好的PDO来设置电机的目标速度或位置。
读取状态信息:RA8开发板通过读取相应的PDO来获取电机的实时状态信息,如当前速度、当前位置等。
算法控制:根据应用需求,在RA8开发板实现相应的控制算法(PID控制算法),根据反馈的状态信息调整控制指令,以实现精确位置的电机控制。
成果展示:
https://www.bilibili.com/video/BV1uRmZYuE8h/
|
|