一起打造自己的自动驾驶小车mycar - 4.手柄控制小车移动
文章目录
- 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文件。
控制信号会发送到CAN
,actuator
和其他订阅者就能作出反应了。本次完整的配置文件如下(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.手柄控制小车移动相关推荐
- 新手入坑自动驾驶,从 JetBot 机器人小车开始,能学到什么?
也许,你曾见过 能灵活地绕开障碍物的它 在桌子边缘"疯狂试探"的它 它是谁? 没错,它就是是英伟达推出的一款入门级人工智能小车--Jetbot ,估计对机器人,尤其是对车械感兴趣的 ...
- 如何从无到有打造一辆自动驾驶车?(硬件篇)
本文字数: 16613 阅读时间:30分钟 如何构建一辆无人驾驶车呢?先从无人驾驶车的硬件开始介绍. 1 简介 无人驾驶车由车.线控系统.传感器.计算单元等组成,如图2.1所示.车作为无人驾驶的载体 ...
- 自动驾驶/智能网联在物流小车末端配送示范应用现状
无人物流配送是智能网联汽车.功能型无人车的重要应用场景之一,发展无人物流配送,能够推动技术升级,加速智能网联汽车的产业化发展.近年来,全球多国都围绕无人物流配送开始了技术及产品布局.2019年9月,中 ...
- 2020自动驾驶年度盘点:L4技术降维应用,自动驾驶由布道走向赶考
来源 | 搜狐汽车.北京市高级别自动驾驶示范区 推荐 | 焉知自动驾驶 摘要: 1. 政策持续鼓励自动驾驶产业发展,各地积极配合相关测试与应用落地,2025年将实现有条件自动驾驶规模化生产: 2. R ...
- 没有新“核弹”,更强调“车规级”和“量产”,英伟达自动驾驶朋友圈进一步扩大 | GTC 中国 2018...
*英伟达创始人兼 CEO 黄仁勋在 GTC China 2018 现场 今年,GPU 霸主英伟达将其每年一度在中国举办的 GTC China 大会搬到了苏州.当前,英伟达正经历股价大跌.市值缩水,此时 ...
- 基于Donkeycar手动实现自动驾驶
基于Donkeycar手动实现自动驾驶 关于Donkeycar小车 本文说明 硬件选择 主板模块 小车选择 驱动模块 其他模块 驱动总结 小车组装 Jetson nano.PCA9685与L298N模 ...
- 英伟达开源自动驾驶AI算法,升级芯片性能7倍于Xavier
2019-12-18 13:24:27 乾明 编辑整理 量子位 报道 | 公众号 QbitAI 一年一度,英伟达GTC China如期举办. 今年的英伟达创始人黄仁勋,对自动驾驶极为关注. 不仅发布 ...
- MIT用19个神经元实现自动驾驶控制,灵感来自秀丽隐杆线虫
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 打造一个自动驾驶控制系统需要多少个神经元? MIT的科学家告诉你,最少只要19个!方法是向线虫这种初等生物学习. 最近,来自MIT CSA ...
- 禾多推出高精度定位和自动驾驶验证平台!倪凯:助力行业量产,定位中国向导...
允中 发自 凹非寺 量子位 报道 | 公众号 QbitAI 倪凯创办的禾多科技又有什么新进展? 最近,禾多对外推出了模块化服务--高精度定位HoloPolaris和自动驾驶验证平台HoloX,称要做 ...
最新文章
- php 评论插件,Typecho评论增强插件:TeComment(2017.09.07更新)
- openresty开发系列2--nginx的简单安装,正向、反向代理及常用命令和信号控制介绍...
- 设计模式:桥接模式(Bridge Pattern)
- 自己动手写一个 strace
- 杭州师范大学c语言程序设计机试,2016年杭州师范大学杭州国际服务工程学院程序设计基础考研复试题库...
- 关于Nocas的几个问题
- 表记录的检索(数据查询)
- JavaScript创建页面节点
- 【Struts2】剖析Struts2中的反射技术 ValueStack(值栈)
- STC12C2052AD+TM1640+DS1302闹钟
- 周鸿祎的“花房上市”执念
- 在C#中使用WIA获取扫描仪数据
- 【自然语言处理】【可解释性】Perturbed Masking:分析和解释BERT的无参数探针
- 长尾效应解析以及长尾效应在电商中的应用
- 数字计算lisp_可从计算尺和LISP中汲取教训
- 数据结构笔记_34 赫夫曼编码压缩、解压文件
- 如何通过golang 连接阿里云的redis实例(golang带账号密码访问redis)
- 张艾迪(创始人): 辍学的互联网天才创始人
- OJ每日一练——空气质量指数
- 美法官:甲骨文与谷歌专利诉讼无法和解
热门文章
- Eigen学习3:矩阵及向量运算
- Linpack测试环境的搭建
- 请求与通配符 mime 映射相匹配。请求映射到静态文件处理程序。如果有不同的前提条件,请求将映射到另一个处理程序。...
- Python修改路由器WIFI账号
- Design Compiler知识点汇总
- android imageview 拉伸图片大小,【教程】安卓保证图片长宽比的同时拉伸图片
- 物权法全文内容有哪些呢-广告外链_有哪些网络推广免费平台
- 转换固态+机械硬盘分区表格式为GPT,UEFI启动,重装WIN10+Ubuntu18.04双系统
- Verilog实现正弦波、三角波、方波、锯齿波的输出
- SCI论文编辑教你如何准备SCI论文和写作 [转]