< >
Home » Jetbot-AI机器人教程 » Jetbot-AI机器人教程-游戏杆控制

Jetbot-AI机器人教程-游戏杆控制

Jetbot-AI机器人教程-游戏杆控制

说明:

  • 介绍如何游戏杆控制小车
  • 此示例需要连接到工作站的游戏手柄控制器。
  • 在这个例子中,我们将远程驱动JetBot,查看实时流视频,并保存快照!

步骤:

  • 界面:

请输入图片描述

  • 通过导航到http://<jetbot_ip_address>:8888连接到您的机器人

  • 使用默认密码jetbot登录

  • 通过选择Kernel -> Shutdown All Kernels...来关闭所有其他正在运行的notebooks

  • 导航到~/Notebooks/teleoperation/

  • 打开并跟随teleoperation.ipynb笔记操作

  • 将游戏手柄接收器插到电脑USB口,接收器是要接到电脑而不是接到jetson nano上,游戏手柄需要接到打开JupyterLab网页的设备上

  • 打开https://html5gamepad.com/,看下是否检查到遥控手柄,记下对应设备的index数值为多少

  • 按下遥控手柄按键对应的数值会变化

  • 运行下面代码后,窗口会输出游戏手柄对应的按键。

  • 注意程序中的index需要修改为实际遥控手柄对应的值,在刚才打开的网页中可以看到对应的index。按下按键对应的按键图标,会提示按键已按下

import ipywidgets.widgets as widgets

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

display(controller)
  • 修改axes值对应不同的按钮,此处为方便遥控改为axes【1】, axels【3】。一个摇杆控制左轮,另一个摇杆控制右轮
from jetbot import Robot
import traitlets

robot = Robot()

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)
  • 运行到下面的代码时,窗口会显示当前摄像头拍摄到的画面
from jetbot import bgr8_to_jpeg

camera_link = traitlets.dlink((camera, 'value'), (image, 'value'), transform=bgr8_to_jpeg)
  • “心跳”检查,当小车断网时小车会自动停止
from jetbot import Heartbeat

def handle_heartbeat_status(change):
    if change['new'] == Heartbeat.Status.dead:
        camera_link.unlink()
        left_link.unlink()
        right_link.unlink()
        robot.stop()

heartbeat = Heartbeat(period=0.5)

# attach the callback function to heartbeat status
heartbeat.observe(handle_heartbeat_status, names='status')

# only call this if your robot links were unlinked, otherwise we'll have redundant links which will double
# the commands transfered

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)
  • 通过按键控制小车拍照,改变button可以选择不同的按键,此处为了方便控制选择buttons【0】
import uuid
import subprocess

subprocess.call(['mkdir', '-p', 'snapshots'])

snapshot_image = widgets.Image(format='jpeg', width=300, height=300)

def save_snapshot(change):
    # save snapshot when button is pressed down
    if change['new']:
        file_path = 'snapshots/' + str(uuid.uuid1()) + '.jpg'

        # write snapshot to file (we use image value instead of camera because it's already in JPEG format)
        with open(file_path, 'wb') as f:
            f.write(image.value)

        # display snapshot that was saved
        snapshot_image.value = image.value

controller.buttons[5].observe(save_snapshot, names='value')

display(widgets.HBox([image, snapshot_image]))
display(controller)
  • 运行程序之后即可通过遥控手柄控制小车。Asex【0】控制左边轮子,Asex1控制右边笼子,button【0】控制拍照,左边图像显示摄像头实时画面,右边为拍摄的图片,图片保存在snapshots文件下

演示视频

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: jetbot-ai机器人教程