gstreamer関連のライブラリをインストールして、以下のコマンドで動画が表示できるようになった。
gst-launch-0.10 v4l2src device=/dev/video0 ! video/x-raw-gray,bpp=8,depth=8,width=744,height=480 ! ffmpegcolorspace ! xvimagesink
しかし、ROSを介して表示しようとすると、以下のようなエラーがでて落ちてしまう問題が起きた。
> rosrun nodelet nodelet manager __name:=camera_manager [ INFO] [1501114735.131695682]: Initializing nodelet with 4 worker threads. Name : /dev/cam_0 , /dev/cam_1 , /dev/cam_2 Size : 744 X 480 @ 30fps Exposure : 100 Auto : 1 Exposure(range) : [1 , 20] WhiteBalance : [105 , 85 , 115) Multi-camera was initialized!! Initializing gstreamer... Gstreamer Version: GStreamer 0.10.36 (nodelet:20937): GLib-GObject-WARNING **: specified class size for type 'GstV4l2Sink' is smaller than the parent type's GstVideoSink' class size (nodelet:20937): GLib-GObject-CRITICAL **: g_type_add_interface_static: assertion 'G_TYPE_IS_INSTANTIATABLE (instance_type)' failed (nodelet:20937): GLib-GObject-CRITICAL **: g_type_add_interface_static: assertion 'G_TYPE_IS_INSTANTIATABLE (instance_type)' failed (nodelet:20937): GLib-GObject-CRITICAL **: g_type_add_interface_static: assertion 'G_TYPE_IS_INSTANTIATABLE (instance_type)' failed (nodelet:20937): GLib-GObject-CRITICAL **: g_type_add_interface_static: assertion 'G_TYPE_IS_INSTANTIATABLE (instance_type)' failed (nodelet:20937): GLib-GObject-CRITICAL **: g_type_add_interface_static: assertion 'G_TYPE_IS_INSTANTIATABLE (instance_type)' failed (nodelet:20937): GLib-GObject-CRITICAL **: g_type_add_interface_static: assertion 'G_TYPE_IS_INSTANTIATABLE (instance_type)' failed (nodelet:20937): GLib-GObject-CRITICAL **: g_type_add_interface_static: assertion 'G_TYPE_IS_INSTANTIATABLE (instance_type)' failed (nodelet:20937): GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed (nodelet:20937): GStreamer-CRITICAL **: gst_element_register: assertion 'g_type_is_a (type, GST_TYPE_ELEMENT)' failed no element "v4l2src" Current exposure list is... [ 1 , 5 , 10 , 15 , 20 ] Failed to open /dev/cam_l: No such file or directory [ERROR] [1501114737.714408850]: Failed to initialize multi camera terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::lock_error> >' what(): boost: mutex lock failed in pthread_mutex_lock: Invalid argument Aborted (core dumped)
gstreamer-0.10単体では動いていてgstreamerの問題ではない明らかなので、ROSから呼び出しのところで何か問題があるのだろうと推測し、環境変数GST_PLUGIN_PATH、GST_PLUGIN_PATH_1_0を設定したが全く改善しなかった。
ふと、先日opencv_2.4.11をソースからビルドしてインストールしたことを思いだし、catkin_make/develにあるライブラリのリンク先をみたところ、新しいopencvにリンクしていることがわかった。opencvまったく関係ないと思っていたのが誤算。
>ldd libtis_usb_camera.so | grep opencv libopencv_imgproc.so.2.4 => /usr/local/lib/libopencv_imgproc.so.2.4 (0x00007fd1268b4000) libopencv_highgui.so.2.4 => /usr/local/lib/libopencv_highgui.so.2.4 (0x00007fd12661e000) libopencv_core.so.2.4 => /usr/local/lib/libopencv_core.so.2.4 (0x00007fd12617a000) libopencv_contrib.so.2.4 => /usr/local/lib/libopencv_contrib.so.2.4 (0x00007fd122931000) libopencv_features2d.so.2.4 => /usr/local/lib/libopencv_features2d.so.2.4 (0x00007fd11b1a3000) libopencv_calib3d.so.2.4 => /usr/local/lib/libopencv_calib3d.so.2.4 (0x00007fd11aec1000) libopencv_ml.so.2.4 => /usr/local/lib/libopencv_ml.so.2.4 (0x00007fd11ac36000) libopencv_video.so.2.4 => /usr/local/lib/libopencv_video.so.2.4 (0x00007fd11a9d9000) libopencv_objdetect.so.2.4 => /usr/local/lib/libopencv_objdetect.so.2.4 (0x00007fd11a752000) libopencv_flann.so.2.4 => /usr/local/lib/libopencv_flann.so.2.4 (0x00007fd111ae9000)
さらに、gstreamerへのリンクがどうなっているかを調べたところ、なんとgstreamer 0.1と1.0両方を参照していることがわかった。。。
> ldd libtis_usb_camera.so | grep gstream libgstreamer-0.10.so.0 => /usr/lib/x86_64-linux-gnu/libgstreamer-0.10.so.0 (0x00007f25e2502000) libgstreamer-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libgstreamer-1.0.so.0 (0x00007f25deb10000)
とりあえず、opencv 2.4.11をアンインストールして、catkin_makeしなおしたところ、先ほどのgstreamer関連のエラーは出なくなった。一件落着と言いたい所だが、opencv2.4.11を使えなくなってしまうので、もう少し調べてみる。