前言

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

读取成功:

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