一、介绍
本项目设计的系统能够实现小车自主行驶到目标点。该系统融合了上层导航定位模块、轨迹跟踪控制模块以及下层的小车硬件驱动模块。其中导航定位模块是基于小编上届“DigiKey DIY原创大赛”参赛设计进行拓展开发得到的,能够利用双天线的卫星信号数据解算得到小车当前的位置,核心处理器搭载于上次比赛时设计的开发板上。轨迹跟踪控制模块是本次的核心设计,其功能为 i) 接收导航定位模块的发送的小车的实时位置信息,进行坐标系转换并计算实时航向角;ii) 根据ILOS制导律提供小车自动行驶过程中的期望航向角,根据航向角的期望值与实际值的偏差输出控制值;iii) 将控制值下发小车硬件驱动模块,以驱动小车自动行驶至目标点附近,该模块位于基于树莓派搭建的小车上位机上。小车硬件驱动模块搭载于WHEELTEC的小车上,仅使用其基本的小车底层驱动模块。
二、功能框图

三、功能说明
(一)导航定位模块
导航定位模块展示:

其中, I.MX6ULL 核心板在上届“DigiKey DIY原创大赛”中仅使用了其存储功能。要实现双天线卫星数据的实时解算,需要在开发板上额外编译运行 rtklib 的 rtkrcv 软件,具体步骤与 str2str 软件类似,这里不再赘述。
rtkrcv 软件详细使用步骤见 rtklib 官网文件。输出的数据传入上位机(树莓派)中,下面为上位机接收到的小车实时位置与航向角的数据展示:

其中,gps_serial_to_utm_node 为上位机中搭建的 ROS2 系统的一个节点,用于实现坐标系的转换与实时航向角的计算(具体见轨迹跟踪控制模块介绍),Lat 表示经度坐标,Lon 为纬度坐标,Alt 为海拔高度,→ UTM 表示将经纬度坐标系转化为 UTM 坐标系,x 和 y 为对应的 UTM 坐标值,Heading 为对应 UTM 坐标系下的航向角。
(二)轨迹跟踪控制模块
轨迹跟踪控制模块的构建过程如下:
STEP 1: 上位机环境搭建
硬件准备:树莓派 5(8 GB),

SD 卡(32 GB),

数据线,屏幕线。
软件准备:烧录 Ubuntu 系统
首先,下载树莓派烧录器 Raspberry Pi lmager,点击下载,

然后,电脑上插入空的SD卡,打开烧录器软件,选择 Raspberry Pi 5→ Other general-purpose OS → Ubuntu,

选择Ubuntu Desktop 24.04.3 LTS(64-bit),

选择SD卡对应位置,

开始写入,写入完成后会开始自动校验,

Ubuntu 系统烧录完成。

注*:如果烧录过程中出错或者断联,再次烧录时需要格式化SD卡后重新烧录,这里小编踩过坑,所以顺手记录了一下解决方法。
·遇到的问题:SD 卡烧录断联,再次插入电脑后显示需要对其格式化的提示,但按照提示点击后显示“Windows无法格式化U盘”的报错。
·解决方法:将U盘连接到电脑,并确定它被电脑检测到,然后单击“开始”并搜索“命令提示符”,右键单击“命令提示符”并选择“以管理员身份运行”,

然后在运行对话框中,输入“diskpart”并按“回车”,之后依次输入以下执行命令,一步一步执行,
list disk
select disk n
clean
create partition primary
format fs=fat32 quick
注意 ,n为U盘对应的磁盘数字,如下图所示,我的U盘对应的是磁盘 2,因此用2代替 n。

将烧录好后的 SD 卡插入树莓派背面卡槽,连接电源给树莓派供电,同时连接屏幕、鼠标、键盘等外设,

开机后,就进入 Ubuntu 系统界面,设置相关信息

全部设置好后,输入密码进入系统,至此上位机基本环境准备完毕。
STEP 2: ROS2 系统搭建与节点编写
准备好 Ubuntu 24.04 系统之后,就可以着手 ROS2 系统的搭建与配置了,具体搭建过程参考鱼香ROS社区。下面为编写的节点架构:

