記事ディレクトリ
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 プログラムを起動する限り、このパラメーター関連の問題も解決できます。