Closed shmpwk closed 4 years ago
launchするnode scriptをdynamic reconfigureで直接いじるという方法もありますかね。
パラメーターを外部から動的に設定できるようにするのがdynamic reconfigureだから、使いたいnodeがdynamic reconfigure化されていたら、それを使って解決だけど、使いたいnodeがdynamic reconfigure化されてないから面倒、ってことでしょうか。
どうするかは場合によると思いますが、DepthImageCreatorが使いたいんだったら、そもそも仮想カメラのcamera_infoを入力にして、その仮想カメラの位置姿勢を自由に動かしたらよいだけではないのでしょうか。translationやrotationはuse_fixed_transformがtrueの時だけ有効ですが、デフォルトがfalseなのは、普通カメラの方を動かすからでは?
はい、使いたいノードがdynamic reconfigureではなさそうです。 例えば、上で例として上げたdepth_image_creator_nodelet.cppとそのヘッダー見ると、dynamic reconfigureを使っていないと思います。
depth image creatorの場合、仮想カメラの位置を動かす際に、対象物を基準に自由に動かすことができればそれで大丈夫です。
これがぱっと見仮想カメラの位置を動的に変えられるような気がします. https://jsk-recognition.readthedocs.io/en/latest/jsk_perception/nodes/virtual_camera_mono.html
publishされるcamera_infoをDepthImageCreatorに渡してあげれば良いと思います.
リンクありがとうございます。これは便利ですね。ぜひ使います。
本題のissue自体は解決していませんが、回避できそうなので、closeします。 @kosuke55 @pazeshun 迅速なご回答ありがとうございました。
すみません、virtual_camera_monoでdynamic_reconfigureになってるのinterpolation_methodだけでしたよね。 やりたいことはtfをdynamic_reconfigureで変更することなので、何をつかっても良いのですが少し検索してみると https://github.com/Flos/ros-tf2_dynamic というものが見つかりました。 これで出したframeをhttps://jsk-recognition.readthedocs.io/en/latest/jsk_perception/nodes/image_publisher.html などで出力した仮想的なcamera_infoに与えてみると良いと思います。
https://github.com/Flos/ros-tf2_dynamic を使ったdepth_image_creatorのサンプルも貼っときますね。 https://gist.github.com/kosuke55/4c6dc54b298cca1e27153cb56be6cc51
ちなみにfovは https://gist.github.com/kosuke55/4c6dc54b298cca1e27153cb56be6cc51#file-camera_ifno-yaml こんな感じにrosのcamera_infoを保存して、 https://github.com/iory/cameramodels で
from cameramodels import PinholeCameraModel
cm = PinholeCameraModel.from_yaml_file('camera_info.yaml')
cm.fovx
cm.fovy
とすると計算できます。
ありがとうございます! 確認してみます。
仮想カメラの位置動かせそうです。ありがとうございます!
launchファイル内でrosparamに変数を渡したいです。
例えば、DepthImageCreatorでは、param指定に
とあります。これを例えば、カメラ座標と対象物体座標のtf座標変換に置き換えたいと考えています。
一つの方法としては、tf座標変換をまずyamlファイルに保存して、それを
<rosparam command="load" file="$(find rosparam)/example.yaml" />
のようにして読み込むことだと思います。(参考). しかし、もう少しスマートな方法はないかなと探しています。launchファイルでなければ、コマンドラインで
$ rosparam get
とすればパラメータサーバーから変数を受け取れると思うのですが、、、