其中,各节点简介如下
gps_serial_to_utm_node:经纬度坐标转换为UTM坐标,同时解算UTM坐标系下的航向角;
gps_utm_subscriber:获取UTM坐标系下小车的实时位置信息;
imu_publisher:获取UTM坐标系下小车的实时姿态信息;
los_node:根据ILOS制导律计算出小车的期望航向角,结合跟踪控制器输出控制值;
tarkbot_robot:上位机与小车硬件驱动模块的通信节点。
STEP 3: 节点调试运行
编写好节点后,在对应的工作空间下打开终端,输入指令:
source install setup.bash
完成后输入指令开始编译:
colon build

编译完成后,工作空间会自动形成三个文件夹——build、install、log,

启动节点 gps_serial_to_utm_node,输入
ros2 run gps_serial gps_serial node
打印如下信息表示节点顺利启动。

再启动节点 gps_utm_subscriber,输入
ros2 run gps_utm subscriber gps utm_subscriber
可以看到打印的位置信息,

启动节点 imu_publisher,输入
ros2 run imu publisher imu publisher
可以看到打印的姿态信息,

根据上述节点的打印信息,导航定位模块运行调试成功,且与上位机数据传输正常。
下面开启节点 tarkbot_robot,输入
ros2 run tarkbot robot tarkbot robot
运行成功后在终端打印成功连接USB0,波特率为230400:

没有报错提示,说明上位机与小车硬件驱动模块通信正常。
三个模块可以正常通信后,开启节点 los_node,输入
ros2 run los los_node

新开一个终端,配置 los_node 节点,输入
ros2 lifecycle set /los_node configure
显示“Transitioning successful”,且上一个终端显示初始化提示

在新开的终端,继续激活 los_node 节点,输入
ros2 lifecycle set /los_node activate
显示“Transitioning successful”,且上一个终端显示节点激活

输入指令行,设置目标点位置
ros2 param set /los_node wpt_pos "[238791,3987731]"
此时,自动行驶模式开启,对应的 los_node 节点显示如下。

(三)小车硬件驱动模块
小车硬件驱动模块的核心驱动板如下:

与上位机通信的串口 3 如下图所示:

小车驱动板接收的上位机的数据格式如下图所示:

(1)帧头:固定值 0x7B,标识数据包的开始,占一个字节;
(2)预留位:第 2、3 个字节均为预留位,无意义,各占一个字节;
(3)X 轴目标速度:期望速度的前进分量,单位 mm/s,占两个字节;
(4)Y 轴目标速度:期望速度的横移分量,单位 mm/s,占两个字节;
(5)Z 轴目标速度:期望偏航角速度的1000 倍,单位 rad/s,占两个字节;
(6)数据校验位:前 9 个字节异或校验(BCC 校验)的结果,占一个字节;
(7)帧尾:固定值 0x7D,标识数据包的结束,占一个字节。
对应上述提供的数据帧格式,上位机下发的速度控制命令应由 11 个字节组成,每个字节包含 8 位数据。小车自动行驶过程中,速度设置为恒定值 0.2 m/s,期望航向角由 ILOS 算法给出,根据几何分解得到 X 和 Y 轴的速度分量,控制值转化为对应的数据格式下发到小车驱动板中,从而驱动小车运动。
四、演示视频
【 2025 DigiKey 杯】基于树莓派搭建的小车自动行驶系统——成果展示_哔哩哔哩_bilibili
五、花絮
上位机系统展示:

涉及的节点文件展示:
(1)节点 gps_serial_to_utm_node 所在文件夹为 gps_serial

(2)节点 gps_utm_subscriber 所在文件夹为 gps_utm_subscriber

(3)节点 imu_publisher 所在文件夹为 imu_publisher

(4)节点 los_node 所在文件夹为 los

(5)节点 tarkbot_robot 所在文件夹为 tarkbot_robot_serial

最终设备展示(小车行驶过程中,为了避免树莓派滑落,安置在夹板中间空隙处):


调试过程中遇到的问题:
初始设备搭载的天线如下,

搭载该天线时,获取到的小车位置精度较低,因此解算出的实时航向角误差较大,这导致小车在自动行驶时,实施航向角与期望航向角之间的误差较大且跳变频繁,出现下面视频中轮子左右摇摆前进的情况,因此后续替换为上图最终的大蘑菇头天线。
六、物料清单
(1)树莓派 5(8 GB)
(2)和芯星通板卡 UB482
(3)核心板 I.MX6ULL
(4)32GB SD卡
(5)WHEELTEC R550 PLUS 小车
(6)便携式显示屏
(7)电源
(8)数据线、网线、屏幕连接线若干
七、视频展示:
