0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Sainsmart 6dof arm の URDF file と ROS Driver の作成から、MoveIt による制御まで

0
Last updated at Posted at 2026-01-20

Screenshot from 2026-01-21 01-49-16.png

1. 概要

 Sainsmart 6dof arm の URDF(Unified Robot Description Format) file と、ROS 用 Driver を作成し、MoveIt(2) で制御するまでを、ソフトウェア中心に簡単にまとめました。



2. 構成

 システム構成を簡単に説明しておきます。

 RPi (Raspberry Pi 4B)は、ECU (Electronic Control Unit)のような位置付けです。つまり、センサー類から情報を取得し、Wheel や Arm を動かします。また、RPi は安価な為、 Wi-Fi が遅いので、Wi-Fi が高速な OpenWrt と Gigabit Ether で接続し、PC 上の ROS と Wi-Fi で接続しています。

 Arm は、物理的には、RPi に USB で接続されていますが、制御は、PC2 の ROS2 上で動作している MoveIt2 から行っています。もちろん、RPi は ROS1 ですから、ros1_bridge を経由して /joint_states を送っています。

 PC1 は何をしているのかと言うと、RTAB-Map(Real Time Appearance Based Mapping) と、物体認識・トラッキング処理(タイトル画像と動画の左下 Window を参照)を行っています。

これから作成するプログラムは、ROS2 用に書きたいところですが、ROS2 の MoveIt2 (Ubuntu 22.04 + Humble) は、バグが多すぎて、ちょっと厳しいなという印象でした。

Screenshot from 2026-01-19 18-47-58.png



3. URDF file の作成

 Sainsmart 6dof arm は、意外と有名な arm ですが、なぜか ROS 用 Driver は存在せず、ROS で動かせる環境は、整っていないようでしたので、URDF(Unified Robot Description Format) file の作成から始めました。URDF file は、直感的に分かり易い構成でもありますが、初めは、単純な Link と Joint の組み合わせから、徐々に複雑な構造に組み上げて行くのが、近道だと感じました。

 取り組み易い 6dof(Six Degrees of Freedom:6軸自由度)ARM の URDF は、こちらのウェブサイトを参考にさせて頂きました。ありがとうございます。



上記ウェブサイトの sixdofarm.urdf を参考に作成した、Sainsmart 6dof arm 用 URDF file は、私の GitHub に収めてあります。



 Link のサイズは、実測値で作成しています。重さは、正確に出したい場合は、組み上げる前に量っておくか、分解して量り直す必要があるので、今回は量っていません。

 inertia は、同じサイズ感の物体の値を、何となく入れてあります。今回の場合は、各 Link も小さいですし、位置制御のサーボモーターでゆっくり動かすので、実用上、問題にならないかと考えていますが、より正確な値を求める場合は、測り直してください。

 Elbow Joint は、実機では、リンクを介して駆動するようになっていますが、今回の URDF では、リンクを省略し、Driver 側で吸収する造りにしています。同様に、Shoulder Joint も、回転方向を Driver 側で反転しています。

 ROS1、ROS2 共に、sainsmart_description のような Package を作成して、その URDF ディレクトリに格納します。後でも述べていますが、ROS1 側でも robot_state_publisher を起動する為、両方に必要になります。また、MoveIt で使用する為に、moveit_setup_assistant で、sainsmart_moveit_config を作ると簡単です。他の Node で読み込めるように、.xacro ファイルも作成します。

 GitHub の readme にも書いていますが、標準仕様の Sainsmart 6dof arm では、サーボモーターに SG90 を使用しています。SG90 は、Stall Torque が 1.8[kgf/cm] で、樹脂製ギアを使用している為、Stall Torque が高く、金属製ギアの MG90D と、MG92B に置き換えています。この URDF 上では、Mesh ファイルの都合で、MG90D と MG90S を使っています。

 この Sainsmart 6dof arm は、パレタイジングロボットなので、床面の物を持ち上げて移動するには、丁度いいのですが、振り回すのは厳しい造りです。



4. ROS Driver の作成

 Driver は、今回、ROS1 用に組んでいますが、必要に応じて、ROS2 への移行も容易なはずです。こちらも URDF file と同様に、私の GitHub に収めてあります。



 使用する際は、ROS の Package を作成して、そのディレクトリに収めます。注意点は、GitHub の readme にも記載しましたが、arduino との通信速度を上げると不安定になる点です。

 また、/joint_states を Subscribe して動く仕様にしているので、Fake Controller でも動かすことができます。

 ROS1 の通信は、TCP/IP なので、基本的に通信の信頼性は保証されています。MoveIt 側と物理的に離れており、無線である Wi-Fi で通信する仕様上、ROS の通信を使用しなかったとしても、遅延や欠損のリスクは、あまり変わらないはずです。



5. MoveIt との接続

 今回、Arm は ROS1、MoveIt(2) は ROS2 で動かしている為、プロトコルを変換する ros1_bridge を使用しています。

 ROS1 と ROS2 は、/tf や /tf_static も変更されている為、ROS2 の出す /tf や /tf_static は、そのままでは使用できません。基本的に、ROS2 の MoveIt からは、/joint_states だけ ros1_bridge で送れればいいはずです。

 ROS1 側では、PC1 で別途、 robot_state_publisher を起動しています。URDF も、ROS1 側と ROS2 側に別々に用意します。

 以上で、ROS2 上の MoveIt(2) から、ROS1 上の Sainsmart 6dof arm を動かす環境が整うはずです。実際に動かしている実験動画は、こちらです。




 左上の Window が、実機を映しているもの。右 Window が PC2/ROS2 上の MoveIt2、左下 Window が PC1/ROS1 上の RTAB-Map と物体認識・トラッキング画面です。

 MoveIt2 の軌道計画の通りに、左上の実機と、左下のモデルが動いているのが分かります。

 tf も、Arm の動きに合わせて計算されている為、Arm の End Effector に搭載している Depth Camera の映し出す Point Cloud も、Arm の動きに合わせてマップ上に映し出されています。

 左下 Window のシリンダーは、認識した物体の位置と大きさ、文字は、認識結果(Cloth 0.55[m]、Package Goods 0.54[m])です。



以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?