Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sequence<sequence<xxx>>のidlを変換できない #792

Open
eisoku9618 opened this issue Aug 18, 2015 · 8 comments
Open

sequence<sequence<xxx>>のidlを変換できない #792

eisoku9618 opened this issue Aug 18, 2015 · 8 comments

Comments

@eisoku9618
Copy link
Member

(send *ri* :set-foot-steps
      (list (make-coords :coords (send *robot* :lleg :end-coords :copy-worldcoords) :name :lleg)
            (make-coords :coords (send (send *robot* :rleg :end-coords :copy-worldcoords) :translate (float-vector 200 0 0)) :name :rleg)
            (make-coords :coords (send (send *robot* :lleg :end-coords :copy-worldcoords) :translate (float-vector 200 0 0)) :name :lleg)))

のようにfootstepのlistを与えていた部分を

(send *ri* :set-foot-steps
      (list (list (make-coords :coords (send *robot* :lleg :end-coords :copy-worldcoords) :name :lleg)
                  (make-coords :coords (send *robot* :lleg :end-coords :copy-worldcoords) :name :rarm))
            (list (make-coords :coords (send (send *robot* :rleg :end-coords :copy-worldcoords) :translate (float-vector 200 0 0)) :name :rleg)
                  (make-coords :coords (send (send *robot* :rleg :end-coords :copy-worldcoords) :translate (float-vector 200 0 0)) :name :larm))
            (list (make-coords :coords (send (send *robot* :lleg :end-coords :copy-worldcoords) :translate (float-vector 200 0 0)) :name :lleg)
                  (make-coords :coords (send (send *robot* :lleg :end-coords :copy-worldcoords) :translate (float-vector 200 0 0)) :name :rarm))))

のようにfootstepのlistのlistを与えられるようにしたくて,hrpsys-baseのidlの

    typedef sequence<Footstep> FootstepSequence;
    boolean setFootSteps(in FootstepSequence fs, in long overwrite_fs_idx);

のところに

    typedef sequence< sequence<Footstep> > FootstepNodesSequence;
    boolean setFootStepNodes(in FootstepNodesSequence fns, in long overwrite_fs_idx);

https://github.com/eisoku9618/hrpsys-base/blob/add-interface-of-set-footstep/idl/AutoBalancerService.idl#L50-L51

を追加してみたのですが,hrpsys_ros_bridgeをビルドするときに,rtmbuild_genidl の中で呼ばれる rtmbuild_init の中で呼ばれる_rtmbuild_genbridge_initの中で呼ばれるここ で実行されているidl2srv.pyここで落ちます.

エラーは以下になります.

AttributeError: Struct instance has no attribute 'kind'

https://gist.githubusercontent.com/eisoku9618/f7290d77283c2f72464d/raw/29d67d55478c80e61f5386e81ce5691cf0d6822d/a.txt

@k-okada
Copy link
Member

k-okada commented Aug 19, 2015

  1. 出て欲しいpythonのコードはどうなるか教えて欲しいのと,
  2. typedef sequence< <FootstepSequence> FootstepNodesSequence;
    とするとどうなるか教えて欲しいです.

◉ Kei Okada

On Wed, Aug 19, 2015 at 2:55 AM, Eisoku Kuroiwa [email protected]
wrote:

(send ri :set-foot-steps
(list (make-coords :coords (send robot :lleg :end-coords :copy-worldcoords) :name :lleg)
(make-coords :coords (send (send robot :rleg :end-coords :copy-worldcoords) :translate (float-vector 200 0 0)) :name :rleg)
(make-coords :coords (send (send robot :lleg :end-coords :copy-worldcoords) :translate (float-vector 200 0 0)) :name :lleg)))

のようにfootstepのlistを与えていた部分を

(send ri :set-foot-steps
(list (list (make-coords :coords (send robot :lleg :end-coords :copy-worldcoords) :name :lleg)
(make-coords :coords (send robot :lleg :end-coords :copy-worldcoords) :name :rarm))
(list (make-coords :coords (send (send robot :rleg :end-coords :copy-worldcoords) :translate (float-vector 200 0 0)) :name :rleg)
(make-coords :coords (send (send robot :rleg :end-coords :copy-worldcoords) :translate (float-vector 200 0 0)) :name :larm))
(list (make-coords :coords (send (send robot :lleg :end-coords :copy-worldcoords) :translate (float-vector 200 0 0)) :name :lleg)
(make-coords :coords (send (send robot :lleg :end-coords :copy-worldcoords) :translate (float-vector 200 0 0)) :name :rarm))))

のようにfootstepのlistのlistを与えられるようにしたくて,hrpsys-baseのidlの

typedef sequence<Footstep> FootstepSequence;
boolean setFootSteps(in FootstepSequence fs, in long overwrite_fs_idx);

のところに

typedef sequence< sequence<Footstep> > FootstepNodesSequence;
boolean setFootStepNodes(in FootstepNodesSequence fns, in long overwrite_fs_idx);

https://github.com/eisoku9618/hrpsys-base/blob/add-interface-of-set-footstep/idl/AutoBalancerService.idl#L50-L51

を追加してみたのですが,hrpsys_ros_bridgeをビルドするときに,rtmbuild_genidl
https://github.com/start-jsk/rtmros_common/blob/master/hrpsys_ros_bridge/catkin.cmake#L91
の中で呼ばれる rtmbuild_init
https://github.com/start-jsk/rtmros_common/blob/master/rtmbuild/cmake/rtmbuild.cmake#L36
の中で呼ばれる_rtmbuild_genbridge_init
https://github.com/start-jsk/rtmros_common/blob/master/rtmbuild/cmake/rtmbuild.cmake#L113
の中で呼ばれるここ
https://github.com/start-jsk/rtmros_common/blob/master/rtmbuild/cmake/servicebridge.cmake#L38
で実行されているidl2srv.py
https://github.com/start-jsk/rtmros_common/blob/master/rtmbuild/scripts/idl2srv.py
のここ
https://github.com/start-jsk/rtmros_common/blob/master/rtmbuild/scripts/idl2srv.py#L232
で落ちます.

