linux下如何实现3Dconnexion6D鼠标位姿和按键读取
·
前言
6D鼠标(六自由度输入设备)支持三维空间中的平移(X/Y/Z轴)和旋转(俯仰/偏航/翻滚),提供更精准的空间操控,广泛应用在机器人控制、3D设计/建模、VR、医疗影像、工业仿真、游戏开发等领域。本文内容围绕Linux系统下如何读取3Dconnexion 6D鼠标(SpaceMouse Compact)的位姿和按键数据展开,涵盖驱动安装、代码实现等问题,总共尝试了4种不同方法来读取数据。代码均保存在仓库:https://gitee.com/jian-xingjie/3-dconnexion-6-dmouse.git

基于hidapi
基于hidapi库和c语言实现,随意移动6D鼠标的摇杆和2个按键,可以看到实时变化的字节数据,只需要将高8位和低8位组合成实际数据即可。

基于libspnav
https://github.com/FreeSpacenav/libspnav
这个库提供可以实时输出6轴和按键状态的demo程序。定位到/libspnav/examples/simple下,运行
make
./simple_af_unix
结果确实可以实时检测到摇杆和按键的变化并输出信息,按键没有任何问题,但是T、R矩阵的值始终为0。

博主看了一下这个库的底层,说实话没怎么看明白🙄...可以考虑将鼠标换成3dconnexion无线的那一款,说不定输出就正常了。因为我看了官网,目前这个6D鼠标是有线版本的,而linux对有线的这款好像支持得不太好,官网最新的linux驱动都只停留在了2014年而且支持的设备不包含有线的这款。

基于spacenavd+ros-melodic-spacenav-node
安装相关包:
sudo apt install spacenavd
sudo apt install ros-melodic-spacenav-node
启动一个ROS节点:
roslaunch spacenav_node classic.launch
新开一个终端订阅ROS节点:
rostopic echo /spacenav/joy或者rostopic echo /spacenav/joy
读取成功,输出如下:

基于spacemouse
基于python环境下的spacemouse库。
首先安装依赖:
sudo apt install libusb-1.0-0-dev libudev-dev libhidapi-hidraw0 libhidapi-libusb0 -y
pip3 install pyspacemouse
验证是否检测到设备(成功的话会显示设备信息):
pyspacemouse --list-spacemouse
创建一个python脚本文件:
import pyspacemouse
import time
def main():
# 打开设备
success = pyspacemouse.open()
if not success:
print("Failed to open SpaceMouse device. Please check the device connection and permissions.")
return
print("SpaceMouse device opened successfully. Reading data...")
try:
while True:
# 读取设备状态
state = pyspacemouse.read()
# 获取 6 轴状态
x, y, z = state.x, state.y, state.z
roll, pitch, yaw = state.roll, state.pitch, state.yaw
# 获取按键状态
button_0 = state.buttons[0] # 按键 0 的状态
button_1 = state.buttons[1] # 按键 1 的状态
# 打印状态
print(f"X: {x:.2f}, Y: {y:.2f}, Z: {z:.2f}, Roll: {roll:.2f}, Pitch: {pitch:.2f}, Yaw: {yaw:.2f}")
print(f"Button 0: {button_0}, Button 1: {button_1}")
# 稍作延时,避免过快刷新
time.sleep(0.1)
except KeyboardInterrupt:
print("Exiting...")
if __name__ == "__main__":
main()
运行脚本:
python3 ./脚本文件名.py
读取成功:

更多推荐


所有评论(0)