如何通过ROS2 获取Xbox Series手柄通道信息

前言 

记录在Ubuntu下,连接Xbox Series时遇到的问题,并通过ROS2获取Xbox 手柄通道信息

系统:Ubuntu 22.04

ros版本:ros2 humble

Xbox型号:xbox series s

连接方式:usb和蓝牙

1.连接                                                                        

使用usb连接

使用typec直接将电脑和xbox连接,白灯常亮说明连接成功

        安装测试工具(可选)

sudo apt install joystick jstest-gtk

检查设备节点

ls /dev/input/js*  # 查看手柄设备(如 /dev/input/js0)

测试手柄输入

jstest /dev/input/js0  # 测试摇杆和按钮

说明手柄连接成功,并且可以看到通道对应的值

使用蓝牙连接

正常应该长按3s xbox上靠近电源键的按钮进行蓝牙进行配对就行

注意:xbox上指示灯快闪表示蓝牙正在配对

点击Xbox Wireless Controller直接配对即可

如果上面蓝牙列表 没有发现Xbox Wireless Controller,重复上述配对步骤,刷新列表多试几次

针对蓝牙列表找不到Xbox Wireless Controller设备的情况(正如我一样),可以参考如下解决办法

1.可以先使用上述usb连接方式,初步测试一下看设备是否能够正常连接

2.打开终端输入如下命令

bluetoothctl
scan on

我们可以看到搜索的到设备蓝牙的MAC 地址

3.我们让xbox处于蓝牙配对模式,并看终端是否出现有xbox 的mac地址

  • 在 bluetoothctl 扫描输出中,Xbox 手柄通常显示为 Xbox Wireless Controller 或类似名称。

  • 如果未明确显示名称,尝试通过 排除法

    • 其他设备(如手机、耳机)通常会显示名称,剩下的可能是手柄

  • 我们可以在windows上连接上手柄后,通过属性查看xbox的mac 地址

    • 连接手柄后,打开 设备管理器 → 蓝牙 → Xbox Wireless Controller,右键 属性 → 详细信息 → 蓝牙设备地址

图中终端白色行为xbox的mac 地址:AC:8E:BD:68:E1:65 AC-8E-BD-68-E1-65

4.获取 MAC 地址后,即可在 Ubuntu/ROS 2 中通过 bluetoothctl 手动配对:

bluetoothctl
pair <MAC_ADDRESS> #其中<MAC_ADDRESS>替换为你xbox的mac 地址
connect <MAC_ADDRESS> #其中<MAC_ADDRESS>替换为你xbox的mac 地址

到这应该可以正常连接了,如果没有反应(正如我一样),请接着参考下面步骤

5.高级配对方法(绕过名称检测)

 使用蓝牙低功耗(BLE)模式

Xbox S/X 手柄使用BLE协议,需确保适配器支持:

sudo btmgmt -i hci0 le on  # 启用BLE
bluetoothctl
connect <MAC_ADDRESS> #其中<MAC_ADDRESS>替换为你xbox的mac 地址

到这里我已经成功连接上了蓝牙,但是出现经常断链的情况

解决断链问题:

关闭蓝牙省电模式

sudo nano /etc/bluetooth/main.conf

在文件末尾添加或修改以下参数:

[Policy]
AutoEnable=true
FastConnectable=true
JustWorksRepairing=always
ControllerMode = dual  # 同时支持BR/EDR和BLE

保存后重启蓝牙服务:

sudo systemctl restart bluetooth

问题解决,一切正常!!!

2.安装ROS2相关包

要使用ROS2来监听Xbox 手柄通道信息,需要下载ROS Package: joy

链接:https://index.ros.org/p/joy/

关于通道映射和节点话题信息,官方已经有详细介绍,这里不在赘述

我们打开一个新的终端,安装ros包

sudo apt update && sudo apt upgrade
sudo apt install ros-humble-joy ros-humble-teleop-twist-joy

注意:选择自己对应ros2版本安装,如iron等

3.测试

保证usb或者蓝牙成功连接xbox前提下

打开一个新终端,用来启动joy_node

ros2 node joy joy_node

打开另一个终端,用来监听joy_node发布的话题:/joy

可以看到我们成功启动joy node 并且监听到xbox 通道的信息

参考

https://index.ros.org/p/joy/

ROS Index

DeepSeek | 深度求索

### 使用ROS2实现手柄遥控小车 为了使用ROS2通过手柄遥控小车,可以遵循一系列特定步骤来设置环境并编写必要的代码。 #### 创建工作空间和包 建立用于开发的工作区,并在此基础上构建新的ROS2包。这一步骤确保所有资源集中管理,便于后续集成与调试。 ```bash mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src ``` 接着创建一个名为`joy_teleop`的新包: ```bash ros2 pkg create joy_teleop --build-type ament_python ``` 此命令会在指定位置生成项目结构框架[^1]。 #### 安装依赖项 确认手柄已正确连接至计算机并通过设备节点识别(通常为`/dev/input/js0`),之后安装Joystick支持库以及测试工具以便验证硬件功能正常。 ```bash sudo apt update && sudo apt install ros-humble-joystick-drivers joystick ``` 上述指令适用于Ubuntu系统下的Humble Hawksbill版本;对于其他发行版可能需调整软件源名称匹配相应代号[^2]。 #### 编写控制器逻辑 编辑Python脚本以处理来自JoyStick的消息转换成速度指令发送给机器人执行器。下面给出简化版示例代码片段位于`~/ros2_ws/src/joy_teleop/joy_teleop/node.py`: ```python import rclpy from geometry_msgs.msg import Twist from sensor_msgs.msg import Joy class TeleopTwistJoy(rclpy.Node): def __init__(self): super().__init__('teleop_twist_joy') self.publisher_ = self.create_publisher(Twist, 'cmd_vel', 10) self.subscription_ = self.create_subscription( Joy, '/joy', self.listener_callback, 10) def listener_callback(self, msg: Joy): twist_msg = Twist() # 假设左摇杆上下轴映射到线性速度X分量, # 左右轴对应角速度Z分量 (具体映射关系取决于实际需求) linear_x = msg.axes[1] angular_z = msg.axes[3] twist_msg.linear.x = linear_x * 0.5 # 调整比例因子适应不同场景 twist_msg.angular.z = angular_z * 1.0 self.publisher_.publish(twist_msg) def main(args=None): rclpy.init(args=args) teleop_node = TeleopTwistJoy() try: rclpy.spin(teleop_node) except KeyboardInterrupt: pass teleop_node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 这段程序监听来自话题`/joy`的数据流,解析其中按键状态变化后计算目标运动参数再发布至`cmd_vel`主题供下游组件消费[^4]。 #### 启动服务 编译整个工程并将新定义的功能模块加载入ROS核心进程内运行。 ```bash colcon build --packages-select joy_teleop source install/setup.bash ros2 run joy_teleop node.py & ros2 launch joy bringup.launch.py ``` 以上命令序列完成了从源码编译直至激活远程操控链路全过程部署[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值