BodyRTCの深度カメラの出力

BodyRTC経由で得た深度カメラのデータを調べているのですが,いくつか疑問があります.

  • 点の座標の単位は[m]だと思うのですが,1/1000程度の値が入っています.
  • 深度がほぼ一定の(平面の)点群になります.

以下のようにして確認しました.

choreonoid/share/model/DoubleArmV7/DoubleArmV7-Upper.body

FRAME_FRONT_CAMERAの下に

      -
        type: Camera
        name: FRAME_FRONT_CAMERA_DEPTH
        translation: [ 0.25, 1.8, 0 ]
        rotation: [ -0.211541, 0.954201, 0.211541, 92.69 ]
        format: COLOR_DEPTH
        width: 320
        height: 240
        fieldOfView: 62
        frameRate: 30

を追加し,BodyRTCの設定ファイルに

out-port = FRAME_FRONT_CAMERA_DEPTH:FRAME_FRONT_CAMERA_DEPTH:CAMERA_RANGE

を加えました.この出力をPointCloudTypes::PointCloudを表示する自作のRTCに接続しました.

スクリーンキャプチャを付けます.PointCloudViewerのウィンドウに表示されている点群が平面になっているのがわかりますか?座標軸がカメラの位置で,座標軸の長さは1mです.BodyRTCから受け取った座標値を1000倍して表示しています.

本件調査しますのでしばらくお待ちください。

ご説明の通り、モデルの変更、BodyRTCの追加し、PointCloudViewerのコードをダウンロードさせて頂き、実行してみました。

色は、おかしいですが、座標は正しく表示できていると思います。

服部様、お世話になります。

これは困りました。そちらでは問題が再現しないということですね?お使いのプログラムは、GitHubのリポジトリの最新版ですね?

