はじめに
SpaceMouseとは、3Dconnexion社が販売している3Dマウスである。本記事では、SpaceMouse WirelessをROS 2で使う方法を紹介する。
動作確認環境
- NVIDIA Jetson Orin 64GB (JetPack 6.2)
- Ubuntu 22.04 aarch64 (arm64)
- ROS 2 Humble
Jetsonを利用したので、Ubuntu 22.04 aarch64 (arm64)環境で試したが、x86_64環境でも同様に動作可能だと思われる。
方法
SpaceMouseの認識確認
SpaceMouse Wirelessは、有線接続と無線接続の両方が可能である。いずれかの方法でSpaceMouse WirelessをPCに接続しておく。
最新のSpaceMouse Wirelessでは、Bluetooth、USB有線、USBレシーバーによる無線接続が可能である。筆者が所有しているものは旧タイプでBluetooth接続に対応していないため、今回はUSB有線接続とUSBレシーバーによる無線接続のみ確認した。
USBの認識確認
lsusbコマンドでUSBの認識確認を行う。
有線接続、無線接続で認識のされ方が異なり、以下のようになる。
- 有線接続の場合
有線接続の場合
Bus 001 Device 008: ID 256f:c62e 3Dconnexion SpaceMouse Wireless (cabled)- 3Dconnexion SpaceMouse Wireless(
/dev/input/js0)として認識される
- 3Dconnexion SpaceMouse Wireless(
- 無線接続の場合
無線接続の場合
Bus 001 Device 010: ID 256f:c62f 3Dconnexion SpaceMouse Wireless Receiver- 3Dconnexion SpaceMouse Wireless Receiver(
/dev/input/js0)として認識される
- 3Dconnexion SpaceMouse Wireless Receiver(
jstest-gtkによる認識確認
jstest-gtkでSpaceMouseが認識するか確認する。
jstest-gtkのインストール
sudo apt update
sudo apt install jstest-gtk
jstest-gtkの起動
jstest-gtk
ボタンと軸の割り付けは以下のようになっている(有線接続と無線接続は同じ配列になっている)。
| Axes/Buttons | 軸 | 符号 |
|---|---|---|
| Axis 0 | X軸(左右方向) | 右方向が+ |
| Axis 1 | Y軸(前後方向) | 後方向が+ |
| Axis 2 | Z軸(上下方向) | 下方向が+ |
| Axis 3 | X軸周りの回転 | X軸+方向に対して時計回りが+ |
| Axis 4 | Y軸周りの回転 | Y軸+方向に対して時計回りが+ |
| Axis 5 | Z軸周りの回転 | Z軸+方向に対して時計回りが+ |
| Button 0 | 左側のボタン | - |
| Button 1 | 右側のボタン | - |
ROS 2での利用方法
本記事では、以下のjoyノードとspacenavノードの2つの方法を紹介する。
| 項目 | joyノード | spacenavノード |
|---|---|---|
| 概要 | ゲームパッドとしてSpaceMouseを扱う汎用ノード | SpaceMouse専用ノード |
| 主な出力トピック | /joy |
/spacenav/joy、/spacenav/twist
|
| メッセージ型 | sensor_msgs/msg/Joy |
sensor_msgs/msg/Joy、geometry_msgs/msg/Twist
|
| 軸配置 | ジョイスティック形式 | SpaceMouse向けに最適化 |
| 用途 | ゲームパッドと同様のインタフェースで利用したい場合 | ロボットの速度指令や6自由度操作に利用したい場合 |
本記事では、まずjoyノードによる利用方法を紹介し、その後、SpaceMouse専用のspacenavノードによる利用方法を紹介する。
【任意】DockerでROS 2環境を準備する場合
Dockerで、ROS 2環境を準備する。
Dockerイメージのダウンロード
docker pull ros:humble
Dockerコンテナを起動
docker run -it \
--name ros_humble_spacenav_test \
-v /dev:/dev \
ros:humble bash
- オプション
- --name: コンテナ名(例:ros_humble_spacenav_test)
- -v: マウントボリューム
- -v /dev:/dev ※Spacenavのデバイスをホストと共有可能にするオプション
joyノードで利用する方法
joyノードを用いて、SpaceMouseのjoyトピックを出力する。
sudo apt update
sudo apt install ros-humble-joy
joyデバイス名の確認
以下のコマンドでjoyデバイス名を確認できる。または、jstest-gtkで表示されていたデバイス名を確認してもよい。なお、joyデバイス名の確認方法については、筆者の別記事を参照。
awk '
/^N:/ {name=$0}
/^H:/ && /js[0-9]/ {print name}
' /proc/bus/input/devices | sed 's/^N: Name="//;s/"$//'
- 有線接続の場合
3Dconnexion SpaceMouse Wireless - 無線接続の場合
3Dconnexion SpaceMouse Wireless Receiver
joyノードの起動
ros2 run joy joy_node --ros-args -p device_name:="your_device_name"
- 有線接続の場合
ros2 run joy joy_node --ros-args -p device_name:="3Dconnexion SpaceMouse Wireless" - 無線接続の場合
ros2 run joy joy_node --ros-args -p device_name:="3Dconnexion SpaceMouse Wireless Receiver"
joyトピックの確認
ros2 topic echo /joy
以下のようなトピックが確認できればOK。
---
header:
stamp:
sec: 1783632512
nanosec: 908972950
frame_id: joy
axes:
- 0.10378380864858627
- 0.221071258187294
- 0.0015307441353797913
- 1.0
- -0.2481202930212021
- -0.0
buttons:
- 0
- 0
---
軸とボタンは以下のような配置となっている。jstest-gtkとは軸の符号が変わっている箇所があるので注意する。
| axes/buttons | 軸 | 符号 |
|---|---|---|
| axes[0] | X軸(左右方向) | 左方向が+ |
| axes[1] | Y軸(前後方向) | 前方向が+ |
| axes[2] | Z軸(上下方向) | 上方向が+ |
| axes[3] | X軸周りの回転 | X軸の+方向に対して時計回りが+ |
| axes[4] | Y軸周りの回転 | Y軸の+方向に対して時計回りが+ |
| axes[5] | Z軸周りの回転 | Z軸の+方向に対して時計回りが+ |
| buttons[0] | 左側のボタン | - |
| buttons[1] | 右側のボタン | - |
spacenavノード
spacenavノードは、SpaceMouse専用ノードであり、SpaceMouseの入力をgeometry_msgs/msg/Twistとして出力できる。
まず、以下でspacenavノードをインストールする。
sudo apt update
sudo apt install ros-humble-spacenav
spacenavノードの起動
spacenavノードを起動する前に、spacenavdをroot権限で起動しておく。
sudo spacenavd
続いて、別のターミナルでspacenavノードを起動する。
ros2 run spacenav spacenav_node
エラーなく起動すればOK。
もし、以下のようなエラーログが出る場合、spacenavdが正しく起動していないので、spacenavdを起動してから再度、spacenavノードを起動する。
connect failed: No such file or directory
[ERROR] [1783633193.528828976] [spacenav]: Could not open the space navigator device. Did you remember to run spacenavd (as root)?
joyトピックの確認
ros2 topic echo /spacenav/joy
---
header:
stamp:
sec: 1783691218
nanosec: 685063078
frame_id: ''
axes:
- 0.376953125
- -0.55078125
- -0.029296875
- 0.740234375
- 0.3828125
- 0.0
buttons:
- 0
- 0
---
軸とボタンは以下のような配置となっている。jstest-gtkやjoyノードとは、軸番号や符号が異なるので注意する。
| axes/buttons | 軸 | 符号 |
|---|---|---|
| axes[0] | Y軸(前後方向) | 前方向が+ |
| axes[1] | X軸(左右方向) | 左方向が+ |
| axes[2] | Z軸(上下方向) | 上方向が+ |
| axes[3] | Y軸周りの回転 | Y軸の+方向に対して時計回りが+ |
| axes[4] | X軸周りの回転 | X軸の+方向に対して時計回りが+ |
| axes[5] | Z軸周りの回転 | Z軸の+方向に対して時計回りが+ |
| buttons[0] | 左側のボタン | - |
| buttons[1] | 右側のボタン | - |
twistトピックの確認
ros2 topic echo /spacenav/twist
以下のようなトピックが取得できればOK。
---
linear:
x: 0.0
y: 0.2734375
z: 0.62109375
angular:
x: -0.44921875
y: 0.46484375
z: 0.3359375
---
トピックの軸配置は以下のようになっている。
| linear/angular | spacenav軸 | 符号 |
|---|---|---|
| linear.x | 前後方向 | 前方向が+ |
| linear.y | 左右方向 | 左方向が+ |
| linear.z | 上下方向 | 上方向が+ |
| angular.x | X軸周りの回転 | X軸の+方向に対して時計回りが+ |
| angular.y | Y軸周りの回転 | Y軸の+方向に対して時計回りが+ |
| angular.z | Z軸周りの回転 | Z軸の+方向に対して時計回りが+ |
まとめ
まとめ
SpaceMouse WirelessをROS 2で使用する方法として、joyノードとspacenavノードの2つを紹介した。
ゲームパッドと同様のインタフェースで入力を取得したい場合はjoyノード、並進・回転の6自由度入力をTwistとして利用したい場合はspacenavノードが適している。
SpaceMouseは6自由度の操作を直感的に行えるため、マニピュレータの手先操作、移動ロボットの速度指令、シミュレータ上のロボット操作などに有効な入力デバイスである。
参考







