space-mouse-在linux上初始化安装和测试过程

我们计划在linux上实现space mouse的数据读取; 首先通过usb设备连接空间鼠标,并开机。

系统级软件安装

安装和运维命令如下【使用开源的spacenavd 】,项目文档地址:https://spnav.readthedocs.io/en/latest/index.html

sudo apt-get install libhidapi-dev
sudo apt install spacenavd libspnav-dev
sudo systemctl start spacenavd
sudo systemctl enable spacenavd

# 必须执行下面的命令,否则 后续的python库会提示无权限
echo 'KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/99-hidraw-permissions.rules
sudo usermod -aG plugdev $USER
newgrp plugdev

# 分配权限
sudo vim /etc/udev/rules.d/99-spacemouse.rules

# vim中输入如下的配置
SUBSYSTEM=="usb", ATTRS{idVendor}=="046d", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="046d", MODE="0666", GROUP="plugdev"

# 退出vim,执行刷新
sudo udevadm control --reload-rules && sudo udevadm trigger

不要费劲去安装 官方驱动,官方驱动太老,对于Ubuntu22.x以上的系统不适用。不然你会先挣扎在 【stderr, basicwin: cannot open 9×15 font】 【Error: 3dxsrv.c :: startupCommandLine(), authGetUser(), failed to get user】 之类的报错迷茫

3Dconnexion 官方旧版 Linux 驱动 3DxWare 在新系统上表现不佳,可能遇到各种报错,即使你通过 xhost 之类的命令去修正。仍旧不会有改善。所以换成开源的软件 spacenavd

使用Python代码测试

首先我们先 淘汰:spnav ,不然会遇到 .venv/bin/python: undefined symbol: PyCObject_AsVoidPtr 之类的错误

虽然看到 https://github.com/real-stanford/diffusion_policy 这个项目都用了spnav,而且python版本是 3.9

我查看发布历史:https://pypi.org/project/spnav/#history 可以看到这玩意上次发布是 14年前,对于 比较新的Python3.10之类的解释器不兼容; 我们不可能为了一个库降级Python版本,直接淘汰这个库

推荐 pyspacemouse,还算是比较新的,而且使用也没大问题

pip install pyspacemouse

import pyspacemouse
import time

# 当变化差异超过0.2的时候,打印变化差异大的向量
SENSITIVITY_THRESHOLD = 0.2

dev = pyspacemouse.open()

if dev is None:
    print("未找到空间鼠标设备")
    exit()

print("空间鼠标已连接,开始读取传感器数据...")
print(f"敏感阈值: {SENSITIVITY_THRESHOLD}\n")

last_state = {
    'x': 0,
    'y': 0,
    'z': 0,
    'roll': 0,
    'pitch': 0,
    'yaw': 0,
    'button': None
}

try:
    while True:
        state = dev.read()

        if state:
            delta_x = abs(state.x - last_state['x'])
            delta_y = abs(state.y - last_state['y'])
            delta_z = abs(state.z - last_state['z'])
            delta_roll = abs(state.roll - last_state['roll'])
            delta_pitch = abs(state.pitch - last_state['pitch'])
            delta_yaw = abs(state.yaw - last_state['yaw'])

            if delta_x > SENSITIVITY_THRESHOLD:
                direction = '右' if state.x > last_state['x'] else '左'
                print(f"X轴: {state.x:.3f} (变化: {delta_x:.3f}) - {direction}")
                last_state['x'] = state.x

            if delta_y > SENSITIVITY_THRESHOLD:
                direction = '前' if state.y > last_state['y'] else '后'
                print(f"Y轴: {state.y:.3f} (变化: {delta_y:.3f}) - {direction}")
                last_state['y'] = state.y

            if delta_z > SENSITIVITY_THRESHOLD:
                direction = '上' if state.z > last_state['z'] else '下'
                print(f"Z轴: {state.z:.3f} (变化: {delta_z:.3f}) - {direction}")
                last_state['z'] = state.z

            if delta_roll > SENSITIVITY_THRESHOLD:
                direction = '顺时针' if state.roll > last_state['roll'] else '逆时针'
                print(f"翻滚: {state.roll:.3f} (变化: {delta_roll:.3f}) - {direction}")
                last_state['roll'] = state.roll

            if delta_pitch > SENSITIVITY_THRESHOLD:
                direction = '低头' if state.pitch > last_state['pitch'] else '抬头'
                print(f"俯仰: {state.pitch:.3f} (变化: {delta_pitch:.3f}) - {direction}")
                last_state['pitch'] = state.pitch

            if delta_yaw > SENSITIVITY_THRESHOLD:
                direction = '右转' if state.yaw > last_state['yaw'] else '左转'
                print(f"偏航: {state.yaw:.3f} (变化: {delta_yaw:.3f}) - {direction}")
                last_state['yaw'] = state.yaw


        time.sleep(0.05)

except KeyboardInterrupt:
    print("\n停止读取")
finally:
    pyspacemouse.close()

评论

请输入您的评论. 可以使用维基语法:
 
机器人/周边硬件/空间鼠标/space-mouse-在linux上读取安装过程.txt · 最后更改: 2025/11/11 10:36