ROS2 で MoveIt2 を使用すると、[moveit_robot_state.robot_state] が表示されます: グループに対して運動学ソルバーがインスタンス化されていません

1.現象

スタンドアロン Qt プログラムで
setApprocimateJointValueTarget(target_pose)を呼び出そうとすると
、false が返され、次のエラー メッセージが表示されます:
グループ 'my_group' に対して運動学ソルバーがインスタンス化されていません
ここに画像の説明を挿入します

2. 情報を探す

あっちもこっちも見て、こっちも見て。有用な情報が見つかりました。
この質問は MoveIt2 の問題に関しても尋ねられ、開発者は次のように答えています:
[ 占有マップ モニター プラグイン #1843 の使用を含めるように demo.launch.py​​ が変更されている場合、 hello_moveit は機能しません ]
ここに画像の説明を挿入します

3.分析

3.1.パラメータの転送

この質問に対するhenningkayserの回答によると、主な理由は、MGI がノードを介してパラメータを使用できるように、moveit の設定を MGI (moveit::planning_interface::MoveGroupInterface) ノードに渡す必要があることです
moveit 関連のパラメーターは、from launch_ros.actions import ノードの Node ノードのパラメーターを通じて開始ノードに渡されます: [move_group_interface_tutorial.launch.py​​]
ここに画像の説明を挿入します launch_ros.actions.Node ノードのパラメーターを渡す方法は、 /tmp ディレクトリにパラメータ ファイルを配置し、そのファイル パスを argv としてプログラムに渡し、rclcpp::init(argc, argv); は argc と argv を介してパラメータを初期化します。

3.2. パラメータの受け渡しのテスト


コードリファレンス: [2. RCLCPP によるパラメーターの実装]
まず、parameters_basic ノードを持つパッケージ example_parameters_rclcpp を作成し、その main 関数で argc と argv を出力して作成します
ここに画像の説明を挿入します。 param_startup、これはノードを作成する必要はありませんが、起動ファイルを作成する必要があります。この起動ファイルは、launch_ros.actions.Node を使用して前のparameters_basic を起動し、パラメータをそれに渡します。
コード リファレンス: [2.1 起動ファイルを記述する 3 つの方法]
ここに画像の説明を挿入します実行して結果を確認します。
ここに画像の説明を挿入します多くのパラメータが含まれていることがわかります。渡されました。主に –params-file を見てください。しかし、見てみるために /tmp/launch_params_jzq3dg9_ を出力してみましょう。
ここに画像の説明を挿入します
これが launch_ros.actions.Node を通じて渡そうとしているパラメータの 1 つであることがわかります。では、現時点では、parameters_basic ノードにはすでにこれらのパラメーターが含まれているのでしょうか? しかし、それは否定的です。
ここに画像の説明を挿入します
非常に重要なことを行う必要があるため、渡されたパラメータをノードに自動的にロードさせます:automatic_declare_parameters_from_overrides

  rclcpp::NodeOptions node_options;
  node_options.automatically_declare_parameters_from_overrides(true);

  /*创建对应节点的共享指针对象*/
  auto node = std::make_shared<ParametersBasicNode>("parameters_basic", node_options);

ここに画像の説明を挿入しますこれで、渡したパラメータが得られました。
ここに画像の説明を挿入します

4.解決策

4.1. 起動ファイルにパラメータを渡して独自のプログラムを起動する

また、launch_ros.actions.Node を使用して、moveit と rviz を開始する起動ファイル内で Qt プログラムを起動し、それによって必要なパラメーターを独自のプログラムに渡すこともできます。

    ld.add_action(
        Node(
            executable='/home/yong/Desktop/QtPrj/build-myArmTest-Desktop_Qt_5_15_2_GCC_64bit-Profile/myArmTest',
            parameters=params,
        )
    )

ここに画像の説明を挿入します独自のプログラム内のノードに、automatically_declare_parameters_from_overrides を忘れずに追加してください。

    // 构建带参数的节点
    // https://github.com/ros-planning/moveit2/issues/1843
    rclcpp::NodeOptions node_options;
    node_options.automatically_declare_parameters_from_overrides(true);
    MGINode = std::make_shared<rclcpp::Node>(
        "my_arm_node", node_options);
    QtConcurrent::run([=](){
    
    
        rclcpp::spin(MGINode); // 阻塞其
    });

テスト後、問題はありません:
以下の赤い文字は、独自に起動された Qt プログラムによって出力された内容です。 キネマティクス プラグインなし、キネマティクス ソルバーなし、およびその他のエラーが報告されていることがわかります。一方、上のコンソールの出力は開始されます。 Qt から launch_ros.actions.Node まで プログラムの出力には同様のエラーはありません。
ここに画像の説明を挿入します

4.2. ファイルから設定を読み取る

起動ファイルにパラメータを渡して独自のプログラムを開始することは、リリース段階や実行段階では便利ですが、コードの作成段階やデバッグ段階では便利ではありません。
パラメーターは /tmp フォルダーに保存されているため (次回起動するまで削除されません)、渡された argc と argv をパッケージ ノードを介して txt ファイルに保存すると、Qt プログラムはこの txt ファイルを読み込むことができます。 。
このように、最初に moveit 関連の起動ファイルを起動し、上記の txt ファイルを生成 (更新) してから Qt プログラムを起動する限り、このパラメーター関連の問題も解決できます。

おすすめ

転載: blog.csdn.net/joyopirate/article/details/130947496