こちらでPointCoudViewerのコードの中で(#if 0の部分を1にして)受け取った全ての点の座標を表示させてみたのですが、以下のようになります。

0  0,0  -0.00804289,0.0059819,-0.0100392  004c1a1a
1  1,0  -0.00799262,0.0059819,-0.0100392  004c1a1a
2  2,0  -0.00794235,0.0059819,-0.0100392  004c1a1a
3  3,0  -0.00789209,0.0059819,-0.0100392  004c1a1a
4  4,0  -0.00784182,0.0059819,-0.0100392  004c1a1a
5  5,0  -0.00779155,0.0059819,-0.0100392  004c1a1a
6  6,0  -0.00774128,0.0059819,-0.0100392  004c1a1a
7  7,0  -0.00769101,0.0059819,-0.0100392  004c1a1a
8  8,0  -0.00764074,0.0059819,-0.0100392  004c1a1a
9  9,0  -0.00759048,0.0059819,-0.0100392  004c1a1a

(中略)

76790  310,239  0.00753975,-0.0060318,-0.0100386  006a7676
76791  311,239  0.00759002,-0.0060318,-0.0100386  006a7676
76792  312,239  0.00764028,-0.0060318,-0.0100386  006a7676
76793  313,239  0.00769055,-0.0060318,-0.0100386  006a7676
76794  314,239  0.00774081,-0.0060318,-0.0100386  006a7676
76795  315,239  0.00779108,-0.0060318,-0.0100386  006a7676
76796  316,239  0.00784134,-0.0060318,-0.0100386  006a7676
76797  317,239  0.00789161,-0.0060318,-0.0100386  006a7676
76798  318,239  0.00794187,-0.0060318,-0.0100386  006a7676
76799  319,239  0.00799214,-0.0060318,-0.0100386  006a7676

x,y,z座標ともこのようなオーダでz座標は-0.01でほぼ一定です。

何か違いの生じる原因になりそうなことを教えていただけると幸いです。

色の問題があるのはわかっています。色の順番はBGRの方が、PCLの内部表現にマッチするのではないかと思い、研究室内ではそのような仕様に変更していました。しかし、その件はここでは保留します。

画像を参考にできるだけ同じになるようにやってみているのですが,変化がありません.テストに使われたファイル一式を見せていただけないでしょうか.

念の為確認なのですが、お使いのChoreonoidのバージョンはgithubの最新版

になりますよね。

プロジェクトファイル他を送ります。モデルと .confは、先生が最初に投稿された内容の通りです。

debugDoubleArmV7.xml (13.1 KB)

debug1DoubleArmV7SJoystick.cnoid (12.2 KB)

そこからフォークして追いかけながらやっています.
どうしてもダメならば,別に本家をクローンしてやってみます.

多少気になる点としては,VMware上で試していることです.

VMware上で試していることです.

仮想マシンの場合、OpenGLのデプスバッファを読み込む関数が正常に動作しないことがよくあります。今回もそれが原因だと思われます。

急遽6年前のPCに諸々をインストールし,確認しました.点群が表示されました.
何とこんなことだったとは…

遅くても構わないので,仮想マシンであっても同じような結果になってほしいです.これはChoreonoidを開発する型に望んでも無理なのでしょうか…

WRSの競技の検証に使うPCは別に用意してはいますが,現段階では自分のPC(の仮想マシン上)で作業したかったので.通勤中でも,自宅でも作業できますので…

遅くても構わないので,仮想マシンであっても同じような結果になってほしいです.これはChoreonoidを開発する型に望んでも無理なのでしょうか…

うーん、そうは申しましても、OpenGLが仕様通りに動作しないのですから、こちらとしてはどうしようもないです。どの仮想化ソフトウェアがどこまで動くといったことも、製品やバージョンによっても変わってきますし、とても個別に対応することはできません。

WRSのマニュアルでもこの件は注意書きをしています。
http://choreonoid.org/ja/manuals/latest/wrs2018/setup.html

ただ、MACの仮想化ソフトウェアはかなりネイティブの動作に近いといった話も聞きますし、VMWareも最近のバージョンでは以前よりずっと動くようになってきた気がするので、結局は仮想化ソフトウェア次第というところはあるかと思います。VMWareのバージョンが古いようでしたら、ひょっとすると新しいバージョンのものではうまく動くようになっているかもしれません。

ただ、GPUまで完全に再現できる仮想化ソフトウェアというのは一般的にはあまり無いのではないかと思います。仮想化ソフトウェアは何らかの制約があるものだと思われたほうがよいかと。GPUについては最近GPUをハードウェアレベルで仮想化するという技術も出てきているようですけどね。そのような技術が一般の仮想化ソフトウェアでも使えるようになってくると、状況がよくなるかもしれません。

ちなみに「通勤中でも、自宅でも作業」とのことですが、私はノートPCにUbuntuも入れて、どこでもChoreonoidの開発をしています。この際ノートPCにもUbuntuをインストールされてはいかがでしょうか。

補足です。

遅くても構わない

ということでしたら、仮想化ソフトウェアの「3Dアクセラレーション」みたいな設定項目をオフにすると、描画が完全なソフトウェアレンダリングになって、それでかえって動く可能性があります。ただ、その場合本当に遅くなります。

ちょうど昨晩それを試したところです。VMwareの設定で「3Dグラフィックスのアクセラレーション」のチェックを外してみたところ,点群の座標は正しいのですが,色のない世界なりました.

参考サイト
https://kb.vmware.com/s/article/2045086
5年前から状況は変わっていないのでしょうか…

続報です.VMware Workstation 14 Playerの設定で「3Dグラフィックスのアクセラレーション」のチェックを外し,

export CNOID_USE_GLSL=1

を加えて実行すると,色の付いた世界になりました.しかし,大変遅いです.シミュレーション時間が実時間の70〜80倍です.これはさすがに辛いです.

次に,「3Dグラフィックスのアクセラレーション」のチェックを入れて,

export CNOID_USE_GLSL=1

を設定して実行すると,Chorenoidが以下のようなメッセージを吐いて終了します.

":/Base/shader/nolighting.vert"のシェーダコンパイルに失敗しました。
0:1(10): error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, and 1.00 ES

terminate called after throwing an instance of 'cnoid::GLSLProgram::Exception'
  what():  シェーダがリンクされていません。

残念…

ちょうど昨晩それを試したところです。VMwareの設定で「3Dグラフィックスのアクセラレーション」のチェックを外してみたところ,点群の座標は正しいのですが,色のない世界なりました.

これについては、Choreonoidの描画エンジンもしくはモデルのパラメータの問題かもしれません。調査して修正できそうな場合は修正します。

参考サイトhttps://kb.vmware.com/s/article/20450865年前から状況は変わっていないのでしょうか…

なるほど、実際にこのような報告があるのですね。でも対応していなさそうですね・・・。

あまりよく分かっていないところもありますが、glReadPixelsはOpenGLの古い関数で、今ではあまり使われなくなっているのかもしれません。OpenGLの新しいバージョン(CNOID_USE_GLSL=1を有効にする場合)では、代わりにGPUのテクスチャメモリとして深度バッファの内容を読みだすような方法もあるようなので、機会をみて試してみたいと思います。

次に,「3Dグラフィックスのアクセラレーション」のチェックを入れて,

export CNOID_USE_GLSL=1

を設定して実行すると,Chorenoidが以下のようなメッセージを吐いて終了します.

これについては、OpenGLのバージョンが条件を満たしていないのが原因です。エラーにあるように、GLSLのバージョン3.3が使えるOpenGLのバージョンである必要があります。

この部分はバージョンをチェックして条件を満たさない場合は自動でCNOID_USE_GLSLをオフにするといった処理が必要なのですが、まだそこまで作りこめていない状況です。

VMWareのOpenGLのバージョンがもう少し上がれば、使えるようになりそうです。(ただ私が講習会の時に試した感じでは、VMwareの最新版ではCNOID_USE_GLSL=1で動いたような気がします。参加者の方も動くと言っていたような。お使いのVMWareのバージョンは最新版でしょうか?それかお使いのGPUの仕様の問題でOpenGLのバージョンが低いのかもしれません。)

DoubleArmV7モデルに搭載しているSpotLightのパラメータがよくなかったようです。

attenuation: [ 0, 0, 0 ]

attenuation: [ 1, 0, 0 ]

に修正したところ、デフォルトの描画エンジンでも正常に表示されるようになりました。

VMwareの設定で「3Dグラフィックスのアクセラレーション」のチェックを外してUbuntuを起動し,DoubleArmV7のモデルのシーンビューの表示や点群のデータが「色付き」になりました.