控制器部件
Web控制器
这是用手机或浏览器驾驶小车的默认控制器。它具有相机的Web实时预览。控制选项包括:
- 虚拟摇杆
- 当使用支持加速度计的移动设备时,可以使用倾斜控制
- 使用Web适配器的物理摇杆。支持情况因浏览器、操作系统和摇杆组合而异。
- 通过键盘输入的'ikjl'键。
注意:最近iOS已经禁用了Safari默认对运动控制的访问。
RC控制器
如果您购买的是一辆RC车,那么它可能配有标准的2.4GHz汽车遥控器和接收器,如下图所示。可以使用它来驾驶小车。有几种方法可以实现这一点
* 您可以使用能够模拟USB HID设备的Teensy或Arduino微控制器,并使用此arduino sketch使您的RC控制器模拟游戏控制器。有关接线和使用该sketch的说明可以在相关的wiki中找到。设置完成后,您将在myconfig.py
配置中选择CONTROLLER_TYPE = "rc3"
作为控制器类型。
* 最后,您可以使用Donkeycar RC Hat。这个板子插入到树莓派的GPIO引脚头上,并公开与RC接收器的舵机和油门通道的连接。它还可以用来控制小车的舵机和电调,因此您不需要PCA9685板。它还包括一个非常方便的OLED显示屏,可以在启动时显示小车的IP地址;请参阅这篇DIYRobocars文章。有关如何设置RC Hat的文档。Donkeycar RC Hat可以在Donkeycar商店中购买。
* 您可以将RC车的接收器直接连接到树莓派的GPIO引脚上,以读取RC控制器发送的PWM转向和油门信号的长度。请注意,我们不建议Jetson Nano用户这样做;GPIO支持不足够。您还可以使用树莓派的引脚直接输出PWM到汽车的舵机和电调,而无需使用I2C舵机驱动板。您需要在树莓派上安装PiGPIO驱动程序才能使其工作;它不是默认安装的。如果将RC接收器连接到GPIO引脚上,您将在myconfig.py
配置中选择CONTROLLER_TYPE = pigpio_rc
。有关通过GPIO引脚实现RC控制器和舵机/电调控制的完整教程,请参阅这里。
* 最后,您可以使用Donkeycar RC Hat。这个板子插入到树莓派的GPIO引脚头上,并公开与RC接收器的舵机和油门通道的连接。它还可以用来控制小车的舵机和电调,因此您不需要PCA9685板。它还包括一个非常方便的OLED显示屏,可以在启动时显示小车的IP地址;请参阅这篇DIYRobocars文章。有关如何设置RC Hat的文档。Donkeycar RC Hat可以在Donkeycar商店中购买。
手柄控制器
许多人发现使用游戏手柄更容易控制小车。有几种部件可以实现这个选项。
默认的Web控制器可以通过一行代码更改来使用物理手柄进行输入。默认情况下,它使用操作系统设备/dev/input/js0
。理论上,任何操作系统挂载为此的手柄设备都可以使用。实际上,行为将根据手柄型号(索尼或山寨)、XBox控制器以及用于支持它的蓝牙驱动程序而改变。默认代码已经编写并测试了一个索尼品牌的PS3 Sixaxis手柄。其他控制器可能也可以工作,但需要替代的蓝牙安装和对软件进行调整以获得正确的轴和按钮。
已知可以工作的手柄有:
- Logitech Gamepad F710
- 索尼PS3 Sixaxis OEM(不兼容Jetson Nano)
- 索尼PS4 Dualshock OEM
- WiiU Pro
- XBox控制器
要启用这些手柄,请找到myconfig.py
中的CONTROLLER_TYPE
并将其设置为正确的字符串标识符(取消注释后)。
这些手柄可以使用USB电缆连接。使用蓝牙进行无线控制更加方便。
下面是一些特定手柄的设置细节。
注意:如果您有一个没有在下面列表中列出的手柄,或者您在让手柄工作时遇到问题,或者您想以不同的方式映射手柄,请参阅创建新的或自定义游戏手柄。
Change myconfig.py or run with --js
python manage.py drive --js
启用操纵杆驱动功能。这将禁用摄像头的实时预览和网页功能。如果您修改myconfig.py文件中的USE_JOYSTICK_AS_DEFAULT = True
,那么您就不需要使用--js
参数来运行。
PS3手柄
蓝牙设置
请按照这个指南进行操作。如果链接失效,可以忽略超过"Accessing the SixAxis from Python"部分的步骤。我将在下面列出步骤,以防链接失效。
sudo apt-get install bluetooth libbluetooth3 libusb-dev
sudo systemctl enable bluetooth.service
sudo usermod -G bluetooth -a pi
在更改用户组后重新启动系统。
使用USB电缆将PS3手柄连接到计算机。按下中间的PS徽标按钮。获取并构建命令行配对工具。运行该工具:
wget http://www.pabr.org/sixlinux/sixpair.c
gcc -o sixpair sixpair.c -lusb
sudo ./sixpair
Use bluetoothctl to pair
bluetoothctl
agent on
devices
trust <MAC ADDRESS>
default-agent
quit
拔下USB电缆。按下中间的PS徽标按钮。
为了测试蓝牙PS3遥控器是否正常工作,请验证/dev/input/js0
是否存在:
ls /dev/input/js0
故障排除
如果树莓派上的蓝牙连接不起作用,您可能会在bluetoothctl
中看到类似以下内容:
[NEW] Controller 00:11:22:33:44:55 super-donkey [default]
[NEW] Device AA:BB:CC:DD:EE:FF PLAYSTATION(R)3 Controller
[CHG] Device AA:BB:CC:DD:EE:FF Connected: yes
[CHG] Device AA:BB:CC:DD:EE:FF Connected: no
[CHG] Device AA:BB:CC:DD:EE:FF Connected: yes
[CHG] Device AA:BB:CC:DD:EE:FF Connected: no
[CHG] Device AA:BB:CC:DD:EE:FF Connected: yes
...
[CHG] Device AA:BB:CC:DD:EE:FF Connected: yes
[CHG] Device AA:BB:CC:DD:EE:FF Connected: no
[bluetooth]#
尝试通过运行以下命令来更新Linux内核和固件:
sudo rpi-update
然后重新启动:
sudo reboot
充电PS3 Sixaxis手柄
由于某种原因,它们不喜欢在没有活动的蓝牙控制和操作系统驱动程序的供电USB端口上充电。这意味着普通的手机类型的USB充电器不起作用。请尝试使用带有供电的Linux或Mac笔记本电脑的USB端口。在插入并按下中间的PS徽标后,您应该会看到灯光闪烁。
充电后,您需要再次将手柄插入树莓派,按下PS徽标,然后拔出以重新配对。
PS3 Sixaxis手柄的新电池
有时这些手柄可能非常老旧。这是一个新电池的链接。在取下手柄盖时要小心。解下5颗螺钉。在手柄把手之间的上半部分有一个卡片。您需要从前方分开/打开它,并在此过程中向前拉动底部,否则您会像我一样把卡片弄断。
Linux上的PS3鼠标问题
有时插入PS3手柄后,它会接管您的鼠标。如果您想防止这种情况发生,可以运行以下命令:
xinput set-prop "Sony PLAYSTATION(R)3 Controller" "Device Enabled" 0
PS4 DualShock 4无线游戏手柄控制器
以下说明适用于运行Raspberry Pi OS Buster的Raspberry Pi 3或4。 DS4游戏手柄将通过蓝牙连接,无需安装任何额外的软件。Bluetoothd是一个系统服务,会在启动时自动作为守护进程运行。Bluetoothctl是一个用于管理连接和配对设备的程序。
配置用户帐户以在无需sudo的情况下使用Bluetoothctl
将pi用户添加到bluetooth组。然后重新启动以使更改生效。
sudo usermod -a -G bluetooth pi
sudo reboot
扫描PS4游戏手柄
重新启动后,运行bluetoothctl,打开扫描器以查找蓝牙设备。下面是一个示例响应。请注意,实际的十六进制字符在您的设备上会有所不同!
bluetoothctl
<response> Agent registered
<response> [bluetooth]#
scan on
<response>
[CHG] Controller BB:22:EE:77:BB:CC Discovering: yes
[NEW] Device 10:20:30:40:50:60 10-20-30-40-50-60
[NEW] Device 10:20:30:40:50:70 10-20-30-40-50-70
[NEW] Device 10:20:30:40:50:80 10-20-30-40-50-80
[NEW] Device 10:20:30:40:50:90 10-20-30-40-50-90
[NEW] Device 20:AA:88:44:BB:10 WHSCL1
请等待几分钟,让扫描器找到所有已存在的蓝牙设备。现在,通过同时按住Share按钮和PlayStation按钮将游戏手柄设置为配对模式,直到灯光双闪。您应该会看到一个新的条目,表示一个无线控制器。
<response>
[NEW] Device 1C:AA:BB:99:DD:AA Wireless Controller
Turn off scanning to stop the status reporting
scan off
连接您的PS4游戏手柄
现在您将连接、配对和信任PS4游戏手柄无线控制器。信任已配对的设备将使您能够在树莓派重新启动后重新连接到该设备。复制无线控制器的地址。您将输入CONNECT "您的无线控制器地址",TRUST "您的无线控制器地址"。在本例中,"您的无线控制器地址" 是 1C:AA:BB:99:DD:AA。
connect 1C:AA:BB:99:DD:AA
<response>
Attempting to connect to 1C:AA:BB:99:DD:AA
[CHG] Device 1C:AA:BB:99:DD:AA Connected: yes
[CHG] Device 1C:AA:BB:99:DD:AA UUIDs: 00001124-0000-1000-8000-00805f9b34fb
[CHG] Device 1C:AA:BB:99:DD:AA UUIDs: 00001200-0000-1000-8000-00805f9b34fb
[CHG] Device 1C:AA:BB:99:DD:AA ServicesResolved: yes
[CHG] Device 1C:AA:BB:99:DD:AA Paired: yes
Connection successful
PS4游戏手柄的指示灯现在应该是常亮的。现在信任PS4游戏手柄无线控制器。
trust 1C:AA:BB:99:DD:AA
<response>
[CHG] Device 1C:AA:BB:99:DD:AA Trusted: yes
Changing 1C:AA:BB:99:DD:AA trust succeeded
Type devices to see the paired-devices.
paired-devices
<response>
Device 1C:AA:BB:99:DD:AA Wireless Controller
Type quit or exit to quit the program bluetoothctl
quit
使用您的PS4游戏手柄无线控制器
在启动树莓派后,按下PlayStation按钮一次。指示灯会闪烁约5秒钟,然后变为常亮。如果指示灯熄灭,请再试一次。如果这样还不行,请运行bluetoothctl
命令并验证设备和已配对设备。
devices
<response>
Device 1C:AA:BB:99:DD:AA Wireless Controller
paired-devices
<response>
Device 1C:A0:B8:9B:DB:A2 Wireless Controller
如果连接失败,在运行bluetoothctl
命令时,请按一次PlayStation按钮。一个良好的响应将是:
<response>
[CHG] Device 1C:AA:BB:99:DD:AA Connected: yes
要将手柄从树莓派断开连接,请按住PlayStation按钮10秒钟。
PS4手柄(适用于Raspian Stretch)
安装ds4drv
通过SSH在您的树莓派上运行以下命令来直接安装它:
sudo /home/pi/env/bin/pip install ds4drv
授予ds4drv
权限
sudo wget https://raw.githubusercontent.com/chrippa/ds4drv/master/udev/50-ds4drv.rules -O /etc/udev/rules.d/50-ds4drv.rules
sudo udevadm control --reload-rules
sudo udevadm trigger
运行ds4drv
ds4drv --hidraw --led 00ff00
如果看到Failed to create input device: "/dev/uinput" cannot be opened for writing
,请重新启动并重试。可能需要重新启动才能使权限授予步骤生效。
一些手柄不支持--hidraw
选项。如果是这种情况,请尝试不带此选项的命令。--led 00ff00
用于改变灯条颜色,这是可选的。
进入配对模式
按住Share按钮,然后按住PS按钮,直到灯条开始闪烁。如果几秒钟后变为绿色,表示配对成功。
在启动时在后台运行ds4drv
sudo nano /etc/rc.local
粘贴以下内容:
/home/pi/env/bin/ds4drv --led 00ff00
保存并退出。根据您使用的特定手柄,可以选择使用或不使用--hidraw
选项。
要断开连接,终止ds4drv
进程,并按住PS按钮10秒钟以关闭手柄电源。
Xbox One手柄
蓝牙配对
这段代码假设使用内置的Linux驱动程序来支持“Xbox Wireless Controller”,这个驱动程序已经预装在Raspbian上,所以不需要安装其他驱动程序。手柄通常会显示在/dev/input/js0
上。还有另一个叫做xboxdrv的用户态驱动程序,本代码没有与该驱动程序进行测试。
Xbox One手柄要求将蓝牙参数disable_ertm
设置为true
。要做到这一点:
Jetson Nano
来源:https://www.roboticsbuildlog.com/hardware/xbox-one-controller-with-nvidia-jetson-nano
- 在禁用 ertm 之前,请安装以下 Python 库:
sudo apt-get install nano
- 为您的输入文件夹添加非根用户访问权限:
sudo usermod -a -G dialout $USER
sudo reboot
- 安装 sysfsutils:
sudo apt-get install sysfsutils
- 编辑配置文件以禁用蓝牙 ertm:
sudo nano /etc/sysfs.conf
- 在配置文件的末尾添加以下内容:
/module/bluetooth/parameters/disable_ertm=1
- 重新启动计算机:
sudo reboot
- 重新配对 Xbox One 蓝牙手柄
-
如果您已经尝试过配对手柄,请先取消配对(忘记设备),然后重新配对。您可以使用 Jetpack 附带的蓝牙管理器 GUI 应用程序进行操作,或者如果您使用命令行,则使用 bluetoothctl:
-
打开终端并输入:
bluetoothctl
- 然后您应该看到您已配对的设备列表及其相应的 MAC 地址。如果没有看到,请输入:
paired-devices
- 要取消配对设备,请输入(将 aa:bb:cc:dd:ee:ff 替换为要取消配对的设备的 MAC 地址):
remove aa:bb:cc:dd:ee:ff exit
- 使用蓝牙管理器 GUI 或 bluetoothctl 进行设备配对(参见 Raspberry Pi OS 指令,以
sudo bluetoothctl
开头的部分)
配对成功后,Xbox 按钮上的指示灯应该常亮,并且蓝牙连接稳定。
RaspberryPi OS
- 编辑文件
/etc/modprobe.d/xbox_bt.conf
(如果该文件不存在,则创建它) - 添加以下行:
options bluetooth disable_ertm=1
- 重新启动以使更改生效。
- 重新启动后,您可以通过在终端中输入以下命令来验证
disable_ertm
是否设置为 true:
bash
cat /sys/module/bluetooth/parameters/disable_ertm
- 如果结果打印出 'Y',则表示设置成功。如果没有,请确保上述步骤已正确执行。
完成上述步骤后,您可以使用蓝牙工具将控制器配对到您的树莓派上。在 bash shell 提示符下输入以下命令:
sudo bluetoothctl
这将启动交互式模式下的蓝牙配对。接下来的命令将在该交互式会话中输入。输入以下命令:
agent on
default-agent
scan on
最后一个命令将启动树莓派扫描新的蓝牙设备。此时,使用控制器顶部的大圆形 'X' 按钮打开您的 Xbox One 控制器,然后按下控制器前面的 'sync' 按钮启动配对模式。几分钟后,您应该在输出中看到控制器的设备信息,类似于以下内容:
[NEW] Device B8:27:EB:A4:59:08 XBox One Wireless Controller
记录下 MAC 地址,您将在后续步骤中需要它。输入以下命令与控制器配对:
connect YOUR_MAC_ADDRESS
其中 YOUR_MAC_ADDRESS
是您之前复制的 MAC 地址。如果第一次尝试时无法连接,请再试几次。可能需要尝试几次才能成功连接。如果您的控制器连接后立即断开连接,则可能是 disable_ertm
设置有误(参见上述步骤)。
一旦您的控制器连接成功,控制器顶部的大圆形 'X' 按钮应该会变成纯白色。输入以下命令完成设置:
trust YOUR_MAC_ADDRESS
quit
现在,您的控制器已被信任,当您的树莓派和控制器都开启时,它们应该会自动连接。如果控制器无法连接,请重新运行蓝牙配对的步骤。
创建新的或自定义游戏控制器
要发现或修改控制器的按钮和轴映射,您可以使用 Joystick Wizard。Joystick Wizard 将在您的 mycar 文件夹中写入一个名为 'my_joystick.py' 的自定义控制器。要使用自定义控制器,请在您的 myconfig.py 中设置 CONTROLLER_TYPE="custom"
。