[openrtm-staff:588] Re: Python版 RTC.MultiCameraImages型に関して

Ando Noriaki n-ando @ aist.go.jp
2016年 9月 6日 (火) 23:53:48 JST


鈴木様

産総研 安藤です

申し訳ございませんが、MultiCameraImages をPythonで使用した例は、
私どものところにはございませんので、サンプルはお示しできないのですが、
原因自体はMultiCameraImage特有のものではなかったようなので、
解決方法をお知らせいたします。

2016年9月6日 10:28 鈴木教文 <norifumi-suzuki @ eac-inc.co.jp>:
>
> 国立研究開発法人 産業技術総合研究所  安藤先生
>
> 東日本計算センターの鈴木です。
> 何度も問い合わせ申し訳ありません。
>
> VC++で調査した結果をご連絡します。
> >ということは、isNew() は true ということでしょうか?
> >だとすると、データは一応来ているのだと思います。
>
> PythonのコンポーネントでMultiCameraImages型データを作成・送信し
> C++のコンポーネントでデータを受信(isNew() == true)しRead()を実行している
> 結果、C++のコンポーネントで何らかのデータを受信しています。
>
> >具体的にはどのようなエラーですか?
> >Segmentation Faultで落ちるのでしょうか?
> >onExecuteがエラーとなるのでしょうか?
> >具体的なエラーの状況、あるいはそう判断した理由を教えていただけますか?
>
> C++コンポーネントのonExecute処理内でデータ受信を検出(isNew())し、Read()を
> 実行しますが、メンバ変数にPythonコンポーネントで送信したデータがセット
> されない?ので、不定な領域をアクセスしSegmentation Faultで落ちます。
>
> やはり、PythonのコンポーネントでMultiCameraImages型のデータを正しく作成
> 出来ていないのでしょうか?
> 以下にPythonコンポーネントで実行しているMultiCameraImages型のデータを
> 作成している部分です。
> PythonでMultiCameraImages型のデータを作成しているサンプルコードの提示
> は可能でしょうか?
>
> self.img = cv2.imread(self.ospath, cv2.IMREAD_UNCHANGED)
 #CV2で画像を読み込み
> multi_image = RTC.MultiCameraImages(RTC.Time(0,0),[])
#MultiCameraImages型の変数定義
> single_image = RTC.CameraImage(RTC.Time(0, 0), 0, 0, 0, "", 0.0, [])
  #CameraImage型の変数定義
> single_image.width = 640
> single_image.height = 480
> single_image.bpp = 24
> single_image.pixels = "".join([chr(value) for value in self.img.flat])
> multi_image.images.append(single_image)
 #MultiCameraImages型のimagesにCameraImage型変数の代入
> multi_image.images.append(single_image)
> self._d_out_image_multi = copy.deepcopy(multi_image)
 #出力ポートの変数にデータ設定
> self._ImageDataMultiOut.write()
 #データ出力

self._d_out_image_multi = copy.deepcopy(multi_image)

の部分が原因のようです。これはPythonの代入などがほとんどのケースで
参照渡しであることに起因する問題です。

onInitialize() の中で、

self._d_out_image_multi = RTC.MultiCameraImages(RTC.Time(0,0), [])
self._ImageDataMultiOut = OpenRTM_aist.OutPort("multiImage",
self._d_out_image_multi)

となっている部分があると思いますが、2行目のOutPortを生成する部分で、
OutPortに対してデータポート変数である self._d_out_image_multi をコンストラクタに
渡しています。OutPortでは、この変数の参照を保持しており、
 self._ImageDataMultiOut.write()  が呼ばれた際には、self._d_out_image_multi の
参照を保持しているメンバ変数 (self._ImageDataMultiOut._value) から値を読み
ポートから出力しています。

したがって、これらは

id(self._d_out_image_multi) == id(self._ImageDataMultiOut._value)

の状態をキープしなければならないのですが、

self._d_out_image_multi = copy.deepcopy(multi_image)

の部分で、8行上で新規に作成した RTC.MultiCameraImages のオブジェクト1の参照を、
さらにdeepcopyして作成したオブジェクト2 への参照を、self._d_out_image_multi に
代入してしまっているので、

id(self._d_out_image_multi) != id(self._ImageDataMultiOut._value)

となってしまっています。

解決方法としては、deepcopy で参照を破壊しないように、

self._d_out_image_multi.tm =multi_image.tm
self._d_out_image_multi.images =multi_image.images

として、メンバーごとのコピーを行うか、

self._ImageDataMultiOut.write(multi_image)

のように、write() 関数を引数指定で使う方法をとるか、のいずれかで
正しいデータが出力されるはずです。

ちなみに、お示しいただいたコードは単なるサンプルであれば蛇足ですが、

> single_image.width = 640
> single_image.height = 480
> single_image.bpp = 24

の部分は self.img.shape 等からから取得したほうがよろしいかと思います。


以上、よろしくお願いいたします。





>
>
>
>
>
> 以上、宜しくお願い致します。
>
> ********************************************
>
> *** 株式会社 東日本計算センター
>
> *** エンベデットシステム事業部
>
> *** 鈴木 教文(すずき のりふみ)
>
> *** 〒970-8026 福島県いわき市平字研町2番地
>
> *** TEL:0246-37-6569  FAX:0246-21-5503
>
> *** E-mail:norifumi-suzuki @ eac-inc.co.jp
>
> ********************************************
>
>
>
> From: 鈴木教文 [mailto:norifumi-suzuki @ eac-inc.co.jp]
> Sent: Friday, September 2, 2016 12:44 PM
> To: 'Ando Noriaki' <n-ando @ aist.go.jp>
> Cc: '中野 修三' <s-nakano @ eac-inc.co.jp>; '迎田 俊二' <
shunji-mukaida @ eac-inc.co.jp>
> Subject: RE: [Spam] Re: Python版 RTC.MultiCameraImages型に関して
>
>
>
> 国立研究開発法人 産業技術総合研究所  安藤先生
>
>
>
> 東日本計算センターの鈴木です。
>
>
>
> ご連絡有難う御座います。
>
> 受信側でisNew() ==trueになっているかはVC++で調査要です。
>
> 受信側をVC++で調査後に再度ご連絡致します。
>
>
>
> ********************************************
>
> *** 株式会社 東日本計算センター
>
> *** エンベデットシステム事業部
>
> *** 鈴木 教文(すずき のりふみ)
>
> *** 〒970-8026 福島県いわき市平字研町2番地
>
> *** TEL:0246-37-6569  FAX:0246-21-5503
>
> *** E-mail:norifumi-suzuki @ eac-inc.co.jp
>
> ********************************************
>
>
>
> From: Ando Noriaki [mailto:n-ando @ aist.go.jp]
> Sent: Friday, September 2, 2016 11:45 AM
> To: 鈴木教文 <norifumi-suzuki @ eac-inc.co.jp>
> Cc: 中野 修三 <s-nakano @ eac-inc.co.jp>; 迎田 俊二 <shunji-mukaida @ eac-inc.co.jp>
> Subject: [Spam] Re: Python版 RTC.MultiCameraImages型に関して
> Importance: Low
>
>
>
> 鈴木様
>
>
>
> 安藤です
>
>
>
>
>
> 2016年9月2日 11:23 鈴木教文 <norifumi-suzuki @ eac-inc.co.jp>:
>
> 国立研究開発法人 産業技術総合研究所  安藤先生
>
>
>
> 東日本計算センターの鈴木です。
>
>
>
> ご連絡有難う御座います。
>
>
>
> >ちなみに、どういった現象が起こっているのか情報をもう少し詳しくお教えいただけませんか?
>
> >Pythonのコンポーネント、C++のコンポーネントはそれぞれ送信側、受信側
>
> >どちらのコンポーネントですか?
>
>
>
> PythonのコンポーネントによりMultiCameraImages型のデータを送信し、C++のコンポーネントで
>
> MultiCameraImages型のデータを受信しております。
>
> C++のコンポーネントは、平成27年度に弊社で開発したビューアRTCであり実績はある認識です。
>
>
>
> PythonのRTCにおいて以下コードでMultiCameraImages型のデータをセットしております。
>
> このコードに問題があり受信側でエラーとなるのかまだ調査しきれていない状況です。
>
> Python版RTコンポーネントにおいて、MultiCameraImages型のデータを取り扱う際の
>
> ポートの初期化やデータセット等のサンプルコードが御座いましたらご提示して頂けると助かります。
>
>
>
> self.img = cv2.imread(self.ospath, cv2.IMREAD_UNCHANGED)
#CV2で画像を読み込み
>
> multi_image = RTC.MultiCameraImages(RTC.Time(0,0),[])
 #MultiCameraImages型の変数定義
>
> single_image = RTC.CameraImage(RTC.Time(0, 0), 0, 0, 0, "", 0.0, [])
#CameraImage型の変数定義
>
> single_image.width = 640
>
> single_image.height = 480
>
> single_image.bpp = 24
>
> single_image.pixels = "".join([chr(value) for value in self.img.flat])
>
> multi_image.images.append(single_image)
        #MultiCameraImages型のimagesにCameraImage型変数の代入
>
> multi_image.images.append(single_image)
>
> self._d_out_image_multi = copy.deepcopy(multi_image)
     #出力ポートの変数にデータ設定
>
> self._ImageDataMultiOut.write()
            #データ出力
>
>
>
> >コンポーネント実行時に何かエラーは出ていますか?
>
> C++のコンポーネント(受信側)でエラーが発生します。原因はVC++により確認中です。
>
>
>
> ということは、isNew() は true ということでしょうか?
>
> だとすると、データは一応来ているのだと思います。
>
>
>
> 具体的にはどのようなエラーですか?
>
> Segmentation Faultで落ちるのでしょうか?
>
> onExecuteがエラーとなるのでしょうか?
>
> 具体的なエラーの状況、あるいはそう判断した理由を教えていただけますか?
>
>
>
>
>
>
>
>
>
> >受信側にはデータ自体は来ているのですか?データが来ているのに、画像が
>
> >表示できないのか、もしくはデータが全く来ていないのですか?
>
> VC++により調査中です。
>
>
>
> ********************************************
>
> *** 株式会社 東日本計算センター
>
> *** エンベデットシステム事業部
>
> *** 鈴木 教文(すずき のりふみ)
>
> *** 〒970-8026 福島県いわき市平字研町2番地
>
> *** TEL:0246-37-6569  FAX:0246-21-5503
>
> *** E-mail:norifumi-suzuki @ eac-inc.co.jp
>
> ********************************************
>
>
>
> From: Ando Noriaki [mailto:n-ando @ aist.go.jp]
> Sent: Friday, September 2, 2016 8:55 AM
> To: 鈴木教文 <norifumi-suzuki @ eac-inc.co.jp>
> Cc: 中野 修三 <s-nakano @ eac-inc.co.jp>; 迎田 俊二 <shunji-mukaida @ eac-inc.co.jp>
> Subject: Re: Python版 RTC.MultiCameraImages型に関して
>
>
>
> 安藤です
>
> 2016年9月1日 17:58 鈴木教文 <norifumi-suzuki @ eac-inc.co.jp>:
> >
> > 国立研究開発法人 産業技術総合研究所  安藤先生
> > 東日本計算センターの鈴木です。
> >
> > ご連絡有難う御座います。
> > 食い違うと思った背景は、VC++のデバッカでMultiCameraImagesのデータを参照した際
> > TimeとMulticameraImageList型となっており、OpenRTMのリファレンスとして参照した
> > データ “TimeとCameraImage型”と違うためです。
>
>
http://svn.openrtm.org/OpenRTM-aist/trunk/OpenRTM-aist/src/lib/rtm/idl/InterfaceDataTypes.idl
>
>
>
> を見る限り、
>
>     typedef sequence<CameraImage> MulticameraImageList;
>
> となっているので、
>
> CameraImage[] はすなわち MultiCameraImageList です。
>
>
>
> ちなみに、どういった現象が起こっているのか情報をもう少し詳しくお教えいただけませんか?
>
> Pythonのコンポーネント、C++のコンポーネントはそれぞれ送信側、受信側
>
> どちらのコンポーネントですか?
>
> コンポーネント実行時に何かエラーは出ていますか?
>
> 受信側にはデータ自体は来ているのですか?データが来ているのに、画像が
>
> 表示できないのか、もしくはデータが全く来ていないのですか?
>
>
>
> 以上、よろしくお願いいたします。
>
>
>
> > IDLファイルの件、
> >
> > C++及びPythonのRTC BuilderにおいてRTC. MultiCameraImagesを選択しており、
> > 同じIDLファイルを使用していると思っています。
> > 認識違いであればご指摘願います。
>
> >
>
> >
> >
> >
> >
> > ********************************************
> >
> > *** 株式会社 東日本計算センター
> >
> > *** エンベデットシステム事業部
> >
> > *** 鈴木 教文(すずき のりふみ)
> >
> > *** 〒970-8026 福島県いわき市平字研町2番地
> >
> > *** TEL:0246-37-6569  FAX:0246-21-5503
> >
> > *** E-mail:norifumi-suzuki @ eac-inc.co.jp
> >
> > ********************************************
> >
> >
> >
> > From: Ando Noriaki [mailto:n-ando @ aist.go.jp]
> > Sent: Thursday, September 1, 2016 5:18 PM
> > To: 鈴木教文 <norifumi-suzuki @ eac-inc.co.jp>
> > Cc: 中野 修三 <s-nakano @ eac-inc.co.jp>; 迎田 俊二 <shunji-mukaida @ eac-inc.co.jp>
> > Subject: Re: Python版 RTC.MultiCameraImages型に関して
> >
> >
> >
> > 東日本計算センター 鈴木様
> >
> >
> >
> > 産総研 安藤です
> >
> >
> >
> > 「MultiCameraImagesの型定義がPython版とC++版で食い違う様に思えます。」
> >
> > と判断された根拠は何でしょうか? C++とPythonで利用しているIDLファイルは同じものでしょうか?
> >
> >
> >
> > 以上、よろしくお願いいたします。
> >
> >
> >
> >
> >
> >
> >
> >
> > 2016年9月1日 15:44 鈴木教文 <norifumi-suzuki @ eac-inc.co.jp>:
> >
> > 国立研究開発法人 産業技術総合研究所  安藤先生
> >
> >
> >
> > 東日本計算センターの鈴木です。
> >
> > 早速ですが、現在OpenRTM-aist-Python1.1.0にて画像処理を行っている中で
> > 質問がありメールさせて頂きました。
> > もし、ご存じでしたらご教授して頂けると幸いです。
> >
> >
> > <ご教授して頂きたい内容>
> > Python版でのRTC.MultiCameraImages(RTC.Time(0,0),0)の型定義およびポート
> > 初期化方法とデータ設定方法についてご教授願います。
> > 可能であればサンプルコードを提示して頂けると幸いです。
> >
> > <背景>
> > 平成27年度に弊社で開発したC++版のビューアを流用しようと思い、Pythonで
> > ビューアに入力するMultiCameraImages型のデータを定義しコーディングしました。
> > しかし、うまくC++版のビューアに表示が出来ません。
> > MultiCameraImagesの型定義がPython版とC++版で食い違う様に思えます。
> >
> > <Python側を以下の様に定義>
> > MultiCameraImages(Time _tm, CameraImage[] _images)
> >
> > <コード>
> >
> > self.img = cv2.imread(self.ospath, cv2.IMREAD_UNCHANGED)
> > multi_image = RTC.MultiCameraImages(RTC.Time(0,0),[])
> > single_image = RTC.CameraImage(RTC.Time(0, 0), 0, 0, 0, "", 0.0, [])
> > single_image.width = 640
> > single_image.height = 480
> > single_image.bpp = 24
> > single_image.pixels = "".join([chr(value) for value in self.img.flat])
> > multi_image.images.append(single_image)
> > multi_image.images.append(single_image)
> > self._d_out_image_multi = copy.deepcopy(multi_image)
> > self._ImageDataMultiOut.write()
> >
> > <デバッカで参照したC++側の型定義>
> > MultiCameraImages(Time _tm, MulticameraImageList[] _images)
> >
> >
> >
> >
> >
> > ********************************************
> >
> > *** 株式会社 東日本計算センター
> >
> > *** エンベデットシステム事業部
> >
> > *** 鈴木 教文(すずき のりふみ)
> >
> > *** 〒970-8026 福島県いわき市平字研町2番地
> >
> > *** TEL:0246-37-6569  FAX:0246-21-5503
> >
> > *** E-mail:norifumi-suzuki @ eac-inc.co.jp
> >
> > ********************************************
> >
> >
> >
> >
>
>
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
URL: <http://www.openrtm.org/pipermail/openrtm-staff/attachments/20160906/9315c3e9/attachment.html>


More information about the openrtm-staff mailing list