AxisのPTZカメラをROS上で制御してみた


経緯

AxisのPTZカメラをROS上で動かす機会があったので、その手順をまとめてみました。PTZ(パンチルトズーム)カメラとは、パン(左右)、チルト(上下)、ズーム(拡大)の制御ができるカメラのことです。

axis_cameraについて

最初は、PTZも含めたカメラ制御ができるpython-onvifを使おうとしたのですが、Axisのカメラに対応していなかったので、他の方法を探すことにしました。そこで見つけたのがaxis_cameraでした。axis_cameraはAxisのカメラ制御用のROSパッケージです。とても便利ですが、python2で書かれているので注意が必要です。近いうちに自分でpython3に書き換えたものを作って、また記事にしようと思います。

環境

手順

まず、準備としてaxisのデフォルトの権限がrootなので、ptz制御できるようにanonymousに変えておきます。Axisのカメラ設定画面の右下のSettings->System->Usersといくと下のようなページに行くので、Anonymous usersをONにします。

次にgithubからソースコードを落としてきて、ROSを動かしていきます。

$ cd ~/catkin_ws/src
$ git clone https://github.com/ros-drivers/axis_camera.git
$ git clone https://github.com/ros-perception/camera_info_manager_py.git
$ sudo chmod -R 755 axis_camera 
$ cd ..
$ catkin build
$ roscore

別のターミナルを開いて、下のコマンドを実行します。

$ rosrun axis_camera axis_ptz.py _hostname:=IP_ADDRESS_OF_YOUR_CAMERA

axis_cameraはROSのDynamic Reconfigureを使ってGUI上でPTZ制御ができるようになっています。
別のターミナルを開き、下のコマンドを実行します。

$ rosrun rqt_reconfigure rqt_reconfigure 

すると、下のようなGUIが出現します。それぞれのスライドバーを動かすことで、PTZ制御ができます。

デフォルトだと、tiltが動作しなかったので、PTZ.cfgの中のtiltの設定値を変更しました。それぞれの項目はgen.add()の後ろの3つに初期値、最小値、最大値の順で並んでいます。

#!/usr/bin/env python
PACKAGE = "axis_camera"

from dynamic_reconfigure.parameter_generator_catkin import *

gen = ParameterGenerator()

#gen.add("speed_control", bool_t, 0, "Speed control (true) or absolute position control (false)", False)
gen.add("autofocus", bool_t, 0, "Autofocus", True)
gen.add("pan", double_t, 0, "Pan value in degrees (or percent in absolute mode)", 0, -180, 180)
// tiltの値を-45,-90,0から0,0,90に変えている
gen.add("tilt", double_t, 0, "Tilt value in degrees (or percent in absolute mode)", 0, 0, 90)
gen.add("zoom", double_t, 0, "Zoom value", 1, 1, 9999)
gen.add("focus", double_t, 0, "Focus", 1, 1, 9999)
gen.add("brightness", double_t, 0, "Brightness", 1, 1, 9999)

exit(gen.generate(PACKAGE, "axis_camera", "PTZ"))

まとめ

Axisのカメラであれば、簡単にROS上で動かすことができました。PTZカメラは動かすだけでも楽しいので、是非買ってみてください!家での使い道はあんまり無いと思いますが(笑)。

間違いや質問、ご意見等ありましたらお気軽にコメントください。頑張って答えますので(笑)。

参考文献