如果已经将Jetbot智能小车组装好的话,现在就可以开始执行Jetbot提供的实验,在接下来的操作都在以下环境中执行:
关于这部分的设置,请参考“Jetbot实战系列03:无线WIFI的安装与调试”文章,有详细的说明。
我们采用如下图的“Jetbot热点”方式连接,就是将Jetbot无线网卡设置为“热点”模式,将PC的WIFI连上Jetbot设置的热点上,如此Jetbot的IP固定为 ”10.42.0.1”,操作起来方便。
现在就开始两个基础的Jetbot“手动”运行实验,这两个实验最重要的目的是让大家熟悉代码的运作,第一个实验开始时简单最后以键盘的“上下左右”去控制Jetbot的行进,第二个实验是使用游戏用的摇杆设备来进行控制,前提是您得采购一个最简单的,我们测试了几种游戏摇杆,包括有线以及无线的都能正确使用。
现在就开始Jetbot的基础项目,请自行登陆Jupyter并进入jetbot/notebooks目录下,总共有5个实验目录。
在Jupyter进入basic_motion目录,里面有basic_motion.ipynb这个实验内容,点选后就能打开,这里的代码主要分为四大段:
这部分的代码非常直观,并且有很详尽的英文解说,最主要是让大家如何导入关于电机控制的模块,并且创建robot对象来控制Jetbot的行进:
[ ] [ ] |
from jetbot import Robot robot = Robot() |
我们只要分别对robot对象的左右轮设定速度,就能实现让Jetbot移动的任务。这里“设定速度”的方法,是以“全速”为基准给定[-1, +1]之间的相对值,但给定“负值”表示“反向”旋转,这是不建议的做法。
下面有三种设置左右轮的方法,如下:
[ ] [ ] |
robot.left(speed=0.3) robot.stop() |
[ ] |
import time |
[ ] |
robot.left(0.3) time.sleep(0.5) robot.stop() |
[ ] |
robot.set_motors(0.3, 0.6) time.sleep(1.0) robot.stop() |
[ ] |
robot.left_motor.value = 0.3 robot.right_motor.value = 0.6 time.sleep(1.0) robot.left_motor.value = 0.0 robot.right_motor.value = 0.0 |
上面的这些数值您可以在要求的范围内自由设置,最好能试着将两个值调成一样,并且让延续时间稍微长一点,例如3~5秒,可以先检查一下左右轮的转速是否一致!
在“Jetbot实战系列04:CSI摄像头安装与测试”里已经使用过traitlets这个非常强大的库,将摄像头捕获的画面与widgets.image小部件连接,再透过display(image)显示动态的图像。
这里也用相同的方法,创建两个“滑块(slider)”小部件与robot左右轮的数值进行捆绑,可以单向地在两个滑块上显示轮的速度值,还可以进一步透过两个滑块去控制个别轮的速度。下面是这个用途的执行步骤:
[ ] |
import ipywidgets.widgets as widgets from IPython.display import display
# 创建”left”与”right”两个垂直滑块小部件,数值范围在 [-1.0, 1.0] 之间 left_slider = widgets.FloatSlider(description= 'left', min=-1.0, max=1.0, step=0.01, orientation='vertical') right_slider= widgets.FloatSlider(description='right', min=-1.0, max=1.0, step=0.01, orientation='vertical') # 创建一个水平框,放置前面生成的两个垂直滑块 slider_container = widgets.HBox([left_slider, right_slider]) # 在下面这个滑块容器 display(slider_container) |
[ ]
[ ]
[ ] |
import traitlets left_link = traitlets.link((left_slider, 'value'), (robot.left_motor, 'value')) right_link=traitlets.link((right_slider, 'value'),(robot.right_motor, 'value')) robot.forward(0.3) time.sleep(1.0) robot.stop() left_link.unlink() right_link.unlink() |
[ ] |
left_link = traitlets.dlink((robot.left_motor, 'value'), (left_slider, 'value')) right_link = traitlets.dlink((robot.right_motor, 'value'), (right_slider, 'value')) |
使用traitlets的另一种方法是将函数(如forward)附加到事件。每当对象发生更改时,这些函数都会被调用,并且会被传递一些有关该更改的信息,如旧值和新值。让我们创建并显示一些用于控制机器人的按钮。
[ ] |
# 创建5个按钮 stop_button = widgets.Button(省略) forward_button = widgets.Button(省略) backward_button = widgets.Button(省略) left_button = widgets.Button(省略) right_button = widgets.Button(省略) # 显示按钮 middle_box = widgets.HBox([left_button, stop_button, right_button], layout=widgets.Layout(align_self='center')) controls_box = widgets.VBox([forward_button, middle_box, backward_button]) display(controls_box) |
[ ] |
def stop(change): def step_forward(change): def step_backward(change): def step_left(change): def step_right(change): |
在这里可以看到robot对象还提供stop/forword/backword/left/right等五个预定义的动作,可以直接使用。这里的left与right所定义的方式是“原地旋转”的动作,如果要让小车往“左前方”或“右前方”行进的话,则需要自行对左右轮设置不同速度比的方式来处理。
[ ] |
# 捆绑方式:按钮.on_click(动作) stop_button.on_click(stop) forward_button.on_click(step_forward) backward_button.on_click(step_backward) left_button.on_click(step_left) right_button.on_click(step_right) |
完成这个捆绑的步骤之后,按下按钮才会向Jetbot发送控制指令,现在试试看能不能用这个方向键来控制Jetbot小车!
这是个预防Jetbot与PC直接因为距离过远而失去控制能力状况下,提供的一种安全管理措施,这部分的内容请自行测试即可,没什么难度,这里不做说明。
以上就完成这个智能小车的最基本运动功能,大家可以多尝试调整转速、方向、持续时间等参数,感受一下这个基本运动的处理方式。
项目代码在notebooks/teleoperation目录的teleoperation.ipynb,在Jupyter里打开这个文件就能执行。这是在PC控制机上,用游戏摇杆(gamepad)来控制Jetbot小车的左右轮,基本逻辑与上面的“滑块控制轮速”的原理是一致的,只不过将设备从鼠标变成摇杆而已。
我们将手边的四种游戏摇杆(如下图)都做过测试,不过有线无线、单价高低的都能使用,如果手上没有这类摇杆的,可以简单选个30元左右的也可以执行这些测试,并且以后做些这类相关的应用。
将摇杆接上PC之后,如果是Linux操作系统请执行以下指令,检查是否已经安装:
$ |
ls /dev/input/js* |
至于Windows或MacOS请自行在设备列表中检查。
如果确认设备已将连上控制PC之后,就可以开始执行teleoperation.ipynb这个项目,不过有个对初学者很重要的地方,却放在不起眼的注释里面,在这里我们特别将它提出来,在执行项目之前必须先点进去注释里的“1.Visit http://html5gamepad.com.”,点进这个连接之后,就能确认您手上的这个摇杆是否能够正常工作。
最左上角的”INDEX”编号就是接下来代码中”widgets.Controller(index=N)”的实际编号,当然在前面 ”ls /dev/input/js*” 所显示的编号,也能作为这个编号的依据,不过在这个网页上可以动一动游戏摇杆上的两个控制杆与其他按钮,看看在B0~B16以及AXIS0~AXIS3这些钮上面是不是有对应的回馈?
执行第一步骤之后,如果出现以下画面,就表示驱动的加载也都正确。
这个实验只要把游戏摇杆设备的部分捋顺了,后面的实验步骤就非常直观,包括将摄像头“拍照”功能与游戏摇杆的某个键进行绑定的部分,在执行步骤都有非常详细说明,大家只要顺着去执行并且阅读说明,就能轻松完成整个任务。[完]
好文章,需要你的鼓励
微软推出 Copilot+ PC 标准,要求配备高性能 NPU,引发 AI PC 市场格局变化。英伟达虽在数据中心 AI 领域占主导,但在 PC 端面临挑战。文章分析了英伟达的 AI PC 策略、NPU 与 GPU 的竞争关系,以及未来 GPU 可能在 Copilot+ 功能中发挥作用的前景。
专家预测,随着人工智能技术的迅速发展和广泛应用,2025 年可能成为 AI 泡沫破裂的关键一年。尽管 AI 仍有望在多模态模型和自动机器学习等领域取得突破,但技术瓶颈、投资回报率下降、监管趋严以及环境和伦理问题等因素可能导致 AI 热潮降温。未来 AI 发展将更注重平衡和可持续性。
Google 推出名为 Titans 的新型 AI 架构,是 Transformer 的直接进化版。Titans 引入了神经长期记忆、短期记忆和基于惊喜的学习系统,使 AI 更接近人类思维方式。这一突破性技术有望彻底改变 AI 范式,推动机器智能向人类认知迈进一大步。
主动型 AI 是人工智能的下一次进化,它不仅能生成内容,还能自主决策和追求目标。这种 AI 可以设定自己的目标,制定策略并根据情况调整方法,实现真正的自主性。它将彻底改变机器与世界的互动方式,为人机协作开启新的可能性,但也带来了透明度和伦理等挑战。