Work

2023年05月01日 至 2024年02月01日
ROS
YOLOv5
TensorRT
Jetson Nano
React
Flask

基于 ROS 框架构建校园智能巴士系统,集成激光雷达、深度相机与麦克纳姆轮底盘,实现复杂校园环境下的多传感器融合感知与避障控制。独立完成 YOLOv5 模型从数据集标注、训练到 Jetson Nano 边缘端部署的全链路开发,并通过 TensorRT 加速推理性能。同时,基于 React + Flask 构建远程监控与交互系统,融合语音与手势交互逻辑,实现软硬件高度协同的机器人闭环控制。该项目获第二十六届中国机器人及人工智能大赛国家级三等奖。

校园智能巴士系统项目的图片

基于YOLO深度学习框架的智能无人驾驶校园巴士。

小车端介绍

车体介绍

车体介绍

校园模拟环境介绍

校园模拟环境介绍

模型结果

针对目标识别的需求,我们采用Yolov5框架中体量最小的Yolov5 nano模型作为训练模型,以此保证最高的识别效率。为了实现精准识别,我们构建了包含13个类别的数据集用于模型训练,每个类别采集了300张图片数据。由于本项目对模型的泛化能力要求不是特别高,所以在训练模型的过程中,通过在较大的训练集中使用更高的训练周期,尽可能的充分训练,使得我们的模型在测试集上的准确率达到了80%以上。通过路标识别,得知当前所在的车站,并且利用深度相机返回的与路标的距离,校园巴士就可以在距离合适的位置靠边停车,实现乘客的上下车。

模型结果

前端介绍

本项目是基于YOLO深度学习框架的智能无人驾驶校园巴士的前端部分,主要功能包括:

  • 实时获取校园巴士摄像头信息
  • 实时获取站点信息
  • 实时监控校园巴士的位置
  • 实时监控校园巴士的载客情况
  • 远程手动控制校园巴士

前端效果图

项目特点

开发笔记: React NextJS App Router 实时获取API

校园巴士上使用Flask框架搭建一个API服务器,通过API获取校园巴士的数据并且发送控制信号。

本项目前端主要是在NextJS框架下使用React开发,在实现基本功能的同时,在面对需要实时获取数据的情况,我没有使用其他第三方库来实现API获取,而是根据NextJS官网来实现data-fetching

最终,经过各种排列组合的尝试之后,我得出了一个合理的解决方案,就是在useEffect中调用getLocationInformation(),并且在获取后端API的代码中加入next: {revalidate: 0},代码如下:

// 获取后端API的代码
export async function GET(request: NextRequest) {
    const res = await fetch(URL + '/api/information', {
        headers: {
            'Content-Type': 'application/json',
        },
        next: {revalidate: 0} // 0秒后重新获取数据
    })
    const data = await res.json()
    // return Response.json({ data })
    return NextResponse.json({ data })
}

// 调用本地API的代码
useEffect(() => {
        getLocationInformation();
    });

async function getLocationInformation() {
    const res = await fetch('/api/getLocationInformation');
    if (!res.ok) {
        setMessage("Connect fail!");
        return;
    }
    const data = await res.json();
    setLocationInformation(data.data);
    setRootLocationInformation(data.data);
    for (var _ in data.data) {
        if (data.data[_]["is_arrived"]) setIsNextLocation(LocationInformationLinkedList[_ as keyof TypeLocationInformationLinkedList])
    }
    console.log(locationInformation)
}

我个人的理解是,next: {revalidate: 0}是在获取数据的时候,告诉NextJS在0秒后重新获取数据,这样就可以实现实时获取数据了,同时由于useEffect函数的使用,使得后端每次获取新的API,这里就可以实时在页面上更新,也算是一个不错的解决方案吧。

整体项目演示