toppers / hakoniwa-px4sim

PX4-compatible drone simulation with physics-based modeling in C, visualizations via game engines, headless operation, and automated test scenarios. Supports external parameterization and MATLAB/Simulink integration.
40 stars 11 forks source link

Python APIでカメラ撮影すると復帰しないみたい。。 #242

Closed tmori closed 4 months ago

tmori commented 4 months ago

原因

INFO: Success for external initialization.
Traceback (most recent call last):
  File "/Users/tmori/project/oss/hakoniwa-px4sim/drone_api/sample/camera.py", line 46, in <module>
    sys.exit(main())
             ^^^^^^
  File "/Users/tmori/project/oss/hakoniwa-px4sim/drone_api/sample/camera.py", line 40, in main
    image_display_thread(client)
  File "/Users/tmori/project/oss/hakoniwa-px4sim/drone_api/sample/camera.py", line 18, in image_display_thread
    cv2.imshow("Camera View", img_rgb)
cv2.error: OpenCV(4.9.0) /Users/xperience/GHA-OpenCV-Python2/_work/opencv-python/opencv-python/opencv/modules/highgui/src/window.cpp:971: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'
tmori commented 4 months ago

うーん、イメージファイルが壊れている模様。

スクリーンショット 2024-06-24 12 57 33
tmori commented 4 months ago

原因判明

問題のデータはこんな感じ。

HakoCameraData:
0: request_id
4: image(272)
CompressedImage
0:header(136)
136:format(128)
264:data(8): 

問題のデータは、可変長配列のdata。

Unityがこのデータを書き出すときにはヒープ領域にデータを書き出すのだけど、 そのオフセットが間違っていた。

ヒープ領域に書くときは、上から詰めるので、構造体のパディング計算とか一切不要なのに、その計算を走らせていた。

読み込み側であるPython側では、正しく上から順番に読みこもとうしているので、こちらはOK.

なので、書き込み側の問題だった。

Python側の書き込み側に類似問題が潜んでいる可能性がある。

tmori commented 4 months ago

Python側も同じ問題を抱えているので、issue立てました。

https://github.com/toppers/hakoniwa-core-cpp-client/issues/49

tmori commented 4 months ago

可変長配列対応は品質がなかなか収まらないので、ちゃんと設計資料を起こして単体テストをやるべきでは?(独り言)

正論ですが、工数が足りないので、問題が起きたら都度対応する方向で地道にやります。 真面目にやると、多分、2−3人月かかる。

tmori commented 4 months ago

修正手順

  1. まずはローカルで直してカメラデータが正しく認識できるか確認する
  2. LaserScanも同様に可変長配列なので、この修正によってデグレしてないか確認する(多分、今までも問題出ていたけど、カメラのようにメタデータ持たないデータなので問題が認識されにくかったのだと祈る)
  3. hakoniwa-ros2pduデータを刷新する(再度スクリプトを流す)
  4. hakoniwa-core-cpp-clientのPython側の修正する
  5. hakoniwa-unity-simassetのC#側の修正とpduデータをアップデートする
  6. hakoniwa-unity-drone-modelのpluginをアップデートする
  7. hakoniwa-px4simのデグレチェックする
tmori commented 4 months ago

まずはローカルで直してカメラデータが正しく認識できるか確認する

確認結果:OK。

うまく行った。

tmori commented 4 months ago

残タスク

tmori commented 4 months ago

全て修正確認できたので、クローズします。 ちゃんと考えて、計画的にやればできる。チェックに要した時間は約一時間でしたー。