嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

在NVIDIA Jetson Nano上实现JetBot AI自驾车项目-02控制移动篇

作者

郭俊廷

难度

普通

一、介绍

上次我们介绍了如何安装JetBot相关软件及网络设定,这次我们就来介绍如何让JetBot开始移动呢?

 

首先来看看我们移动的视频及操作时的照片

JetBot网页控制车子移动视频:

0126_f9ebcbabdbe4a4c7704976c8ad81ee9857fa7e18.jpg

 

接着介绍我们使用的DFRobot马达驱动板,因为我们程序里写好各个马达接线对应的脚位,请按照以下脚位接在相对应的位子,JetBot才会朝正确的方向移动。

以下是DFRobot马达驱动板跟马达接线表还有图片。

  马达

DFRobot驱动板

左马达红线

M1-

左马达黑线

M1+

右马达红线

M2+

右马达黑线

M2-

DFRobot马达驱动板跟马达接线表

 

0223_c911ec02f29431d4f718620cc7e24007102a1050.jpg

DFRobot驱动板接线图

 

二、JetBot范例介绍基本移动

首先进入JupyterLab的网址是http://<jetbot_ip_address>:8888

点选左边的路径"Home > Notebooks可以看到我们JetBot的范例都在这边。

有基本移动、避开障碍物、目标跟随、道路跟随、游戏杆控制。

0321_98318fb45f41975fc9763b167550b6cb18efdffc.jpg

 

今天我们要来介绍Basic Motion跟teleoperation的功能。

Basic Motion的功能是车子操作基本移动的范例。

teleoperation的功能是使用游戏杆来控制车子。

接下来会介绍部分程序代码所代表的意思跟功能。

首先点选左边的路径"Home > Notebooks > basic_motion > basic_motion.ipynb",就能打开JupyterLab的Basic Motion画面。

0422_59a15f4fff33798d301a9fdcc9c4129a491039b0.jpg

Basic Motion画面

 

在JupyterLab中每一段执行的程序代码的地方我们都称为一个区块(Cell),区块的执行顺序通常都由第一个执行到最后一个。

04-11_9d05f6548a21ff736c99f7efe49d2daf244ac2ec.jpg

每一个区块的位子

 

在JupyterLab中执行程序代码的方式为点选程序代码区块,然后按下快捷键"Shift+Enter",或上面RUN的按钮来执行程序,执行中的区块会显示*号。当执行过该区块程序即会在该区块前显示执行顺序的数字。

04-21_d939dc7228c7a20b3856ab348cd38786e6cd88ad.jpg

RUN的按钮位置与执行的区块如上图红色框框所示

 

04-31_47eb5e9749d267bc00c3b16dc7046f727ca76c9b.jpg

执行中的区块会显示*号

 

首先这两个区块先宣告我们使用到的参数 Robot

并且定义马达驱动板的参数,不同的马达驱动板有不同的参数。

 

如果是使用我们DFrobot马达驱动板需要改成以下参数

robot = Robot(driver_board="dfrobot")

 

如果是使用Adafruit的马达驱动板,并且使用官方预设的函式库,使用默认的程序即可

robot = Robot()

 

如果马达驱动板没有问题可以看到以下执行结果

board begin success

04-41_d9cea48be3d1f12d79deaa1211e41795f7280cf4.jpg

DFrobot的马达驱动板程序修改

 

出现下面这行警告代表JetBot会开始移动 注意不要让它撞到东西或跌到桌子底下

0713_8f050212515109d4d457e6d902ad48c3614f99cb.jpg

 

执行程序代码之后车子轮胎会开始移动所以需先抬高车身让车子轮胎悬空,避免车子撞到或摔落至地板(如下图)

0813_89cb48128126ba9bf0f40e0b146380754cc75e5a.jpg

 

