覚え書きブログ

gstreamerの覚え書き(linkトラブル解決編)

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を使えなくなってしまうので、もう少し調べてみる。