
JetBot 对接手柄
启动手柄
首先将配对手柄的蓝牙插入到电脑中。
启动手柄,推到ON
检查手柄连接
首先打开https://hardwaretester.com/gamepad
这个网页
按一下这个键,就会有响应了。
然后你按什么键,这上面都会做出相应的反应。
JetBot对接手柄
首先打开jetbot的JupyterLab,找到这个jetbot/notebooks/teleoperation/teleoperation.ipynb
文件。
执行下面的代码,进行jetbot的对接,注意Index的参数是根据刚刚那个页面上显示的index决定的。
import ipywidgets.widgets as widgets
controller = widgets.Controller(index=0)
display(controller)
看到显示出相关的控制键盘,通过操作手柄可对其中进行控制。
然后我们添加相应的控制事件
# 导入JetBot库中的Robot类
from jetbot import Robot
# 导入traitlets模块
import traitlets
# 创建一个Robot对象实例
robot = Robot()
# 创建一个traitlets链接,将游戏手柄控制器(controller)的第一个轴的值与机器人左侧电机的值进行关联
# 控制器的第一个轴通常用于控制前进/后退
left_link = traitlets.dlink((controller.axes[1], 'value'), (robot.left_motor, 'value'), transform=lambda x: -x)
# 创建一个traitlets链接,将游戏手柄控制器(controller)的第三个轴的值与机器人右侧电机的值进行关联
# 控制器的第三个轴通常用于控制左右转向
right_link = traitlets.dlink((controller.axes[3], 'value'), (robot.right_motor, 'value'), transform=lambda x: -x)
现在可以通过手柄的摇杆控制小车了。
创建和显示图片
# 导入widgets模块
import ipywidgets as widgets
# 创建一个空白图像部件,指定图像格式为JPEG,宽度为300像素,高度为300像素
image = widgets.Image(format='jpeg', width=300, height=300)
# 在Jupyter Notebook或JupyterLab中显示图像部件
display(image)
由于摄像头获取到的是gbr格式,但我们需要的是jpeg格式获取。
所以项目的代码将会进行转换成jpeg格式。
# 从JetBot库中导入Camera类
from jetbot import Camera
# 创建一个Camera对象实例
camera = Camera.instance()
# 从JetBot库中导入bgr8_to_jpeg函数
from jetbot import bgr8_to_jpeg
# 创建一个traitlets链接,将摄像头(camera)的值与之前创建的图像部件(image)的值进行关联
# 这样摄像头采集到的图像就会被转换成JPEG格式,并传输给图像部件进行显示
camera_link = traitlets.dlink((camera, 'value'), (image, 'value'), transform=bgr8_to_jpeg)
心跳监听
网突然断开了怎么办。
这里我们将设置0.5s进行监听,如果断开自动停止执行任何命令。
# 从JetBot库中导入Heartbeat类
from jetbot import Heartbeat
# 定义一个回调函数,用于处理心跳状态变化
def handle_heartbeat_status(change):
# 如果心跳状态变为dead(机器人停止工作)
if change['new'] == Heartbeat.Status.dead:
# 解除摄像头、左电机和右电机与相关链接
camera_link.unlink()
left_link.unlink()
right_link.unlink()
# 停止机器人运动
robot.stop()
# 创建一个Heartbeat对象实例,设置心跳检测周期为0.5秒
heartbeat = Heartbeat(period=0.5)
# 将回调函数attach到heartbeat的状态属性
heartbeat.observe(handle_heartbeat_status, names='status')
如果想测试的话可以将心跳的监听调低,毕竟请求也有个时间的。
然后失连后尝试进行重连。
# 只有在机器人的链接已经被解除后才调用这个代码,否则我们会有冗余的链接,会导致命令传输翻倍
left_link = traitlets.dlink((controller.axes[1], 'value'), (robot.left_motor, 'value'), transform=lambda x: -x)
right_link = traitlets.dlink((controller.axes[3], 'value'), (robot.right_motor, 'value'), transform=lambda x: -x)
camera_link = traitlets.dlink((camera, 'value'), (image, 'value'), transform=bgr8_to_jpeg)
保存图像
点击pass键对小车的摄像头拍摄的图像进行保存到snapshots
目录下面。
# 导入uuid和subprocess模块
import uuid
import subprocess
# 创建一个名为'snapshots'的文件夹,用于存储快照图片
subprocess.call(['mkdir', '-p', 'snapshots'])
# 创建一个空白图像部件,用于显示捕获到的快照
snapshot_image = widgets.Image(format='jpeg', width=300, height=300)
# 定义一个保存快照的函数
def save_snapshot(change):
# 当按钮被按下时保存快照
if change['new']:
# 生成快照文件的路径,使用uuid来确保文件名的唯一性
file_path = 'snapshots/' + str(uuid.uuid1()) + '.jpg'
# 将快照写入文件(使用image的值而不是camera,因为它已经是JPEG格式)
with open(file_path, 'wb') as f:
f.write(image.value)
# 显示保存的快照
snapshot_image.value = image.value
# 监听手柄的按钮5(通常是右侧的拇指按钮),当按钮状态发生变化时调用保存快照的函数
controller.buttons[5].observe(save_snapshot, names='value')
# 在界面中显示图像和保存的快照
display(widgets.HBox([image, snapshot_image]))
display(controller)
最后执行关闭摄像头的操作。
camera.stop()
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
评价
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 :
好是好,这个对效率影响大不大哇,效率高不高
一个bug让程序员走上法庭 索赔金额达400亿日元
剑轩 : 有点可怕
ASP.NET Core 服务注册生命周期
剑轩 :
http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术