当您执行到第3个区块时,应该就可以看到马达开始动了,以30%的速度向左转,如果没有,请确认一下马达驱动板有没有接上电或者是马达驱动板跟马达接线是否有正确接好。

robot.left(speed=0.3)

这里的speed=0.3 就是车子移动速度的百分比,可以依照你想要的速度修改数值

执行到第4个robot.stop()区块时车子才会停止

0912_1ba48f0d6cc6f4f0cdd4d2ac8e2913b5e79a9955.jpg

 

有了停止的功能当然也要有让车子移动多少时间就停止的功能

第5个区块使用import time 宣告时间参数

 

第6个区块默认的范例是让车子左转30%的速度,执行0.5秒后停止。可以依照自己想要的移动跟时间跟速度修改数值。

robot.left(0.3)       车子左转30%的速度

time.sleep(0.5)     执行0.5秒

robot.stop()          车子停止

1038_4fa16f198130df7ab11712f2571ac1621659b84c.jpg

 

执行第7第8个区块是一样的移动方式,但有不同的写法,以下介绍两种不同的写法。

分别都是以左马达30%的速度前进,右马达60%的速度前进移动车子一秒这样车子就会朝左拱形移动一秒。

第7个区块的写法

robot.set_motors(0.3, 0.6)   车子左马达30%的速度前进、右马达60%的速度前进

time.sleep(1.0)                     执行1秒

robot.stop()                          车子停止

 

第8个区块的写法

robot.left_motor.value = 0.3       车子左马达30%的速度前进

robot.right_motor.value = 0.6     右马达60%的速度前进

time.sleep(1.0)                           执行1秒

robot.left_motor.value = 0.0       车子左马达停止

robot.right_motor.value = 0.0     车子右马达停止 

 

1148_27f53cb60fe6d87fe2150c32a2e174ddd12f3496.jpg

 

第9个区块是建立一个滑杆,用来控制左右马达,移动速度的数值由-1到1。

第10个区块会把上面的滑杆真正连结到马达中,这时候才可以透过滑杆来控制马达速度。

执行到第10个区块时,就可以回到第9个区块去拉动滑杆,看看能否用滑杆来分别控制两个马达的马力以及正反转。

1240_e7bd8f0b406955341e10749d0a3442132a0bb761.jpg

 

执行到第12个区块时,会解除滑杆的连结,这时候改变滑杆的数值马达的转速就不会跟着改变。

1338_dc8818b4f5d523d4ce4be32e640f422df3fbc616.jpg

 

接着是第14个区块是建立出一个移动的控制窗口,有前、后、左、右跟停止。

第15个区块是定义前、后、左、右、停止所执行的动作。

第16个区块是链接各个按钮所对应到的动作。

所以执行到第16个区块时,就可以回到第14个区块去点选按钮,看看能否透过按键来控制马达的行为,如果前后左右控制都对代表马达接线正常,基本移动功能正常,不正常移动则检查接线有无脱落或接线有无错误。

1434_a9390dc32d5136243fcd96372c3e4c3cd9eed41d.jpg

创建移动的控制窗口

 

1533_1dfff9330a9af9da6531dc63c3eabc4e75152cdc.jpg

定义按钮、按钮功能链接

 

以下是我们实际操作的影片:

以上我们基本移动的介绍就在这里告一段落。

 

注意:

执行完一个档案的功能之后记得关闭kernel和使用窗口

1.点选正在使用的窗口上的叉叉

2.点选左边目录第二个选项的人离开的图案

3.按SHUTDOWN关闭正在使用的所有kernel才可执行下一个档案

接下来执行完每个档案都要这样做,才不会导致各个执行序互相冲突。

1634_671b86b59640464ae54e0e27b76d2a15a4b08e8c.jpg

关闭kernel之步骤

 

三、JetBot范例介绍游戏杆移动

关闭完Basic Motion的kernel之后

我们来介绍Teleoperation,也就是用游戏杆控制车子的功能。

 

首先点选左边的路径"Home > Notebooks > teleoperation > teleoperation.ipynb",就能打开以下的JupyterLab的Teleoperation画面。

1733_ee3efbf159c9c67d7668c376b4782602f32ab641.jpg

 

我们使用Logitech F710 无线游戏控制器来当作我们的控制器,游戏杆部分没有特别规定型号有线无线都可以,只要支持HTML5 Gamepad的游戏杆皆可使用,把接受器或USB插入计算机中即可使用。

进入以下html5gamepad网址检查游戏杆可无使用并查看INDEX的数字是多少,目前我使用的Logitech F710所得到的INDEX是1。

之后需要填入相对应的地方,游戏杆才能正常使用控制车子。

http://html5gamepad.com

1831_fae1026f5428d9753d0dcd3f110f1b32fe674fb4.jpg

 

第1个区块是定义使用组件,定义游戏杆的index,还有显示游戏杆的对应的数字。

 

按下任何按钮即可侦测到游戏杆,游戏杆上每个按钮都有对应的号码。例如我的左游戏杆往前后时对应的是滑杆1,右游戏杆往前后时对应的是滑杆3,按钮下对应的是13。之后程序有用到的时候只要改变对应的数字就可以使该数字执行相对应的功能。

 

在下面这一段程序代码index=1的部分这里要依照你们刚刚网页取得的INDEX来填入,预设是1,我们得到的是0所以需要把INDEX的数值改成0。(如下图红框处)

 

controller = widgets.Controller(index=1)  # replace with index of your controller

1930_359f781c87c77b875f547f4dc532d38be68ab5c5.jpg

 

第2个区块,连结游戏杆跟马达所对应的功能,当使用滑杆1的时候依照滑杆的数值让左马达转动,使用滑杆3的时候依照滑杆的数值让右马达转动。

2014_e37303f488070ad7dedfae3184aaa4a49cded42a.jpg

 

我们的实际操作画面如下

第3个区块会建立一个长、宽各300的画面来显示等一下会建立的摄影机画面。

第4个区块宣告摄影机的参数跟定义摄影机的instance

2128_eb0203d8869d921959adba3a2ccf594a176dab0f.jpg

 

第5个区块这里才会将摄影机画面连结到刚刚第3个区块建立的画面,这时可以回去第3个区块看看有无正却看到摄影机的画面。

2227_a04e54e4c861a2d51d645050d523c90e5b218135.jpg

 

摄影机呈现出的画面如下图

2324_b9ce7a4313eb23b17c86f758edb872639965d994.jpg

 

第8个区块则是使用我们的游戏杆结合摄影机的功能来达到拍照的功能。

建立一个snapshots的文件夹当我们按了buttons[5]即可储存当下的照片,储存的格式用jpeg,长宽都是300。储存照片档的命名格式使用uuid。

2425_a1a3efd8185d1e4aaf7f22920ec5e7ad9e43b76f.jpg

 

buttons[5]根据我们的Logitech F710所对应的是RB,当按下RB就会拍下照片显示在右边的画面并存在snapshots的文件夹里(如下图所示)。也可以改变按钮号码更改游戏杆对应的按钮,各位也可以尝试看看。

2523_871141fdc4ea6a79bd5cd64e4262192d08d9fc36.jpg

 

以上移动篇的讲解到这边告一段落,各位有没有成功让车子移动呢?接着我们会继续介绍更多JetBot相关的范例,有兴趣的欢迎继续关注我们!

在NVIDIA Jetson Nano上实现JetBot AI自驾车项目-03回避障碍篇(上)

CAVEDU Education is devoted into robotics education and maker movement since 2008, and is intensively active in teaching fundamental knowledge and skills. We had published many books for readers in all ages, topics including Deep Learning, edge computing, App Inventor, IoT and robotics. Please check CAVEDU's website for more information: http://www.cavedu.com, http://www.appinventor.tw