Xtion/Kinect カメラの TF キャリブレーション

3次元深度カメラの Xtion や Kinect を利用してロボット環境情報を取得する場合において, 得られた環境空間情報とロボットとの相対位置・姿勢が分からなければ意味がありません.

そのためにはカメラがロボットに対してどのような位置・姿勢で設置されているかを知る必要があります. 具体的にはカメラを設置するリンクもしくはワールド空間に対するカメラの TF を取得します.

ロボット実機での Xtion/Kinect TF キャリブレーション

ロボットの準備

ROS を使用するので rtm_ros_bridge が起動している必要があります.

$ roslaunch nextage_ros_bridge nextage_ros_bridge_real.launch nameserver:=%HOSTNAME%

ロボット各関節のキャリブレーションを行います. 関節のキャリブレーションが終わったら一旦ロボットの姿勢を終了姿勢にしてサーボを切ります.

ここでは操作に iPython コンソールを使用しています.

$ ipython -i `rospack find nextage_ros_bridge`/script/nextage.py -- --host nextage

:
(many connection messages)
:

[hrpsys.py] initialized successfully

:

In [1]: robot.checkEncoders()
In [2]: robot.goOffPose()
In [3]: robot.servoOff()

チェッカーボードのロボットへの設置

カメラとロボットの相対位置・姿勢を定めるためにチェッカーボードをロボットに取り付けます. このときチェッカーボードと設置するロボットのリンクとの相対位置は機械設計上既知である必要があります.

  • 注意: ロボット実機への作業ですのでサーボが切れていることを確認してください.

下図のように胸部チェッカーボードもしくは腰部チェッカーボードをロボットに取り付けてください.

胸部チェッカーボード NEXTAGE OPEN - Chekcerboard on Chest / Top View NEXTAGE OPEN - Checkerboard on Chest / Bottom View

腰部チェッカーボード NEXTAGE OPEN - Checkerboard on Waist

サーボを入れる(胸部チェッカーボードの場合)

胸部チェッカーボードを使用する場合は CHEST_JOINT0 の関節角度を 0 deg(正面)で維持する必要がありますので,ロボットのサーボを入れて初期姿勢にします.

In [1]: robot.servoOn()
In [2]: robot.goInitial()

Xtion/Kinect カメラをチェッカーボードに向ける

Xtion/Kinect カメラにチェッカーボードが映るようにします. 頭部に Xtion/Kinect カメラを設置した場合には関節を制御して頭部姿勢を変えます.

下に頭部関節を動作・制御するコマンドを記します.

In [1]: robot.setJointAnglesOfGroup( 'head', [ 0.0, 45.0 ], 5.0 )
In [2]: robot.getJointAngles()

チェッカーボード検出プログラムの実行

Xtion/Kinect カメラを本作業を行っている UIコントロールボックス(Ubuntu PC/Vision PC) もしくは 開発用コンピュータ(Ubuntu)に接続してください.

チェッカーボードを検出プログラムを実行します. Kinect カメラを使用している場合は実行時に引数 launch_openni2:=false を指定してください.

Xtion カメラの場合

$ roslaunch nextage_calibration camera_checkerboard_chest.launch  #chest
or
$ roslaunch nextage_calibration camera_checkerboard_waist.launch  #waist

Kinect カメラの場合

$ roslaunch nextage_calibration camera_checkerboard_chest.launch launch_openni2:=false  #chest
or
$ roslaunch nextage_calibration camera_checkerboard_waist.launch launch_openni2:=false  #waist

Checkerboard Detector - 胸部チェッカーボード
Checkerboard Detector - Chest

Checkerboard Detector - 腰部チェッカーボード
Checkerboard Detector - Waist

RViz の起動

各機能の実行状況を確認するために RViz を起動します.

$ rviz -d `rospack find nextage_calibration`/conf/calibration.rviz

RViz - 胸部チェッカーボード
RViz - Checkerboard on Chest

RViz - 腰部チェッカーボード
RViz - Checkerboard on Chest

カメラリンクと親リンクの TF の取得

tf_echo コマンドを利用して camera_link から親リンクへの TF を取得します. ここでは camera_link から HEAD_JOINT1 への TF を表示します.

