如何将 GPS 位置打印到标准输出 (Ubuntu 16.04 / 18.04)?
How to print GPS location to stdout (Ubuntu 16.04 / 18.04)?
我是 Linux 上 GPS 设备的完全新手。
我有一个 GlobalSat G-STAR IV
USB 设备,我只想将 GPS 位置(纬度、经度)打印到标准输出。我怎样才能做到这一点?我正在阅读有关 gpsd
的信息,但不确定如何获取实际位置。该文档似乎很旧。
有什么常用工具吗?
好像跟
$ sudo stty -F /dev/ttyUSB0 4800
$ sudo cat /dev/ttyUSB0
我可以从设备读取一些 NMEA(?) 数据:
$GPGGA,113935.199,,,,,0,00,,,M,0.0,M,,0000*5B
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,113935.199,V,,,,,,,100918,,,N*41
$GPGGA,113936.186,,,,,0,00,,,M,0.0,M,,0000*56
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,113936.186,V,,,,,,,100918,,,N*4C
$GPGGA,113937.185,,,,,0,00,,,M,0.0,M,,0000*54
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,113937.185,V,,,,,,,100918,,,N*4E
$GPGGA,113938.200,,,,,0,00,,,M,0.0,M,,0000*55
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
我仍然没有看到应该包含位置的 $GPGLL
..?
编辑:我也明白了:
$ sudo gpsd /dev/ttyUSB0 -N
gpsd:ERROR: can't bind to IPv4 port gpsd, Address already in use
gpsd:ERROR: maybe gpsd is already running!
gpsd:ERROR: can't bind to IPv6 port gpsd, Address already in use
gpsd:ERROR: maybe gpsd is already running!
我已经杀死了所有 gpsd
个实例并删除了套接字,但仍然得到它..
您从 sudo cat /dev/ttyUSB0
发布的输出是您对 GPS 模块的期望,它(还)没有修复,即它没有足够的信息来计算其当前位置(+other信息)。
消息提供的唯一信息是当前时间、11 点 39 分 35 秒等。在您从 GPS 模块收到的消息中,不仅 $GPGLL
消息可以告诉您您的位置,还有您收到的 $GPGGA
和 $GPRMC
消息。如果您的模块已修复,您将不会在一行中看到多个逗号,而是在它们之间看到实际值。
有关不同消息格式的更多详细信息,请参见 overview。
GPS 修复丢失的可能根本原因是什么(假设您的硬件和天线都没有问题)?
- 您刚刚开始使用这个刚出厂的模块,需要一些时间来了解它的坐标。对于这样一个全新的设备,time to first fix 最长可达 15 分钟。
- 您模块所在位置的 GPS 信号强度不够强。
因此我的建议是:
- 确保您所在位置的卫星 GPS 信号足够强。最好是搬到户外。
- 如果您的模块以前从未有过修复,请给您的模块一些时间。最多等待 20 分钟。
GPSD:
GPSD(如果已安装)通常会在您插入 GPS 模块时自动启动。您可以使用
查看当前状态
systemctl status gpsd.service
systemctl status gpsd.socket
如果处于活动状态,gpsd
守护进程会读取通过串行接口传入的 GPS 数据,并通过特定端口(默认:端口 2947)上的套接字将其提供给其他应用程序。在这种情况下,串行监视器无法再访问串行端口。
使该设备正常工作的步骤是:
# Switch the device to NMEA mode
sudo gpsctl -f -n /dev/ttyUSB0
# Set baudrate to 4800
sudo stty -F /dev/ttyUSB0 4800
# Start gpsd
gpsd -S 4000 /dev/ttyUSB0
现在创建到 localhost:4000
的 TCP/IP 套接字连接并说 ?WATCH={"enable":true,"json":true};
或使用 libgps
等:
我是 Linux 上 GPS 设备的完全新手。
我有一个 GlobalSat G-STAR IV
USB 设备,我只想将 GPS 位置(纬度、经度)打印到标准输出。我怎样才能做到这一点?我正在阅读有关 gpsd
的信息,但不确定如何获取实际位置。该文档似乎很旧。
有什么常用工具吗?
好像跟
$ sudo stty -F /dev/ttyUSB0 4800
$ sudo cat /dev/ttyUSB0
我可以从设备读取一些 NMEA(?) 数据:
$GPGGA,113935.199,,,,,0,00,,,M,0.0,M,,0000*5B
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,113935.199,V,,,,,,,100918,,,N*41
$GPGGA,113936.186,,,,,0,00,,,M,0.0,M,,0000*56
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,113936.186,V,,,,,,,100918,,,N*4C
$GPGGA,113937.185,,,,,0,00,,,M,0.0,M,,0000*54
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,113937.185,V,,,,,,,100918,,,N*4E
$GPGGA,113938.200,,,,,0,00,,,M,0.0,M,,0000*55
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
我仍然没有看到应该包含位置的 $GPGLL
..?
编辑:我也明白了:
$ sudo gpsd /dev/ttyUSB0 -N
gpsd:ERROR: can't bind to IPv4 port gpsd, Address already in use
gpsd:ERROR: maybe gpsd is already running!
gpsd:ERROR: can't bind to IPv6 port gpsd, Address already in use
gpsd:ERROR: maybe gpsd is already running!
我已经杀死了所有 gpsd
个实例并删除了套接字,但仍然得到它..
您从 sudo cat /dev/ttyUSB0
发布的输出是您对 GPS 模块的期望,它(还)没有修复,即它没有足够的信息来计算其当前位置(+other信息)。
消息提供的唯一信息是当前时间、11 点 39 分 35 秒等。在您从 GPS 模块收到的消息中,不仅 $GPGLL
消息可以告诉您您的位置,还有您收到的 $GPGGA
和 $GPRMC
消息。如果您的模块已修复,您将不会在一行中看到多个逗号,而是在它们之间看到实际值。
有关不同消息格式的更多详细信息,请参见 overview。
GPS 修复丢失的可能根本原因是什么(假设您的硬件和天线都没有问题)?
- 您刚刚开始使用这个刚出厂的模块,需要一些时间来了解它的坐标。对于这样一个全新的设备,time to first fix 最长可达 15 分钟。
- 您模块所在位置的 GPS 信号强度不够强。
因此我的建议是:
- 确保您所在位置的卫星 GPS 信号足够强。最好是搬到户外。
- 如果您的模块以前从未有过修复,请给您的模块一些时间。最多等待 20 分钟。
GPSD:
GPSD(如果已安装)通常会在您插入 GPS 模块时自动启动。您可以使用
查看当前状态systemctl status gpsd.service
systemctl status gpsd.socket
如果处于活动状态,gpsd
守护进程会读取通过串行接口传入的 GPS 数据,并通过特定端口(默认:端口 2947)上的套接字将其提供给其他应用程序。在这种情况下,串行监视器无法再访问串行端口。
使该设备正常工作的步骤是:
# Switch the device to NMEA mode
sudo gpsctl -f -n /dev/ttyUSB0
# Set baudrate to 4800
sudo stty -F /dev/ttyUSB0 4800
# Start gpsd
gpsd -S 4000 /dev/ttyUSB0
现在创建到 localhost:4000
的 TCP/IP 套接字连接并说 ?WATCH={"enable":true,"json":true};
或使用 libgps
等: