やあ
MAVROSを使用してPX4フライトスタックのいくつかのパラメータを変更しようとしています。
mavrosを使用してパラメータを読み取ることができます
rosservice call / mavros / param / get MPC_LAND_SPEED
ただし、mavrosを使用して設定することはできません。 彼の正しい構文が何であるかわかりません
私は試した
rosservice call / mavros / param / set MPC_LAND_SPEED '0.4'
しかし、それは私にエラーを与えます。 誰かが助けてくれるなら、私はとても感謝しています!
ありがとうございました
セバスチャン
mavparam
スクリプトを試しましたか? rosrun mavros mavparam set MPC_LAND_SPEED 0.4
?
これは、サービスを介してsetメソッドを呼び出そうとしているためです。
サービスを介したROSの方法は次のとおりです。
rosservice call /param/set "param_id: 'MPC_LAND_SPEED'
value:
integer: 0
real: 0.4"
@sheningには2つの作業オプションがあるようです。 閉鎖
これは、サービスを介してsetメソッドを呼び出そうとしているためです。
サービスを介したROSの方法は次のとおりです。
rosservice call / param / set "param_id: 'MPC_LAND_SPEED'
価値:
整数:0
実数:0.4 "
上記の方法の助けを借りて、より正確な方法をここで説明します。
上記のコマンドは私の試行でエラーになります。 ただし、「integer」と「real」の前に空白が追加された後は機能しました。 そして、「/ mavros」は次のように追加されました:
rosservice call / mavros / param / set "param_id: 'SENS_EN_THERMAL'
価値:
整数:55
実数:0.0 "
cf)このコメントエディタでは、 ''(スペース)の代わりに
書くことで、空白スペースを追加できます。
@bigbellmercyこの問題はコマンドライン引数でのみ明らかですか? または、roscppを介してrosservice呼び出しを使用する場合にも、これは当てはまりますか?
@bigbellmercy確かに、それは3年前のことで、スペースは明確ではありませんでした。その周りに `` `を追加しただけで、今では明白です。 私がrosserviceを使用する典型的な方法は、悪用することです。
@bigbellmercyこの問題はコマンドライン引数でのみ明らかですか? または、roscppを介してrosservice呼び出しを使用する場合にも、これは当てはまりますか?
@ Jaeyoung-Lim上記のコマンドラインを使用して「roscppを介したrosservice呼び出し」に失敗しました。
ただし、以下のコードは、roscppのPX4パラメーターの変更に対して機能します。
system("rosrun mavros mavparam set SENS_EN_THERMAL 55");
@ Jaeyoung-Limコマンドライン引数を使用せずにrosサービス呼び出しを使用してroscppを意味しました
@ Jaeyoung-リム私は私の試験でそれの解決策を見つけることができませんでした。
roscppサービス呼び出しを使用して、PX4パラメーターを直接取得または設定することもできませんでした。 私はいつも次のエラーが発生しました:
[/mavros:std_plugins::ParamPlugin::get_cb]: PR: Unknown parameter to get: MPC_XY_VEL_MAX
[/mavros:std_plugins::ParamPlugin::set_cb]: PR: Unknown parameter to set: MPC_XY_VEL_MAX
パラメータIDに追加するプレフィックスはありますか?
mavparamスクリプトを使用すると問題なく動作しました。
rosrun mavros mavparam -n /mavros get MPC_XY_VEL_MAX
しかし、私はそれをプログラムでやりたいと思っています。 パラメータをROSにプルし、必要な変更を加えてから、それらをすべて元に戻すことで、回避策を見つけました。
ServiceClient pull_client = nh.serviceClient<mavros_msgs::ParamPull>("mavros/param/pull");
pull_client.waitForExistence();
mavros_msgs::ParamPull pull;
if (pull_client.call(pull)) {
if (pull.response.success) {
ROS_DEBUG("Pulled %d parameters from FCU", pull.response.param_received);
nh.setParam("mavros/param/MPC_XY_VEL_MAX", max_velocity);
ServiceClient push_client = nh.serviceClient<mavros_msgs::ParamPush>("mavros/param/push");
push_client.waitForExistence();
mavros_msgs::ParamPush push;
if (push_client.call(push)) {
if (push.response.success)
ROS_DEBUG("Pushed %d parameters to FCU", push.response.param_transfered);
else
ROS_ERROR("Failed push parameters to FCU, cannot set maximum horizontal velocity!");
}
else {
ROS_ERROR("Failed to push parameters to FCU, cannot set maximum horizontal velocity!");
}
}
else {
ROS_ERROR("Failed to pull parameters from FCU, cannot set maximum horizontal velocity!");
}
}
else {
ROS_ERROR("Failed to pull parameters from FCU, cannot set maximum horizontal velocity!");
}
最も参考になるコメント
これは、サービスを介してsetメソッドを呼び出そうとしているためです。
サービスを介したROSの方法は次のとおりです。