本記事では,World MoveIt Day 2019 in Tokyo(WMD 2019 in Tokyo) の会場にて動かすことのできるロボットアーム Panda を,実際にPCと接続して動かす方法を紹介します.
後編では,Panda のパッケージ群である franka_ros の中身について紹介します.
当日実際に機体を動かしてみたい方は,必見です!
Panda を動かすPCの環境構築と,PCと実機の接続方法を説明した前編はこちらになります.
MoveItでPandaを動かそう:前編(WMD 2019 in Tokyo 準備編)
franka_ros は,libfranka を ROS1 に対応させたパッケージ群です.
構成は次の図のようになっています.
※ panda_moveit_config は別パッケージです.
franka_description は Panda のロボットモデル (urdf xacro) を提供する ROS パッケージです.
RViz や MoveIt,Gazebo 等と連携することで,運動学計算や動力学計算,描画やプランニングなどを可能にします.
franka_gripper は Panda のグリッパのインターフェースの役割を担う ROS パッケージです.franka_gripper_node
という名前のノードとして実装されています.
このノードは,グリッパの状態を publish するほか,下記の actions server に従ってグリッパを制御します.
franka_gripper::MoveAction(width, speed)
:width
に,速度 speed
で動きます.franka_gripper::GraspAction(width, epsilon_inner, epsilon_outer, speed, force)
:width
において,力 force
で物を掴むようにします.目標グリッパ幅へは,速度 speed
で動作します.epsilon_inner
,epsilon_outer
はそれぞれ内側,外側へのグリッパ幅の許容誤差を表し,この許容誤差の中で収まった場合,成功と判定します.franka_gripper::HomingAction()
:franka_gripper::StopAction()
:control_msgs::GripperCommandAction(width, max_effort)
:次のコマンドでノードを実行できます.
<fci-ip>
には,コントローラのIPアドレス(前編での設定では 172.16.0.2)を入れてください.
roslaunch franka_gripper franka_gripper.launch robot_ip:=<fci-ip>
franka_hw は libfranka の制御 API をベースにした,制御インターフェースのパッケージです.
ハードウェアインターフェースのクラスである franka_hw::FrankaHW
は,次のインターフェースをサポートしています.
hardware_interface::JointStateInterface
:hardware_interface::VelocityJointInterface
:hardware_interface::PositionJointInterface
:hardware_interface::EffortJointInterface
:franka_hw::FrankaStateInterface
:franka_hw::FrankaPoseCartesianInterface
:franka_hw::FrankaVelocityCartesianInterface
:franka_hw::FrankaModelInterface
:hardware_interface
を利用する場合は,<arm_id>_joint1
, … , <arm_id>_joint7
といったように,ジョイントの名前を指定する必要があります.
一方,franka_hw
を利用する場合は,<arm_id>_robot
のようにロボット名を一度指定すればよいです.
デフォルトでは,<arm_id>
はpanda
に設定されています.
また,ここでは解説しませんが,franka_hw
には,
といった,便利な API も用意されています.
franka_control は libfranka の API を ROS 上で最大限利用するためのパッケージです.次のような機能が提供されています.
franka_control::SetJointImpedance
:franka_control::SetCartesianImpedance
:franka_control::SetEEFrame
:franka_control::SetKFrame
:franka_control::SetForceTorqueCollisionBehavior
:franka_control::SetFullCollisionBehavior
:franka_control::SetLoad
:franka_control::ErrorRecoveryAction
は,エラー状態からの復帰を可能にします.
トピックを利用した簡単な復帰が可能です.
rostopic pub -1 /franka_control/error_recovery/goal franka_control/ErrorRecoveryActionGoal "{}"
復帰後,franka_control_node
が動作している場合は,ロボットのコントローラを自動的に再起動させます.
ノードの立ち上げ方は次の通りです.
roslaunch franka_control franka_control.launch robot_ip:=<fci-ip> load_gripper:=<true|false>
この launch は franka_control_node
だけでなく, franka_control::FrankaStateController
も起動させます.
これはロボットの状態や推定手先外力など,RViz 上での可視化に必要な情報を読み取り,topic として publish します.(※ 描画の際には,RViz だけでなく,robot_state_publisher
の立ち上げが必要です.)
franka_visualization はロボット(グリッパを含む)の状態を RViz 上で可視化するためのパッケージです.
次のコマンドで起動できます.
roslaunch franka_visualization franka_visualization.launch robot_ip:=<fci-ip> \
load_gripper:=<true|false>
このパッケージは可視化をするだけで,ロボットを実際に動かすことはできません.
また,単一の franka::Robot
のみが実際にロボットと接続できることに注意が必要です.複数の franka_joint_state_publisher
は共存できないため,注意してください.
franka_example_controllers は franka_hw::FrankaHW
を利用した ROS コントローラの実装例です.
例えば,各関節をインピーダンス制御する例は,
roslaunch franka_example_controllers joint_impedance_example_controller.launch \
robot_ip:=<fci-ip> load_gripper:=<true|false>
で起動できます.
この launch では,描画も同時に起動するようになっています.
World MoveIt Day のハッカソンで実際に機体を動かしたい場合は,このパッケージを改造するのが便利かもしれません.
panda_moveit_config は,Panda で MoveIt を使うために必要な設定ファイルが格納されています.
次のコマンドで立ち上がります.
roslaunch panda_moveit_config panda_control_moveit_rviz.launch load_gripper:=<true|false> \ robot_ip:=<fci-ip>
このパッケージの詳細な説明は,MoveIt のチュートリアル(英語)で行われています.また現在,このチュートリアルを日本語訳する作業が始まっています.
franka_example_controllers の中に実装されている例は全て,controller_interface::MultiInterfaceController
クラスを継承しています.
このクラスは,最大4種類のインターフェースを1つのコントローラに集約させることができます.
class NameOfYourControllerClass : controller_interface::MultiInterfaceController < my_mandatory_first_interface, my_possible_second_interface, my_possible_third_interface, my_possible_fourth_interface> { bool init (hardware_interface::RobotHW* hw, ros::NodeHandle& nh); // mandatory void update (const ros::Time& time, const ros::Duration& period); // mandatory void starting (const ros::Time& time) // optional void stopping (const ros::Time& time); // optional ... }
franka_hw::FrankaHW
において利用可能なインターフェースの組み合わせは,次の通りです.
EffortJointInterface
+ PositionJointInterface
EffortJointInterface
+ VelocityJointInterface
EffortJointInterface
+ FrankaCartesianPoseInterface
EffortJointInterface
+ FrankaCartesianVelocityInterface
また,init
関数と update
関数は必ず定義しなければなりません.
更にオプションで,starting
関数と stopping
関数を定義できます.
init
関数はコントローラの読み込み時にしか呼ばれませんが, starting
関数は再起動が発生した場合でも呼び出されます.
初期姿勢などの代入は starting
関数内で行うのが良いでしょう.
もし速度制御のインターフェースを利用している場合は,安全のため,stopping
関数で目標速度をゼロにする必要があります.
作成したコントローラのクラスは,pluginlib
を用いてエクスポートする必要があります.
C++ソースファイルの末尾に,次のようなコードを加えてください.
#include <pluginlib/class_list_macros.h> // Implementation .. PLUGINLIB_EXPORT_CLASS(name_of_your_controller_package::NameOfYourControllerClass, controller_interface::ControllerBase)
更に,クラスのエクスポートのために,次のように plugin.xml
を記述する必要があります.
<library path="lib/lib<name_of_your_controller_library>"> <class name="name_of_your_controller_package/NameOfYourControllerClass" type="name_of_your_controller_package::NameOfYourControllerClass" base_class_type="controller_interface::ControllerBase"> <description> Some text to describe what your controller is doing </description> </class> </library>
catkin にエクスポートさせるため,package.xml
には,以下を書き足してください.
<export> <controller_interface plugin="${prefix}/plugin.xml"/> </export>
そして,コントローラを起動する際には,パラメーターサーバへの登録が必要です.
yaml ファイルに,次のようなパラメータを記述しておくと便利です.
your_custom_controller_name: type: name_of_your_controller_package/NameOfYourControllerClass additional_example_parameter: 0.0 # ..
これで,自作したコントローラを使う準備が整いました.
controller_spawner
や hardware_manager
を利用してコントローラを起動できます.
参考までになりますが,controller_spawner
と franka_control_node
は同じ名前空間で動作することに注意しましょう.
この記事では,前編・後編を通じて,実際に Panda を動かす準備を解説しました.
World MoveIt Day 2019 in Tokyo では,Panda が会場に用意されています.ハッカソンでロボットアームを実際に動かすことのできる貴重な機会を,是非とも有効活用していただけたらと思います.
コメントを投稿するにはログインしてください。
著者について