tnblog
首页
视频
资源
登录

JetBot 对接手柄

1630人阅读 2024/5/11 11:41 总访问:3467446 评论:0 收藏:0 手机
分类: 嵌入式

JetBot 对接手柄

启动手柄


首先将配对手柄的蓝牙插入到电脑中。


启动手柄,推到ON

检查手柄连接


首先打开https://hardwaretester.com/gamepad这个网页


按一下这个键,就会有响应了。


然后你按什么键,这上面都会做出相应的反应。

JetBot对接手柄


首先打开jetbot的JupyterLab,找到这个jetbot/notebooks/teleoperation/teleoperation.ipynb文件。
执行下面的代码,进行jetbot的对接,注意Index的参数是根据刚刚那个页面上显示的index决定的。

  1. import ipywidgets.widgets as widgets
  2. controller = widgets.Controller(index=0)
  3. display(controller)


看到显示出相关的控制键盘,通过操作手柄可对其中进行控制。
然后我们添加相应的控制事件

  1. # 导入JetBot库中的Robot类
  2. from jetbot import Robot
  3. # 导入traitlets模块
  4. import traitlets
  5. # 创建一个Robot对象实例
  6. robot = Robot()
  7. # 创建一个traitlets链接,将游戏手柄控制器(controller)的第一个轴的值与机器人左侧电机的值进行关联
  8. # 控制器的第一个轴通常用于控制前进/后退
  9. left_link = traitlets.dlink((controller.axes[1], 'value'), (robot.left_motor, 'value'), transform=lambda x: -x)
  10. # 创建一个traitlets链接,将游戏手柄控制器(controller)的第三个轴的值与机器人右侧电机的值进行关联
  11. # 控制器的第三个轴通常用于控制左右转向
  12. right_link = traitlets.dlink((controller.axes[3], 'value'), (robot.right_motor, 'value'), transform=lambda x: -x)


现在可以通过手柄的摇杆控制小车了。

创建和显示图片

  1. # 导入widgets模块
  2. import ipywidgets as widgets
  3. # 创建一个空白图像部件,指定图像格式为JPEG,宽度为300像素,高度为300像素
  4. image = widgets.Image(format='jpeg', width=300, height=300)
  5. # 在Jupyter Notebook或JupyterLab中显示图像部件
  6. display(image)


由于摄像头获取到的是gbr格式,但我们需要的是jpeg格式获取。
所以项目的代码将会进行转换成jpeg格式。

  1. # 从JetBot库中导入Camera类
  2. from jetbot import Camera
  3. # 创建一个Camera对象实例
  4. camera = Camera.instance()
  5. # 从JetBot库中导入bgr8_to_jpeg函数
  6. from jetbot import bgr8_to_jpeg
  7. # 创建一个traitlets链接,将摄像头(camera)的值与之前创建的图像部件(image)的值进行关联
  8. # 这样摄像头采集到的图像就会被转换成JPEG格式,并传输给图像部件进行显示
  9. camera_link = traitlets.dlink((camera, 'value'), (image, 'value'), transform=bgr8_to_jpeg)

心跳监听


网突然断开了怎么办。
这里我们将设置0.5s进行监听,如果断开自动停止执行任何命令。

  1. # 从JetBot库中导入Heartbeat类
  2. from jetbot import Heartbeat
  3. # 定义一个回调函数,用于处理心跳状态变化
  4. def handle_heartbeat_status(change):
  5. # 如果心跳状态变为dead(机器人停止工作)
  6. if change['new'] == Heartbeat.Status.dead:
  7. # 解除摄像头、左电机和右电机与相关链接
  8. camera_link.unlink()
  9. left_link.unlink()
  10. right_link.unlink()
  11. # 停止机器人运动
  12. robot.stop()
  13. # 创建一个Heartbeat对象实例,设置心跳检测周期为0.5秒
  14. heartbeat = Heartbeat(period=0.5)
  15. # 将回调函数attach到heartbeat的状态属性
  16. heartbeat.observe(handle_heartbeat_status, names='status')


如果想测试的话可以将心跳的监听调低,毕竟请求也有个时间的。
然后失连后尝试进行重连。

  1. # 只有在机器人的链接已经被解除后才调用这个代码,否则我们会有冗余的链接,会导致命令传输翻倍
  2. left_link = traitlets.dlink((controller.axes[1], 'value'), (robot.left_motor, 'value'), transform=lambda x: -x)
  3. right_link = traitlets.dlink((controller.axes[3], 'value'), (robot.right_motor, 'value'), transform=lambda x: -x)
  4. camera_link = traitlets.dlink((camera, 'value'), (image, 'value'), transform=bgr8_to_jpeg)

保存图像


点击pass键对小车的摄像头拍摄的图像进行保存到snapshots目录下面。

  1. # 导入uuid和subprocess模块
  2. import uuid
  3. import subprocess
  4. # 创建一个名为'snapshots'的文件夹,用于存储快照图片
  5. subprocess.call(['mkdir', '-p', 'snapshots'])
  6. # 创建一个空白图像部件,用于显示捕获到的快照
  7. snapshot_image = widgets.Image(format='jpeg', width=300, height=300)
  8. # 定义一个保存快照的函数
  9. def save_snapshot(change):
  10. # 当按钮被按下时保存快照
  11. if change['new']:
  12. # 生成快照文件的路径,使用uuid来确保文件名的唯一性
  13. file_path = 'snapshots/' + str(uuid.uuid1()) + '.jpg'
  14. # 将快照写入文件(使用image的值而不是camera,因为它已经是JPEG格式)
  15. with open(file_path, 'wb') as f:
  16. f.write(image.value)
  17. # 显示保存的快照
  18. snapshot_image.value = image.value
  19. # 监听手柄的按钮5(通常是右侧的拇指按钮),当按钮状态发生变化时调用保存快照的函数
  20. controller.buttons[5].observe(save_snapshot, names='value')
  21. # 在界面中显示图像和保存的快照
  22. display(widgets.HBox([image, snapshot_image]))
  23. display(controller)


最后执行关闭摄像头的操作。

  1. camera.stop()

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

JetBot AI 烧写镜像学习笔记一

JetBot AI 烧写镜像学习笔记一[TOC] 购买JetBot【淘宝】https://m.tb.cn/h.g0v9FnntUA6422l?tk=UfJuWIAKI2n HU9196 「英...

JetBot 自主避障

JetBot 自主避障[TOC] 数据采集要实现自主避障首先我们需要采集数据,所以我们需要一个采集障碍物和非障碍物的图片。工作...

JetBot uboot中运行程序

jetbot uboot中运行程序[TOC] 创建裸机程序编写一个led.s的程序 mov x3,#0x5A mov x4,#0x55 loop: b loop...

JetBot 硬件架构图与电路图

jetbot 硬件架构图与电路图[TOC] jetbot gpu有128个cuda核心,cpu有4核 ARM A57。这里我们使用的是4G内存。接着我们来看...

JetBot 芯片手册

jetbot 芯片手册[TOC] 什么是芯片手册控制芯片的详细说明。3.1CPU芯片手册Tegra_X1_TRM_DP07225001_v1.3p.pdf - 891 KB ...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术