Jetbot-AI机器人教程-目标巡线
说明:
- 介绍jetbot如何实现目标巡线
步骤:
- 基本界面:
第一步:在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[1], 'value'), (x_slider, 'value'))
widgets.jsdlink((controller.axes[3], 'value'), (y_slider, 'value'))
- 修改button值,设置对应的按键为拍摄图片按键
controller.buttons[0].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运动更加平滑,摆动幅度更小。
演示视频
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号