基于Ublox M9N模块的GPS经纬度移动计算技术问询
基于摇杆步进经纬度的遥控模型实现方案
1. 解析初始NMEA获取起始坐标
从你提供的$GNRMC,162254.00,A,3723.02837,N,11150.39853,W,0.820,188.36,110706,,,A*74语句中提取起始经纬度,转成十进制格式方便计算:
- 纬度(N为正):
37 + 23.02837/60 = 37.383806°,记为lat0_dec - 经度(W为负):
-(111 + 50.39853/60) = -111.839976°,记为lon0_dec
2. 摇杆绑定经纬度步进规则
直接给摇杆方向绑定经纬度增减逻辑,同时确定步进精度:
- 摇杆上推:纬度NMEA值+0.00001(如
3723.02837→3723.02838),对应十进制纬度增加0.00001/60≈0.000000167° - 摇杆下推:纬度NMEA值-0.00001
- 摇杆右推:经度NMEA值+0.00001(西经场景下,经度十进制值会变大,对应向东移动)
- 摇杆左推:经度NMEA值-0.00001
- 步进精度可调整:如果要让模型单次移动1米左右,可根据所在纬度计算对应经纬度差(纬度L处,1经度差≈111000*cos(L)米,1纬度差≈111000米)
3. 计算相对起始点的角度与距离
把当前经纬度和起始点都转成十进制后,用Haversine公式计算:
距离计算(单位:米)
import math # 起始点十进制坐标 lat0_dec = 37.383806 lon0_dec = -111.839976 # 当前点十进制坐标(示例) lat_current_dec = 37.383807 lon_current_dec = -111.839975 dLat = math.radians(lat_current_dec - lat0_dec) dLon = math.radians(lon_current_dec - lon0_dec) a = math.sin(dLat/2)**2 + math.cos(math.radians(lat0_dec)) * math.cos(math.radians(lat_current_dec)) * math.sin(dLon/2)**2 c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a)) distance = 6371000 * c # 地球半径取6371km
相对方位角计算(正北为0°,顺时针递增)
y = math.sin(dLon) * math.cos(math.radians(lat_current_dec)) x = math.cos(math.radians(lat0_dec)) * math.sin(math.radians(lat_current_dec)) - math.sin(math.radians(lat0_dec)) * math.cos(math.radians(lat_current_dec)) * math.cos(dLon) bearing = (math.degrees(math.atan2(y, x)) + 360) % 360
4. 可选:生成模拟NMEA语句输出给模型
如果模型需要接收GPS信号,把更新后的经纬度转回NMEA格式:
- 十进制转ddmm.mmmmm:比如十进制纬度37.383807° → 整数37,小数0.383807*60=23.02842 → 格式为
3723.02842,N - 经度同理处理后拼接成GNRMC语句,最后计算校验和(将$与*之间的所有字符做异或运算,结果转十六进制)
5. 硬件联动逻辑
- 用ADC读取摇杆模拟值,判断触发方向(如模拟值>阈值触发上推/右推,<阈值触发下推/左推)
- 把计算出的方位角、距离用大字体显示在屏幕上,方便视力不佳时查看
- 直接将方位角映射为模型舵机角度,距离映射为油门大小,实现自动控制
内容的提问来源于stack exchange,提问作者Camerart
相关产品推荐
相关产品推荐

