L76X 精准定位

来自Waveshare Wiki
跳转至: 导航搜索

软件准备

获取经纬度等位置信息

由于 GPS 室内搜星不稳定,请将模块或者天线放到阳台或窗户旁,或者直接在户外进行实验。 插上GPS天线,并将接收器标签面朝下置于空旷的室外,在正常情况下(户外,天气良好,没有大型建筑遮挡)上电需要等待约1分钟才能接收到定位信号;如果天气条件不好,可能需要更长的定位时间,甚至无法定位

配置串口

sudo raspi-config
选择Interfacing Options -> Serial,关闭shell访问,打开硬件串口
L76X GPS Module rpi serial.png

树莓派5/2B/zero,用户串口设备号为ttyAMA0;可以用以下命令行确认,serial0为选用的串口设备号,例如下图这样的是ttyS0为串口:

ls -l /dev/serial*

RM500U-serial.png

  • 打开NEMA获取详细信息
sudo minicom -D /dev/ttyS0
  • 单位转换
ddmm.mm--> dd.mm.ss: 度数不变,分数*100/60 ;如2232.448620--> 22.(32448620*100/60)= 22.54081033


示例程序

  • 库安装
sudo rm /usr/lib/python3.11/EXTERNALLY-MANAGED
sudo rm /usr/lib/python3.12/EXTERNALLY-MANAGED
sudo rm /usr/lib/python3.13/EXTERNALLY-MANAGED
 pip3 install pyserial
 pip3 install pynmea2
 pip3 install pynmeagps
  • 下载和运行程序
 wget https://www.waveshare.net/w/upload/a/a5/LXXX-GNSS.zip
 python3 LXXX-GNSS.py

SIMXXX longitude,latitude.png

114.0832857092161,22.53842762954979
  • 示例代码

from socket import socket
import sys
import re
import pynmea2
import serial
import chardet
import time
import math
import json

x_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626  # π
a = 6378245.0  # Semi-major axis
ee = 0.00669342162296594323  # Eccentricity squared

def _transformlng(longitude, latitude):
    ret = 300.0 + longitude + 2.0 * latitude + 0.1 * longitude * longitude + \
          0.1 * longitude * latitude + 0.1 * math.sqrt(math.fabs(longitude))
    ret += (20.0 * math.sin(6.0 * longitude * pi) + 20.0 *
            math.sin(2.0 * longitude * pi)) * 2.0 / 3.0
    ret += (20.0 * math.sin(longitude * pi) + 40.0 *
            math.sin(longitude / 3.0 * pi)) * 2.0 / 3.0
    ret += (150.0 * math.sin(longitude / 12.0 * pi) + 300.0 *
            math.sin(longitude / 30.0 * pi)) * 2.0 / 3.0
    return ret

def _transformlat(longitude, latitude):
    ret = -100.0 + 2.0 * longitude + 3.0 * latitude + 0.2 * latitude * latitude + \
          0.1 * longitude * latitude + 0.2 * math.sqrt(math.fabs(longitude))
    ret += (20.0 * math.sin(6.0 * longitude * pi) + 20.0 *
            math.sin(2.0 * longitude * pi)) * 2.0 / 3.0
    ret += (20.0 * math.sin(latitude * pi) + 40.0 *
            math.sin(latitude / 3.0 * pi)) * 2.0 / 3.0
    ret += (160.0 * math.sin(latitude / 12.0 * pi) + 320 *
            math.sin(latitude * pi / 30.0)) * 2.0 / 3.0
    return ret

def loop():
    ser1 = serial.Serial("/dev/ttyS0", 9600)
    print("ttyDEV Open!!!")
    while True:
        line = str(ser1.readline(), encoding='utf-8')
        if line.startswith("$GNRMC"):
            rmc = pynmea2.parse(line)
            if re.match("^\d+?\.\d+?$", rmc.lat) is not None:
                print(rmc)
                latitude = rmc.latitude
                longitude = rmc.longitude
                
                # ''' SIM820X uses the gcj_02 coordinate system, no coordinate conversion is required
                print("longitude,latitude")  # longitude,latitude
                print(f"{longitude},{latitude}")  # 经度,纬度
                time.sleep(2)

def destroy():
    ser1.close()
    print("ttydev Close!!!")

try:
    loop()
except KeyboardInterrupt:
    destroy()


运行示例程序程序后生成的坐标复制到高德地图API

sudo apt install python3-venv
python3 -m venv myenv &&source myenv/bin/activate
source myenv/bin/activate


我的位置

在世界贸易贸易广场的南侧窗边定位,定位和小编所在位置有1-2米的误差;不同的测试环境和转换算法,可能误差有所差异。
SIMXXX gaode.png

更多相关教程