覚え書きブログ

Pythonの覚え書き(デバッグ)

pythonでは、pdbモジュールを使うと簡単にデバッグができる。
pdbを下記のようにインポートし、ブレークしたいところに「pdb.set_trace()」を書いておくだけでよい。

import pdb

pdb.set_trace()

pythonスクリプトを普通に実行すると、以下のようにブレークポイントで止まってくれる。

> lib/rpn/generate_anchors.py(55)generate_anchors()
-> MIN_DIST = 1
(Pdb) 


操作は、以下のようなにキーを用いて行う。

  • 「l」:現在実行しているところの周辺のコードを表示
  • 「c」:次のブレークポイントまで実行
  • 「n」:ステップオーバー
  • 「s」:ステップイン

詳細については、以下を参照。
https://docs.python.org/2/library/pdb.html
http://racchai.hatenablog.com/entry/2016/05/30/070000

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

gitの覚え書き(commitのリセット)

間違ってコミットしてしまった場合、ワーキングディレクトリはそのままでコミットだけリセットすることができる。

> git reset --soft HEAD^

HEAD^で直近のコミットを削除できる。