L76X 精准定位
来自Waveshare Wiki
软件准备
获取经纬度等位置信息
由于 GPS 室内搜星不稳定,请将模块或者天线放到阳台或窗户旁,或者直接在户外进行实验。
插上GPS天线,并将接收器标签面朝下置于空旷的室外,在正常情况下(户外,天气良好,没有大型建筑遮挡)上电需要等待约1分钟才能接收到定位信号;如果天气条件不好,可能需要更长的定位时间,甚至无法定位
配置串口
sudo raspi-config 选择Interfacing Options -> Serial,关闭shell访问,打开硬件串口
树莓派5/2B/zero,用户串口设备号为ttyAMA0;可以用以下命令行确认,serial0为选用的串口设备号,例如下图这样的是ttyS0为串口:
ls -l /dev/serial*
- 打开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
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米的误差;不同的测试环境和转换算法,可能误差有所差异。