こんにちは、トロボです。
今回は ROS に関するお話です。
みなさん、ROSのことをご存知でしょうか。このサイトを閲覧されている方はご存知の方が多いと思いますが、初めて聞く方もいらっしゃると思いますので簡単に説明します。
ROSは「Robot Operating System」の略であり、ロボット開発のためのソフトウェアの集合体およびフレームワークです。現在ROSはOSRF (Open Source Robotics Foundation)によって開発されています。ユーザはROSを使用することで、ロボットへの動作指令や状態取得などの基本的な処理だけでなく、ロボットの軌道生成や外部センサとの連携といった高度な処理を簡単に実装することができます。
さらに、ROSにはGazeboというハードウェアシミュレータがついています。Gazeboを利用することで、実機を使わずにROSプログラムをPC上で試すことができます。これは、ROSを利用する大きなメリットです。下図はToroboArmのGazeboシミュレータを起動した様子です。
ここで注意をしていただきたいのが、『ROS+Gazeboでロボットアームのダイナミクスや制御を正確に再現できるかどうか』についてです。時々、「実機を使わずにアームのダイナミクスや制御を検証したい」という質問を受けますが、結論から言えばこれは簡単ではありません。
ダイナミクスに関してはGazeboがシミュレートする物理現象の正確性、制御性に関してはROS_Controlによるロボットアームの制御性がカギを握っています。それぞれ説明しましょう。
Gazeboがシミュレートする物理現象の正確性について
GazeboはURDF(Unified Robot Description Format)というロボットのモデルデータを読み込み、ODE(Open Dynamics Engine)という物理エンジンでシミュレートします。URDFでは、ロボットアームのリンクごとの質量や慣性テンソル、摩擦係数などを指定できます。
ここでやっかいなのが摩擦係数です。摩擦には様々なものがあり、クーロン摩擦(静止摩擦、動摩擦)やFDS摩擦(Slip)、粘弾性質摩擦(ERP/CFM)、転がり摩擦などがあります。これらをシンプルなロボットモデルで表現するのは難しいのです。また、ODEエンジンでは転がり摩擦に対応しておりません。以上により、今のところGazeboではダイナミクスを正確に再現するのは難しいと言えるでしょう。
ROS_Controlによるロボットアームの制御性について
ロボットアームを動かすには、実機であれシミュレータであれ制御が必要です。ROSにはROS_Controlという制御フレームワークがあり、この中にController ManagerというPID制御を行うモジュールがあります(下図の黄色いブロック)。これを用いてGazebo(シミュレータ)やハードウェア(実機)を制御することができます。
(下図参照※ブラウザにリンクを貼り付けて下さい)
https://github.com/osrf/gazebo_tutorials/blob/master/ros_control/Gazebo_ros_transmission.png
上図では実機をROS_ControlのController Managerで制御していますが、実際には実機をROS_Controlで制御することはあまりされていません。ロボットアームは10msec以上の高周期で制御する必要があり、ROSではリアルタイム性を確保できるとは限らないためです。つまり、シミュレータと実機で下記の違いがあります。この違いにより、シミュレータと実機で挙動(速度や振動など)が異なってしまいます。
種類 | 制御方法 |
シミュレータ(Gazebo) | ROS_ControlによるPID制御 |
ハードウェア(実機) | ベンダーごとに設計された制御 |
それならば、シミュレータ(Gazebo)のPID制御をチューニングして実機に近づけることはできないのでしょうか?
これについて、次回お話ししようと思います。