本パッケージは,DynamixelサーボモーターをROSから駆動するためのコントローラであるオリジナルのdynamixel_workbench_controllersを,ROS2に対応するよう修正したものです.
ROS1では,ROBOTIS社からdynamixel_workbenchパッケージが提供されており,この中にdynamixel_workbench_controllersが含まれていました.これは,dynamixel_workbench_msgsに定義されたサービスやメッセージを介して,ROSからDynamixelサーボモーターを制御するためのものです.
ところが,ROS2ではdynamixel_workbench_msgsは引き続き提供されているものの,dynamixel_workbench_controllersは終息してしまいました.そこで,その代替として,本パッケージは同様の機能を持つROS2ノードを提供します.
なお,ros2_controlに準拠したDynamixel制御パッケージとしてdynamixel_hardwareがROS2公式リポジトリから配布されています.ハードウェアの制御をros2_control対応にしておけば既存のros2_control準拠の様々なコントローラを利用できるようになりますので,移動台車や多関節アームを制御する場合はこちらを検討する方が良いかもしれません.
本パッケージは,Jazzy distributionで動作確認しています.
予め,次の2つの依存パッケージをインストールしておいてください.
$ sudo apt install ros-jazzy-dynamixel-workbench-toolbox ros-jazzy-dynamixel-workbench-msgsそして,githubからdynamixel_workbench_controllersを入手し,devel-aistブランチを取り出します.
$ cd ros2_ws/src
$ git clone https://github.com/Automation-Research-Team/dynamixel_workbench_controllers
$ cd dynamixel_workbench_controllers
$ git checkout devel-aist最後に,ワークスペース全体をコンパイルしてください.
$ cd ros2_ws
$ colcon builddynamixel_workbench_controllersノードは,USB=シリアル変換インタフェースU2D2のコントローラであり,それに接続されている1台以上のDynamixelサーボモーターを制御します.主に,次の3つの機能があります.
- ~/dynamixel_command サービス(dynamixel_workbench_msgs/DynamixelCommand型)を介してクライアントからのリクエストを受信し,制御命令を指定されたモーターに伝えてハードウェアを動かす
- ~/joint_trajectory トピック(trajectory_msgs/JointTrajectory型)から関節角空間における軌道を受信し,それをモーターに転送してハードウェアを動かす.多関節アームやパン=チルト雲台の制御を想定
- ~/cmd_vel トピック(geometry_msgs/Twist型)から2次元平面上の直交座標空間における並進・回転速度を受信し,それを左右の車輪の回転速度に変換しモーターに転送してハードウェアを動かす.差動二輪型移動台車の制御を想定
また,サービス,トピック,パラメータ等の名前は,オリジナルのdynamixel_workbench_controllersのそれに一致させています.
なお,ROS1の公式サイトにもdynamixel_workbench_controllersに関する記述がありますが,この情報は古く,上記オリジナルバージョンにも整合していないので,本パッケージとは無関係です.
- ~/dynamixel_command(dynamixel_workbench_msgs/DynamixelCommand型):制御コマンドを指定されたIDを持つモーターに送る
コマンドのリクエストは,次の4フィールドから成ります.
- command (type: string): 通常使われないので,空文字列でOK
- id (type: uint8): コマンドの送り先となるモーターのID
- address (type: string): コマンド名.Dynamixel機種一覧にある個々のモーターの
Control TableのData Nameの欄にある名前を記述 - value (type: int32): コマンドで与える指令値
- ~/joint_trajectory(trajectory_msgs/JointTrajectory型):MoveIt等によって生成された関節角空間における軌道をsubscribe
- ~/cmd_vel(geometry_msgs/Twist型):JoyStick等によって生成された2次元直交座標空間における並進・回転速度をsubscribe
- ~/dynamixel_state(dynamixel_msgs/DynamixelStateList型):
U2D2に接続されている全てのモーターの状態をpublish - joint_states(sensor_msgs/JointState型):
U2D2に接続されている全てのモーターの回転角,回転速度およびトルクをpublish
- usb_port (type: string):
U2D2を接続するPCのUSBポート名 (default:/dev/ttyUSB0) - dxl_baud_rate (type: int64):
U2D2とモーターを接続するシリアルラインの通信速度 (default:1000000baud) - dxl_read_period (type: float):
~/dynamixel_stateトピックに出力されるモーターの状態を取得する時間間隔 (default:0.01sec) - dxl_write_period (type: float):
~/joint_trajectoryトピックから入力された関節角軌道をモーターに送信する時間間隔 (default:0.01sec) - use_joint_states_topic (type: bool):
trueならばjoint_statesトピックをpublishする (default:false) - use_moveit (type: bool):
trueならば~/joint_trajectoryトピックでsubscribeした関節角軌道上の通過点(waypoint)をそのままモータに送る.waypointはdxl_write_periodで指定された間隔で次々に送られるので,waypointが疎な場合,モーターは非常に高速に動くことになる.これに対し,falseならば,subscribeされた軌道のwaypoint間をさらに補間した上でモーターに送る (default:false) - mobile_robot_config.separation_between_wheels (type: float): 差動二輪型移動台車の車輪間隔.この値が0以下ならば
~/cmd_velトピックはsubscribeされない (default:0.0meters) - mobile_robot_config.adius_of_wheel (type: float): 差動二輪型移動台車の車輪半径.この値が0以下ならば
~/cmd_velトピックはsubscribeされない (default:0.0meters) - dynamixel_info (type: string):
U2D2に接続される全Dynamixelサーボモーターの設定(モーターのID等)を記述するYAMLファイルへのパス.file:///xxx/yyy/zzz.yamlもしくはpackage://package_name/xxx/yyyy/zzz.yamlのいずれかの形式で指定する.前者は絶対パスで指定し,後者はROS2パッケージ下のファイルを参照する.省略不可
本ノードはrclcppのコンポーネントとして実装されており,コンポーネントコンテナにロードして使用します.このとき,launchファイルにあるように,必ずマルチスレッド対応のコンテナ(component_container_mt)にロードしてください.複数のコールバックグループを使用し,マルチスレッドで実行することを前提にしていますので,シングルスレッドコンテナ(component_container)にロードするとデッドロックに陥ってハングします.
次の2つの設定ファイルが必要です.
- ノードパラメータ設定ファイル: 上述のノードパラメータを設定するYAMLファイル.サンプルはここ
- モータパラメータ設定ファイル: モーターの設定YAMLファイル.ノードパラメータ設定ファイルの
dynamixel_infoフィールドから参照される. 記述方法はDynamixelのマニュアルに従う.サンプルはここ
次のコマンドを投入して起動します.
$ ros2 launch dynamixel_workbench_controllers launch.py [name:=<node_name>] [config_file:=<config_file>] [container:=<container_name>] [external_container:=true]- name: ノードに与える名前 (default:
basic_driver) - config_file: ノードパラメータ設定ファイルへのパス (default: default.yaml)
- container: ノードのロード先となるコンポーネントコンテナの名前 (default:
dynamixel_workbench_container) - external_container:
trueならば,containerに指定した名前で別途起動していた既存のコンテナにロード.falseならば,containerに指定した名前で新たにコンテナを起動し,それにロード (default:false)
本ノードが提供するサービス ~/dynamixel_command を利用して,Dynamixelモーターによって駆動される2指グリッパを制御するコントローラ precision_tool_controller がありますので.ご参照ください.