JetBot路径跟随项目:使用游戏手柄进行数据采集的技术解析
项目概述
JetBot路径跟随项目是一个基于NVIDIA Jetson平台的智能机器人开发项目,旨在实现机器人自主跟随预设路径的功能。与传统的碰撞避免项目不同,路径跟随采用了回归技术而非分类技术,这使得机器人能够更精确地控制行进方向和角度。
技术原理
路径跟随的核心思想是通过深度学习模型预测目标点的X、Y坐标值,然后根据这些预测值计算近似转向值。虽然这不是精确的角度计算(需要图像校准才能实现),但其与角度大致成比例的关系足以实现良好的控制效果。
数据采集流程
- 机器人定位:将JetBot放置在路径的不同位置(偏离中心、不同角度等)
- 实时图像显示:显示机器人摄像头的实时画面
- 目标点标注:使用游戏手柄控制器在图像上放置"绿色圆点",表示我们希望机器人行进的目标方向
- 数据存储:保存这个绿色圆点的X、Y值以及机器人摄像头的图像
数据采集实践指南
1. 准备工作
首先需要导入必要的Python库:
# IPython显示和小部件库
import traitlets
import ipywidgets.widgets as widgets
from IPython.display import display
# JetBot的摄像头和电机接口
from jetbot import Robot, Camera, bgr8_to_jpeg
# 图像标注基础包
from uuid import uuid1
import os
import json
import glob
import datetime
import numpy as np
import cv2
import time
2. 摄像头初始化与显示
我们使用JetBot的Camera类来启用CSI MIPI摄像头。神经网络输入为224x224像素的图像,因此我们将摄像头设置为该尺寸以最小化数据集文件大小:
camera = Camera()
widget_width = camera.width
widget_height = camera.height
image_widget = widgets.Image(format='jpeg', width=widget_width, height=widget_height)
target_widget = widgets.Image(format='jpeg', width=widget_width, height=widget_height)
x_slider = widgets.FloatSlider(min=-1.0, max=1.0, step=0.001, description='x')
y_slider = widgets.FloatSlider(min=-1.0, max=1.0, step=0.001, description='y')
3. 游戏手柄控制器设置
创建控制器小部件实例,用于标注图像的X和Y值:
controller = widgets.Controller(index=0)
display(controller)
将游戏手柄控制器连接到标注功能:
widgets.jsdlink((controller.axes[2], 'value'), (x_slider, 'value'))
widgets.jsdlink((controller.axes[3], 'value'), (y_slider, 'value'))
4. 数据采集过程
执行以下代码块将显示实时图像以及已保存图像的数量。通过以下步骤存储目标X、Y值:
- 将绿色圆点放在目标位置
- 按下方向键"下"保存
DATASET_DIR = 'dataset_xy'
try:
os.makedirs(DATASET_DIR)
except FileExistsError:
print('目录已存在,无需创建')
for b in controller.buttons:
b.unobserve_all()
count_widget = widgets.IntText(description='count', value=len(glob.glob(os.path.join(DATASET_DIR, '*.jpg')))
5. 数据标注技巧
在标注过程中,以下指南可以帮助提高模型性能:
- 观察摄像头的实时画面
- 想象机器人应该遵循的路径(估算避免偏离路径所需的距离)
- 将目标点放在路径上尽可能远的位置,使机器人可以直接朝向目标行进而不会偏离路径
例如:
- 在非常直的道路上,可以将目标点放在远处
- 在急转弯处,可能需要将目标点放在离机器人较近的位置,以避免超出边界
数据处理与准备
完成数据采集后,需要将数据压缩以便传输到GPU桌面或云机器进行训练:
def timestr():
return str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
!zip -r -q road_following_{DATASET_DIR}_{timestr()}.zip {DATASET_DIR}
技术要点总结
-
数据多样性:与碰撞避免项目一样,数据的变化性是关键。确保采集不同位置、不同角度的图像数据。
-
目标点放置原则:
- 机器人可以安全地直接朝向目标行进(不会越界等)
- 目标点将沿着我们想象的路径持续前进
-
实现效果:最终实现的是一个沿着期望轨迹移动的"胡萝卜"效果。深度学习决定胡萝卜的位置,JetBot只需跟随它。
-
文件命名规范:保存的文件名格式为
xy_<x值>_<y值>_<uuid>.jpg
,其中x和y值是像素坐标(从左上角开始计数)。
通过遵循这些步骤和原则,即使是少量数据(如示例中的123张图像)也能训练出有效的路径跟随模型。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考