Home » Jetbot-AI机器人教程 » Jetbot-AI机器人教程-目标巡线

Jetbot-AI机器人教程-目标巡线

说明:

  • 介绍如何实现目标巡线

步骤:

  • 界面:

请输入图片描述

第一步:在JetBot上收集数据:

  • 通过导航到http://<jetbot_ip_address>:8888连接到您的机器人

  • 使用默认密码jetbot登录

  • 通过选择Kernel -> Shutdown All Kernels...来关闭所有其他正在运行的笔记本...

  • 导航到~/Notebooks/road_following/

  • 打开并跟随data_collection.ipynb笔记操作

  • 运行下面程序后,会显示一段youtube上的演示视频

from IPython.display import HTML
HTML('<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/FW4En6LejhI\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>')
  • 程序运行下面代码时,会显示当前摄像头的测试图像。右边图像会显示一个绿点和蓝色线。用于表示小车应该运行的路线。为方便后面的操作,我们将输出窗口用新窗口打开
def display_xy(camera_image):
    image = np.copy(camera_image)
    x = x_slider.value
    y = y_slider.value
    x = int(x * 224 / 2 + 112)
    y = int(y * 224 / 2 + 112)
    image = cv2.circle(image, (x, y), 8, (0, 255, 0), 3)
    image = cv2.circle(image, (112, 224), 8, (0, 0,255), 3)
    image = cv2.line(image, (x,y), (112,224), (255,0,0), 3)
    jpeg_image = bgr8_to_jpeg(image)
    return jpeg_image

time.sleep(1)
traitlets.dlink((camera, 'value'), (image_widget, 'value'), transform=bgr8_to_jpeg)
traitlets.dlink((camera, 'value'), (target_widget, 'value'), transform=display_xy)

display(widgets.HBox([image_widget, target_widget]), x_slider, y_slider)
  • 下面程序和游戏手柄控制类似。修改index为实际手柄对应的标号,修改axes为要控制的按键

  • 注意:此处的axes按键必须Wie模拟按键,即可以输出小数。如果使用我们配置的游戏手柄,则需要按下HOME键,切换模式。使得指示灯为两个灯亮的状态

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'))
  • 修改button值,设置对应的按键为拍摄图片按键
controller.buttons[13].observe(save_snapshot, names='value')
  • 下面开始收集数据,将小车放置到线的不同位置,控制手柄的方向键,将绿色点拖到黑线上。蓝色线即表示小车应该运行的方向。然后按下按键拍照收集图片。尽可能多的收集各种情况的图片,count表示已经拍摄的图片数量

  • 注意:使用手柄控制绿点位置可能操作很不方便,可以通过拖动steering和throttle两个滑条来改变位置

  • 最后运行程序保存拍摄图片,当前目录下生成一个zip压缩文件

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}

第二步:训练神经网络

  • 通过导航到http://<jetbot_ip_address>:8888连接到您的机器人

  • 使用默认密码jetbot登录

  • 通过选择Kernel -> Shutdown All Kernels...来关闭所有其他正在运行的笔记本...

  • 导航到~/Notebooks/road_following/

  • 打开并跟随train_model.ipynb笔记操作

  • 如果使用的是上一节手机到的数据,不需要解压,图片文件已经在当前目录下

  • 如果需要另外解压文件,需要将road_following.zip改成对应的ZIP文件名,否则会提示文件不存在

  • 下载神经模型,过程可能比较久

  • 最后训练神经模型,当前目录下会生成best_steering_model_xy.pth文件

第三步:自主巡线

  • 通过导航到http://<jetbot_ip_address>:8888连接回机器人

  • 使用默认密码jetbot登录

  • 通过选择Kernel -> Shutdown All Kernels...来关闭所有其他正在运行的笔记本...

  • 导航到~/Notebooks/road_following

  • 打开并跟随live_demo.ipynb笔记操作

  • 运行程序加载模型,打开摄像头实时显示图像

  • 程序中有四个参数,可以通过拖动滑条改变参数的值,如果需要显示巡线功能需要更加实际情况调试参数,使巡线的效果更好

speed_gain_slider = ipywidgets.FloatSlider(min=0.0, max=1.0, step=0.01, description='speed gain')
steering_gain_slider = ipywidgets.FloatSlider(min=0.0, max=1.0, step=0.01, value=0.2, description='steering gain')
steering_dgain_slider = ipywidgets.FloatSlider(min=0.0, max=0.5, step=0.001, value=0.0, description='steering kd')
steering_bias_slider = ipywidgets.FloatSlider(min=-0.3, max=0.3, step=0.01, value=0.0, description='steering bias')

display(speed_gain_slider, steering_gain_slider, steering_dgain_slider, steering_bias_slider)
  • 此输出展示jetbot的当前运行情况,x,y表示当前图像预测的x,y值,可以表示转动角度。speed表示jetbot直线速度,steering表示转向速度
x_slider = ipywidgets.FloatSlider(min=-1.0, max=1.0, description='x')
y_slider = ipywidgets.FloatSlider(min=0, max=1.0, orientation='vertical', description='y')
steering_slider = ipywidgets.FloatSlider(min=-1.0, max=1.0, description='steering')
speed_slider = ipywidgets.FloatSlider(min=0, max=1.0, orientation='vertical', description='speed')

display(ipywidgets.HBox([y_slider, speed_slider]))
display(x_slider, steering_slider)
  • 最后运行程序小车会转动,通过调节speed gain 滑条启动jetbot

  • 注意:speed值尽量小一点,否则速度太快容易冲出线外。当jetbot沿线运行,但是左右摆动幅度太大,可以减小steering的值,是jetbot运动更加平滑,摆动幅度更小。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: jetbot-ai机器人教程