avatar

Ycyofmine’s Blog

云鸮雨霁

  • 首页
  • 分类
  • 标签
  • 归档
  • 关于
首页 ROS2中并发连接蓝牙手柄排错过程
文章

ROS2中并发连接蓝牙手柄排错过程

发表于 2025/06/13
作者 Ycyofmine
5 分钟阅读

需求:给一个定制的VR手柄编写ROS 2驱动程序,将其实时的姿态和按钮数据发布到自定义的msg上。其实这是个很简单的需求,只要利用手柄的SDK,读取手柄通过蓝牙传来的数据,处理后发布在ros msg上即可。但是我被傻逼联发科坑了😅,这个之后再说。

一、修复电脑驱动

笔者的电脑是翼龙15pro,使用的系统是Ubuntu22.04,不知道怎的,系统缺少了蓝牙驱动,在Github上经过一番搏斗后才修好。链接

二、事件循环自动关闭

节点启动了,日志显示手柄“连接成功”,但 ros2 topic echo 里的数据却一动不动,或者只更新一次就静止了。

经过排查,我们发现了问题的根源:

我使用了 Python 的 asyncio 和 bleak 库来处理蓝牙通信,并将这些操作放在一个独立的后台线程中,以避免阻塞 ROS 2 的主循环。但最初的实现有一个致命缺陷:当异步的连接任务完成后,这个后台线程就认为自己的工作结束并退出了,它所创建的 asyncio 事件循环也随之销毁。虽然蓝牙连接在物理上还存在,但已经没有程序在“监听”后续发来的数据了。

官方的 PyQt6 示例给了我启示。它采用了一个后台常驻线程 + run_forever()的架构。主线程负责下达指令,而后台线程的事件循环则永远运行,专门负责接收数据。

三、随机卡顿的数据流

最阴间的一部分,程序可以稳定地连接两个手柄,并且数据也能持续传来。

但是出现了非常诡异的现象!两个手柄的姿态数据、以及其中一个手柄的按钮数据,都能以很高的频率(30-100Hz)更新,但另一个手柄的按钮数据流,频率却低到令人发指的个位数(1-5Hz),而且“中招”的手柄是随机的!

首先让我们排除代码逻辑问题(因为代码对左右手是完全对称的)。最终,通过一个隔离实验(只连接单个手柄测试),我们得到了结论:

单个手柄工作时,它的所有数据流(姿态和按钮)频率都非常高,完全正常。问题只在两个手柄同时连接时出现。

我尝试过降低消息传输频率,也怀疑过驱动问题(因为现在电脑里安装的蓝牙驱动是社区编写的)

  • 尝试降频

    降频前: [vr_controller_node-1] [INFO] [1749612450.691984173] [vr_controller_node]: Data Rates (Hz) | L-Pose: 47.0, R-Pose: 98.5, L-Button: 0.5, R-Button: 29.0

    降频后: [vr_controller_node-1] [INFO] [1749611456.634736371] [vr_controller_node]: Data Rates (Hz) | L-Pose: 33.0, R-Pose: 35.0, L-Button: 0.5, R-Button: 23.0

  • 更换电脑

    在 R9000P 上运行:

    [vr_controller_node-1] [INFO] [1749610890.625920798] [vr_controller_node]: Data Rates (Hz) | L-Pose: 100.0, R-Pose: 78.5, L-Button: 29.5, R-Button: 0.5


mentor和leader都建议我把代码拆成两份,两个程序分别控制左手和右手,最终还是失败了🤣。

最后是ai大人救我于水火之中(不是哥们,你还有存在的必要吗,菜完了)

ai坚信是我网卡的问题,一开始我是不大信的,总不能两台电脑的网卡都有问题吧?查询后发现:

翼龙15pro:MT7922

R9000P:MT7921

好小子,联发科你这里阴我是吧,你个狗😡

最后在树莓派上成功跑通。

What can I say,别支持联发科喵,谢谢喵。

机器人
robot
本文由作者按照 CC BY 4.0 进行授权
分享

最近更新

  • ROS2中并发连接蓝牙手柄排错过程
  • 自行编译ros2-humble-plotjuggler
  • Ubuntu 22.04上蓝牙无法打开——(MT7922网卡为例)
  • Isaac sim遥操作控制
  • RPC:原理、组成与局限性
外部链接
  • codetime
  •  此博客的 Github 仓库

文章内容

相关文章

2025/06/11

自行编译ros2-humble-plotjuggler

不知道什么原因 ros2-humble 的环境下,sudo apt install ros-$ROS_DISTRO-plotjuggler-ros 失效了,库里没有这个包。 只能通过自行编译的方式来安装 plotjuggler mkdir -p ~/ws_plotjuggler/src cd ~/ws_plotjuggler/src git clone https://github.co...

2025/05/16

Isaac sim遥操作控制

机器人遥操作,这项连接人类智慧与机器行动的技术。从最初简单的远程按钮控制,到如今融合了人工智能(AI)、虚拟现实(VR)、增强现实(AR)的沉浸式、智能化交互,遥操作的应用边界不断拓宽,深入到工业制造、医疗手术、太空探索、灾害救援等众多领域。在这一演进过程中,机器人仿真平台扮演着日益关键的角色。它负责高效地验证算法、加速机器人学习。 在众多仿真工具中,NVIDIA Isaac Sim 凭借...

2025/04/03

Isaac通过ros2控制机器人

好久没更新博客了,学习方向也发生了改变,不搞游戏啦。 不更新博客是因为使用了 Obisidian ,多端同步太爽了,由于我大量使用了双链,不适合发博客,所以只能偶尔整理出一篇文章来。 本教程大量使用了官方的插件,如果未找到笔者所使用的插件,请翻阅工作区所有子目录,若未找到,请去 Extensions 内开启或下载(Isaac不同版本之间工作区目录非常不一样,FUCK NVIDIA)。...

自行编译ros2-humble-plotjuggler

-

© 2025 Ycyofmine. 保留部分权利。

本站采用 Jekyll 主题 Chirpy

热门标签

games104 UE c++ robot OS 装机 计网 essay

发现新版本的内容。