文章目录

  • 1. 蓝牙游戏手柄
    • 1.2 手柄配置
      • 轴(axis):
      • 按钮(button):
    • 1.3 按键功能
    • 1.4 代码实现
  • 2. 录制视频
  • 3. 运行
    • 3.1 clone代码
    • 3.2 连接蓝牙手柄
    • 3.3 启动

上一篇文章介绍了用web界面来控制小车移动,这篇文章介绍用蓝牙游戏手柄来控制小车的移动。物理手柄的控制会更加得心应手,不会受网络延迟的影响。

1. 蓝牙游戏手柄

笔者使用的一款价格约100元的小鸡蓝牙手柄,理论上所有带蓝牙功能的手柄都支持,如PS3, Xbox One等等。

1.2 手柄配置

不管什么型号的手柄,一般都有相似的功能按钮,分为以下两类:轴和按钮。

轴(axis):

能输出连续变化的值,如:

  • L2, R2是根据按压的力度输出从0~32767的值;
  • 左右摇杆(left_stick, right_stick)是输出两个方向从-32767~32767的值:up_down、left_right,摇杆不动(居中)的值是0。

按钮(button):

只有0或1的值,按下去为1。如D Pad的上下左右4个按钮,L1, R1;L2和R2也能同时输出是否被按下。

从手柄设备的设备文件(如/dev/input/js0)可以读出手柄的控制信号,信号包含操作的按钮/轴和它的值。按钮/轴由一个16进制的数字来标识。不同厂商/型号的手柄的数字标识是不一样的,需要在配置文件指定。如config/joystick_drive.yml里的配置就是我的小鸡手柄G3的映射值。

Joystick类定义了通用的按钮名,你只需要配置不同按钮的标识就可以了。

  joystick:axis_keys:'left_stick_horz': 0x00  # 左摇杆的水平方向'left_stick_vert': 0x01  # 左摇杆的垂直方向'right_stick_horz': 0x02'right_stick_vert': 0x05'dpad_leftright': 0x10  # 方向按键的左右方向'dpad_up_down': 0x11  # 方向按键的上下方向'L2_pressure': 0x0a  # L2的按压压力'R2_pressure': 0x09 # R2的按压压力button_keys:'select': 0x13a  # 选择键'start': 0x13b  # 开始键'L1': 0x136'R1': 0x137'L2': 0x138'R2': 0x139'left_stick_press': 0x13d  # 左摇杆被按下'right_stick_press': 0x13e  # 右摇杆被按下'A': 0x130'B': 0x131'X': 0x133'Y': 0x134

自己的手柄连上电脑后,可以到https://html5gamepad.com/这个网站检测自己的手柄的按键。然后写到配置文件就可以了。

1.3 按键功能

我们控制小车不需要用完上面的全部按键。源码中的Joystick类给不同的按钮/轴绑定了对小车做不同的操作。具体有:

  • 左摇杆水平方向(left_stick_horz):控制小车的左右转向(steering)。
  • 右摇杆的竖直方向(right_stick_vert):控制小车的前进和后退(throttle)。
  • Y: 切换自动驾驶/手动驾驶模式
  • B: 切换录像开/关
  • L1: 降低最高速度
  • R1: 提高最高速度

其他按键暂时没有用到,可以留作以后扩展更多功能。你也可以修改配置文件来绑定不同的按键。

1.4 代码实现

jetson nano连上蓝牙手柄会产生一个设备文件,如/dev/input/js0,我们不断读取该文件,解析读到的指就可以了。部分代码参考了donkeycar的controller文件。

控制信号会发送到CANactuator和其他订阅者就能作出反应了。本次完整的配置文件如下(config/joystick_drive.yml):


2. 录制视频

本次文章篇幅不长,我们顺便实现录制视频的功能,同样比较简单,只需要使用cv2.VideoWriter类把摄像头的图像逐帧写入文件就可以了。

writer = cv2.VideoWriter(file_name,cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'),frame_rate,(width, height))
writer.write(frame)

默认VideoRecorder类会保存一个capture.avi文件到当前目录。也可通过配置文件指定路径和文件名,还有分辨率、帧率。见上一章节的video_recorder配置。

3. 运行

文章的代码已经开源到github mycar项目。

3.1 clone代码

git clone https://github.com/evan-wu/mycar
git checkout -b blog-4

3.2 连接蓝牙手柄

把手柄打开,进入蓝牙配对模式,然后在jetson nano的蓝牙设置点+号找到手柄,连接上就可以了。以下是我的蓝牙手柄:

连接上以后可以查看一下对应的设备文件:

$ file /dev/input/js0
/dev/input/js0: character special (13/0)

3.3 启动

cd mycar
bin/run.sh config/joystick_drive.yml 120

可以使用手柄来控制小车移动了,按B可以开始录像!

后续预告:视觉PID循线算法。敬请期待!

欢迎blog/github点赞,评论,讨论!

一起打造自己的自动驾驶小车mycar - 4.手柄控制小车移动相关推荐

  1. 新手入坑自动驾驶,从 JetBot 机器人小车开始,能学到什么?

    也许,你曾见过 能灵活地绕开障碍物的它 在桌子边缘"疯狂试探"的它 它是谁? 没错,它就是是英伟达推出的一款入门级人工智能小车--Jetbot ,估计对机器人,尤其是对车械感兴趣的 ...

  2. 如何从无到有打造一辆自动驾驶车?(硬件篇)

    本文字数: 16613  阅读时间:30分钟 如何构建一辆无人驾驶车呢?先从无人驾驶车的硬件开始介绍. 1 简介 无人驾驶车由车.线控系统.传感器.计算单元等组成,如图2.1所示.车作为无人驾驶的载体 ...

  3. 自动驾驶/智能网联在物流小车末端配送示范应用现状

    无人物流配送是智能网联汽车.功能型无人车的重要应用场景之一,发展无人物流配送,能够推动技术升级,加速智能网联汽车的产业化发展.近年来,全球多国都围绕无人物流配送开始了技术及产品布局.2019年9月,中 ...

  4. 2020自动驾驶年度盘点:L4技术降维应用,自动驾驶由布道走向赶考

    来源 | 搜狐汽车.北京市高级别自动驾驶示范区 推荐 | 焉知自动驾驶 摘要: 1. 政策持续鼓励自动驾驶产业发展,各地积极配合相关测试与应用落地,2025年将实现有条件自动驾驶规模化生产: 2. R ...

  5. 没有新“核弹”,更强调“车规级”和“量产”,英伟达自动驾驶朋友圈进一步扩大 | GTC 中国 2018...

    *英伟达创始人兼 CEO 黄仁勋在 GTC China 2018 现场 今年,GPU 霸主英伟达将其每年一度在中国举办的 GTC China 大会搬到了苏州.当前,英伟达正经历股价大跌.市值缩水,此时 ...

  6. 基于Donkeycar手动实现自动驾驶

    基于Donkeycar手动实现自动驾驶 关于Donkeycar小车 本文说明 硬件选择 主板模块 小车选择 驱动模块 其他模块 驱动总结 小车组装 Jetson nano.PCA9685与L298N模 ...

  7. 英伟达开源自动驾驶AI算法,升级芯片性能7倍于Xavier

    2019-12-18 13:24:27 乾明 编辑整理  量子位 报道 | 公众号 QbitAI 一年一度,英伟达GTC China如期举办. 今年的英伟达创始人黄仁勋,对自动驾驶极为关注. 不仅发布 ...

  8. MIT用19个神经元实现自动驾驶控制,灵感来自秀丽隐杆线虫

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 打造一个自动驾驶控制系统需要多少个神经元? MIT的科学家告诉你,最少只要19个!方法是向线虫这种初等生物学习. 最近,来自MIT CSA ...

  9. 禾多推出高精度定位和自动驾驶验证平台!倪凯:助力行业量产,定位中国向导...

    允中 发自 凹非寺  量子位 报道 | 公众号 QbitAI 倪凯创办的禾多科技又有什么新进展? 最近,禾多对外推出了模块化服务--高精度定位HoloPolaris和自动驾驶验证平台HoloX,称要做 ...

最新文章

  1. php 评论插件,Typecho评论增强插件:TeComment(2017.09.07更新)
  2. openresty开发系列2--nginx的简单安装,正向、反向代理及常用命令和信号控制介绍...
  3. 设计模式:桥接模式(Bridge Pattern)
  4. 自己动手写一个 strace
  5. 杭州师范大学c语言程序设计机试,2016年杭州师范大学杭州国际服务工程学院程序设计基础考研复试题库...
  6. 关于Nocas的几个问题
  7. 表记录的检索(数据查询)
  8. JavaScript创建页面节点
  9. 【Struts2】剖析Struts2中的反射技术 ValueStack(值栈)
  10. STC12C2052AD+TM1640+DS1302闹钟
  11. 周鸿祎的“花房上市”执念
  12. 在C#中使用WIA获取扫描仪数据
  13. 【自然语言处理】【可解释性】Perturbed Masking:分析和解释BERT的无参数探针
  14. 长尾效应解析以及长尾效应在电商中的应用
  15. 数字计算lisp_可从计算尺和LISP中汲取教训
  16. 数据结构笔记_34 赫夫曼编码压缩、解压文件
  17. 如何通过golang 连接阿里云的redis实例(golang带账号密码访问redis)
  18. 张艾迪(创始人): 辍学的互联网天才创始人
  19. OJ每日一练——空气质量指数
  20. 美法官:甲骨文与谷歌专利诉讼无法和解

热门文章

  1. Eigen学习3:矩阵及向量运算
  2. Linpack测试环境的搭建
  3. 请求与通配符 mime 映射相匹配。请求映射到静态文件处理程序。如果有不同的前提条件,请求将映射到另一个处理程序。...
  4. Python修改路由器WIFI账号
  5. Design Compiler知识点汇总
  6. android imageview 拉伸图片大小,【教程】安卓保证图片长宽比的同时拉伸图片
  7. 物权法全文内容有哪些呢-广告外链_有哪些网络推广免费平台
  8. 转换固态+机械硬盘分区表格式为GPT,UEFI启动,重装WIN10+Ubuntu18.04双系统
  9. Verilog实现正弦波、三角波、方波、锯齿波的输出
  10. SCI论文编辑教你如何准备SCI论文和写作 [转]