Ubuntu22.04+ROS2环境下SkyController识别、拦截及映射问题求助
解决方案:Parrot Bebop 2 SkyController 识别与命令拦截问题
一、Ubuntu 22.04识别SkyController为输入设备
1. 切换SkyController到可识别模式
SkyController默认并非HID手柄模式,需手动切换:
- 关闭控制器,按住配对键(带小飞机图标的按键)+电源键,直到LED交替闪烁后松开
- 此时通过USB-C连接电脑,再执行
lsusb或dmesg | grep usb查看设备是否被识别
2. 安装依赖驱动
Ubuntu默认缺少部分HID设备驱动,执行以下命令安装:
sudo apt update && sudo apt install libhidapi-hidraw0 usbutils bluez bluez-tools
安装后重启蓝牙服务:
sudo systemctl restart bluetooth
3. 蓝牙连接修复
若蓝牙无法检测到设备,用bluetoothctl手动配对:
bluetoothctl power on scan on # 找到名为"Parrot SkyController"的设备,复制其MAC地址 pair <设备MAC地址> connect <设备MAC地址>
4. 添加udev规则(识别为js设备)
若设备被识别但未映射为js0,创建udev规则文件:
sudo nano /etc/udev/rules.d/99-skycontroller.rules
写入以下内容(替换idVendor和idProduct为lsusb查到的SkyController设备ID):
SUBSYSTEM=="input", ATTRS{idVendor}=="0930", ATTRS{idProduct}=="6545", MODE="0666", GROUP="input"
重载规则并触发:
sudo udevadm control --reload-rules && sudo udevadm trigger
二、拦截SkyController直接命令,改用ROS 2处理
1. 修正iptables配置(之前命令无效原因)
你使用的-D参数是删除规则,而非添加;且需针对FORWARD链(而非OUTPUT链)处理转发流量:
- 先开启IP转发:
sudo sysctl -w net.ipv4.ip_forward=1
- 添加规则阻止SkyController直接发往无人机的数据包(默认SkyController IP为
192.168.42.1,无人机IP为192.168.42.2,替换为实际IP):
sudo iptables -A FORWARD -s 192.168.42.1 -d 192.168.42.2 -j DROP # 允许电脑处理后的命令发往无人机 sudo iptables -A FORWARD -s <你的电脑IP> -d 192.168.42.2 -j ACCEPT
2. ROS 2控制流程
- 启动joy节点读取手柄输入:
ros2 run joy joy_node
- 编写自定义ROS 2节点,订阅
/joy话题,解析按键/摇杆数据,转换为Bebop 2的控制命令(可基于parrot_bebopROS 2包或Mavlink协议实现) - 将处理后的命令发送至无人机,确保所有控制流量仅通过电脑转发
3. Wi-Fi范围扩展补充
若需扩展通信范围,可将电脑设置为Wi-Fi中继:
- 安装
hostapd和dnsmasq:
sudo apt install hostapd dnsmasq
- 配置电脑Wi-Fi为热点,连接到SkyController的Wi-Fi,让无人机连接电脑热点,实现流量全经电脑中转
内容的提问来源于stack exchange,提问作者Lucas Bosso de Mello
相关产品推荐
相关产品推荐