$ rosrun tf tf_echo HEAD_JOINT1_Link camera_link

tf_echo の結果の例

At time 93.641
- Translation: [0.101, -0.014, 0.199]
- Rotation: in Quaternion [-0.001, 0.704, 0.002, 0.710]
            in RPY (radian) [0.126, 1.563, 0.130]
            in RPY (degree) [7.223, 89.561, 7.477]

ロボットでの作業の終了

カメラリンクと親リンクの TF の取得ができたらロボットを終了姿勢にしてサーボを切ります.

In [1]: robot.goOffPose()
In [2]: robot.servoOff()

全ノードの終了

ロボットのサーボが切れたら全てのノードを Ctrl-C で終了します.

カメラリンク TF の適用

取得した Xtion/Kinect カメラ TF をロボット上のカメラのパラメータとして適用します. 適用は Xtion/Kinect カメラモジュール xtion_kinect.launch 起動時に引数として渡して行います.

  • 単位系
    • TF_COORD_XYZ : [m]
    • TF_COORD_RPY : [rad]

まず rtm_ros_bridge を起動します.

$ roslaunch nextage_ros_bridge nextage_ros_bridge_real.launch nameserver:=%HOSTNAME%

Xtion カメラの場合

$ roslaunch nextage_calibration xtion_kinect.launch TF_COORD_XYZ:='0.101 -0.014 0.199' TF_COORD_RPY:='0.126 1.563 0.130'

Kinect カメラの場合(launch_openni2:=false のみの違い)

$ roslaunch nextage_calibration xtion_kinect.launch TF_COORD_XYZ:='0.101 -0.014 0.199' TF_COORD_RPY:='0.126 1.563 0.130' launch_openni2:=false

Xtion カメラの画像キャリブレーション(オプション)

Xtion カメラにおいては画像のキャリブレーション情報を取得しておくことをお勧めします. 画像キャリブレーションの作業手順は下記のサイトを参照ください.

Gazebo を用いた Xtion/Kinect TF 取得シミュレーション

実機で行う Xtion/Kinect カメラの TF キャリブレーションの作業は Gazebo シミュレータ上でも同様のことを行うことができます.

Gazebo の起動

NEXTAGE OPEN ロボットモデルの Gazebo シミュレータを起動します.

$ roslaunch nextage_gazebo nextage_world.launch
  • メモ: ROS / Gazebo でのシミュレーションのため rtm_ros_bridge は不要

Gazebo 内での Kinect とチェッカーボードモデルの設置

Gazebo 起動後の NEXTAGE OPEN ロボットの初期動作が終了しましたら, Kinect と チェッカーボード のモデルを Gazebo 内に設置します.

$ roslaunch nextage_calibration gazebo_kinect_checkerboard_chest.launch   #chest
or
$ roslaunch nextage_calibration gazebo_kinect_checkerboard_waist.launch   #waist

Gazebo シミュレータ内の Kinect と胸部チェッカーボードモデルの設置
Gazebo - Kinect and Checkerboard

チェッカーボード検出プログラムの実行

実機ロボットの場合と同様に Xtion/Kinect カメラでのチェッカーボード検出プログラムを実行します.

Kinect の場合

$ roslaunch nextage_calibration camera_checkerboard_chest.launch launch_openni2:=false
or
$ roslaunch nextage_calibration camera_checkerboard_waist.launch launch_openni2:=false

Checkerboard Detector - Gazebo / Checkerboard on Chest

RViz の起動

実機ロボットの場合と同様に各種チェックのために RViz を起動します.

$ rviz -d `rospack find nextage_calibration`/conf/calibration.rviz

RViz - Checkerboard Gazebo Simulation

カメラリンクと親リンクの TF の取得

実機ロボットの場合と同様に camera_link から親リンクへの TF を取得します.

$ rosrun tf tf_echo HEAD_JOINT1_Link camera_link

tf_echo の結果の例

At time 93.641
- Translation: [0.101, -0.014, 0.199]
- Rotation: in Quaternion [-0.001, 0.704, 0.002, 0.710]
            in RPY (radian) [0.126, 1.563, 0.130]
            in RPY (degree) [7.223, 89.561, 7.477]