Привет
Я пытаюсь изменить некоторые параметры в стеке полета PX4 с помощью MAVROS.
Я могу прочитать параметр с помощью mavros, используя
вызов rosservice / mavros / param / получить MPC_LAND_SPEED
однако я не могу установить его с помощью mavros. Я не знаю, какой у него правильный синтаксис
Я пытался
вызов rosservice / 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"
Кажется, у вас есть два рабочих варианта @shing. Закрытие
Это потому, что вы пытаетесь вызвать метод set через службу.
Через службу способ ROS:
вызов rosservice / param / set "param_id: 'MPC_LAND_SPEED'
ценить:
целое число: 0
реальный: 0,4 дюйма
Более точный способ описан здесь с помощью описанного выше метода.
Приведенная выше команда делает ошибку в моем испытании. Но это сработало после того, как перед «целым» и «реальным» был добавлен пробел. И '/ mavros' добавил примерно так:
вызов rosservice / mavros / param / set "param_id: 'SENS_EN_THERMAL'
ценить:
целое число: 55
реальный: 0,0 "
cf) В этом редакторе комментариев можно добавить пробел, написав
вместо '' (пробел).
@bigbellmercy Эта проблема очевидна только в аргументах командной строки? Или это также верно, когда вы используете звонки rosservice через roscpp?
@bigbellmercy Действительно, это было 3 года назад, и пространство не было очевидным, я просто добавил `` вокруг него, и теперь это очевидно. Типичный способ, которым я использую rosservice, - это злоупотребление
@bigbellmercy Эта проблема очевидна только в аргументах командной строки? Или это также верно, когда вы используете звонки rosservice через roscpp?
@ Jaeyoung-Lim Мне не удалось выполнить «вызовы rosservice через roscpp», используя приведенные выше командные строки.
Но приведенный ниже код работает для изменения параметра PX4 в roscpp:
system("rosrun mavros mavparam set SENS_EN_THERMAL 55");
@ Jaeyoung-Lim Я имел в виду roscpp, используя вызовы службы ros , а не аргументы командной строки
@ Jaeyoung-Lim Я не смог найти решение этой проблемы в своих испытаниях.
Используя вызовы службы 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
Есть ли какой-нибудь префикс для добавления к идентификатору параметра?
Сработало без проблем с использованием скрипта
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: