树莓派4B+Ubuntu20.04+GPS模块PPS高精度时间同步
在数据采集任务中,设备运行 Ubuntu 20.04 系统采集 ROS bag 数据。由于处于离线状态,仅依靠本地时钟赋予时间戳,导致时间不同步,影响数据融合。为此,配备 GPS 授时模块,利用 PPS 信号进行高精度授时,确保数据时间戳同步,保障数据融合的准确性。
问题背景
在数据采集任务中,设备运行 Ubuntu 20.04 系统采集 ROS bag 数据。由于处于离线状态,仅依靠本地时钟赋予时间戳,导致时间不同步,影响数据融合。为此,配备 GPS 授时模块,利用 PPS 信号进行高精度授时,确保数据时间戳同步,保障数据融合的准确性。
硬件设备:
- 树莓派4B, Ubuntu 20.04
- GPS授时模块
硬件连接
硬件连接实物图如下图所示。
树莓派做一个获取GPS时间的NTP服务器文章中采用uart0主串口连接GPS模块的TX和RX引脚,并且需要禁用蓝牙。然而经过试验对于安装ubuntu系统的树莓派来说并不适用。配置完成后开机总是卡在UBoot界面,无法正常开机。如下所示:
starting USB...
No working controllers found
Hit any key to stop autoboot: 0
U-Boot>
这是因为Ubuntu 引导过程由 U-Boot 控制,U-Boot 默认监听串口(GPIO14/15)并响应字符输入,GPS 模块在开机瞬间发出NMEA协议的串口信号,触发了 U-Boot 的命令行模式,导致无法正常引导。
查阅资料发现,相比树莓派零、1、2 以及 3 的双串口 UART0(PL011)和 UART1(mini UART),树莓派4 中新增了 4 个 PL011 串口共计有 6 个 UART(参考链接)。因此,我们可以使用uart2串口。参考链接中同时提到:
UART2 对应 TXD2 和 RXD2,对应树莓派针脚GPIO0 和 GPIO1,对应ubuntu系统内串口名称 /dev/ttyAMA1。
具体接线如下(加粗表示笔者实物采用的连接):
| GPS 模块引脚 | 树莓派 GPIO | 引脚编号(物理) | 说明 |
|---|---|---|---|
| RXD | GPIO0 | Pin 27 | 树莓派接收(UART TX) |
| TXD | GPIO1 | Pin 28 | 树莓派接收(UART RX) |
| PPS | GPIO18 | Pin 12 | PPS 中断信号(可选) |
| GND | GND | Pin 6 / 9 / 14 等 | 接地 |
| VCC | 3.3V 或 5V | Pin 1 或 PIN 2 | 根据模块规格供电(很重要) |


配置串口
我们知道,GPS模块通过串口输出NMEA消息和PPS脉冲两路信号来实现授时,因此在系统中也需要配置这两路串口:
编辑/boot/firmware/usercfg.txt
sudo gedit /boot/firmware/usercfg.txt
- 添加如下内容,扩展设备树(Device Tree)的硬件配置,作用是启用系统中的串口接口
uart2,将引脚GPIO 18配置为 PPS 信号输入端口:
dtoverlay=uart2
dtoverlay=pps-gpio,gpiopin=18
- 重启系统,使修改生效
sudo reboot
测试NMEA串口信息
- 重启系统后,终端运行:
ls -l /dev/ttyAMA*
终端输出/dev/ttyAMA1。这就是前面所述uart2对应的系统内串口名称。
- 运行:
cat /dev/ttyAMA1
终端输出NMEA数据流,表示NMEA串口连接正常。
测试PPS信号
- 测试pps串口是否接通
ls -l /dev/pps*
终端输出/dev/pps0,表示该串口接收PPS脉冲信号。
- 安装
pps-tools,并测试PPS脉冲信号
sudo apt install pps-tools
sudo ppstest /dev/pps0
正常情况下,终端输出下图所示的脉冲序列,表示PPS串口连接正常。
安装gpsd和chrony工具
安装并配置gpsd
- 安装
sudo apt-get install gpsd gpsd-clients python3-gps -y
- 编辑配置文件
sudo gedit /etc/default/gpsd
配置内容如下:
# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
START_DAEMON="true"
GPSD_OPTIONS="-n"
DEVICES="/dev/ttyAMA1 /dev/pps0"
USBAUTO="false"
GPSD_SOCKET="/var/run/gpsd.sock"
# Other options you want to pass to gpsd
GPSD_OPTIONS=""
- 编辑服务文件
sudo gedit /lib/systemd/system/gpsd.service
更改:将After=chronyd.servic改为Before=chronyd.servic
- 重新加载服务
sudo systemctl daemon-reload
sudo systemctl restart gpsd.service
- 测试
cgps
正常情况下,终端输出下图所示内容:
安装并配置chrony
- 安装
sudo apt-get install chrony
- 编辑配置文件
sudo gedit /etc/chrony/chrony.conf
在配置文件末尾添加如下内容:
refclock SHM 0 poll 4 refid GPS precision 1e-1 offset 0.9999 delay 0.2
refclock PPS /dev/pps0 poll 4 refid PPS
- 重新加载服务
sudo systemctl daemon-reload
sudo systemctl restart chrony.service
- 设置为开机启动
sudo systemctl enable gpsd.service chrony.service
- 测试
watch -n1 chronyc sources -v
watch -n1 chronyc sourcestats -v
结果如下,#* PPS表示正在使用PPS授时:

更多推荐



所有评论(0)