エラーは以下になります.

AttributeError: Struct instance has no attribute 'kind'

https://gist.githubusercontent.com/eisoku9618/f7290d77283c2f72464d/raw/29d67d55478c80e61f5386e81ce5691cf0d6822d/a.txt


Reply to this email directly or view it on GitHub
#792.

@eisoku9618
Copy link
Member Author

ご返信ありがとうございます.

  1. 出て欲しいpythonのコードはどうなるか教えて欲しいのと,

現状はhrpsys_ros_bridge/msg/OpenHRP_AutoBalancerService_Footstep.msg

float64[3] pos
float64[4] rot
string leg

で,hrpsys_ros_bridge/srv/OpenHRP_AutoBalancerService_setFootSteps.srvが,

OpenHRP_AutoBalancerService_Footstep[] fs
int32 overwrite_fs_idx
---
bool operation_return

となっていまして,欲しいコードは

hrpsys_ros_bridge/msg/OpenHRP_AutoBalancerService_FootstepNodes.msg

OpenHRP_AutoBalancerService_Footstep[] fs

という新しいメッセージと

hrpsys_ros_bridge/srv/OpenHRP_AutoBalancerService_setFootStepNodes.srv

OpenHRP_AutoBalancerService_FootstepNodes[] fns
int32 overwrite_fs_idx
---
bool operation_return

という新しいサービスです.

  1. typedef sequence< <FootstepSequence> FootstepNodesSequence;

こちらに変更しても同じエラーになります.

@eisoku9618
Copy link
Member Author

自己解決した気がします.

idlに書かれているstructがmsgになって,idlに書かれている関数の引数がsrvになるのだという理解に達し,

    struct FootstepNodes
    {
        sequence<Footstep> fs;
    };

というように新たにstructを加えればいいのだという事が分かりました.

    typedef sequence< sequence<Footstep> > FootstepNodesSequence;
    boolean setFootStepNodes(in FootstepNodesSequence fns, in long overwrite_fs_idx);

ではなくて,

    struct XXXXX
    {
        sequence<Footstep> fs;
    };
    typedef sequence<XXXXX> FootstepNodesSequence;
    boolean setFootStepNodes(in FootstepNodesSequence fns, in long overwrite_fs_idx);

のように一回structをかませることで,現状の変換コードで idl から所望の srv / msg が作られるようになりました.

ありがとうございました.

eisoku9618 added a commit to eisoku9618/hrpsys-base that referenced this issue Aug 19, 2015
… sequence <xxx> >" because idl2srv of hrpsys_ros_bridge cannot convert it. see start-jsk/rtmros_common#792
@k-okada
Copy link
Member

k-okada commented Aug 19, 2015

すごい,すごすぎるデバッグ力で尊敬するけど,だめではないかい.
https://github.com/start-jsk/rtmros_common/blob/master/rtmbuild/scripts/idl2srv.py#L204
のどこかを直して対応したいところ.

◉ Kei Okada

On Wed, Aug 19, 2015 at 6:27 PM, Eisoku Kuroiwa [email protected]
wrote:

自己解決した気がします.

idlに書かれているstructがmsgになって,idlに書かれている関数の引数がsrvになるのだという理解に達し,

struct FootstepNodes
{
    sequence<Footstep> fs;
};

というように新たにstructを加えればいいのだという事が分かりました.

typedef sequence< sequence<Footstep> > FootstepNodesSequence;
boolean setFootStepNodes(in FootstepNodesSequence fns, in long overwrite_fs_idx);

ではなくて,

struct XXXXX
{
    sequence<Footstep> fs;
};
typedef sequence<XXXXX> FootstepNodesSequence;
boolean setFootStepNodes(in FootstepNodesSequence fns, in long overwrite_fs_idx);

のように一回structをかませることで,現状の変換コードで idl から所望の srv / msg が作られるようになりました.

ありがとうございました.


Reply to this email directly or view it on GitHub
#792 (comment)
.

@eisoku9618
Copy link
Member Author

sequence <sequence <xxx> > をしたいときは

    struct yyy
    {
        sequence<xxx> hoge;
    };
    typedef sequence<yyy> fuga;

のように一回yyyをかませることで解決できる,というのではダメで,

    typedef sequence< sequence<xxx> > fuga;

ができて然るべきだ,ということでしょうか?

@eisoku9618 eisoku9618 reopened this Aug 20, 2015
@snozawa
Copy link
Contributor

snozawa commented Aug 20, 2015

そうですね。
基本的にはコンバータなので、idlで標準で記述できて、かつROSのmsg/srvでも問題ない記法であれば変換できるようにするのがベターですね。

@k-okada
Copy link
Member

k-okada commented Aug 20, 2015

ダメじゃないけどダサいよね.

◉ Kei Okada

2015-08-20 14:23 GMT+09:00 Shunichi Nozawa [email protected]:

そうですね。
基本的にはコンバータなので、idlで標準で記述できて、かつROSのmsg/srvでも問題ない記法であれば変換できるようにするのがベターですね。


Reply to this email directly or view it on GitHub
#792 (comment)
.

@eisoku9618
Copy link
Member Author

分かりました.ひとまずreopenしておきます.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants