Oi
Estou tentando alterar alguns parâmetros em uma pilha de vôo PX4 usando MAVROS.
Sou capaz de ler o parâmetro com mavros usando
rosservice call / mavros / param / get MPC_LAND_SPEED
no entanto, não consigo defini-lo usando mavros. Eu não sei qual é a sintaxe correta
eu tentei
rosservice call / mavros / param / set MPC_LAND_SPEED '0.4'
no entanto, isso me dá um erro. Se alguem puder ajudar ficaria muito grato!
Obrigado
Sebastian
Você tentou o script mavparam
? rosrun mavros mavparam set MPC_LAND_SPEED 0.4
?
É porque você está tentando chamar o método set por meio de um serviço.
Por meio de um serviço, a maneira ROS é:
rosservice call /param/set "param_id: 'MPC_LAND_SPEED'
value:
integer: 0
real: 0.4"
Parece que você tem duas opções de trabalho @shening. Fechando
É porque você está tentando chamar o método set por meio de um serviço.
Por meio de um serviço, a maneira ROS é:
rosservice call / param / set "param_id: 'MPC_LAND_SPEED'
valor:
inteiro: 0
real: 0,4 "
Com a ajuda do método acima, um método mais exato é descrito aqui.
O comando acima comete um erro na minha tentativa. Mas funcionou depois que um espaço em branco foi adicionado antes de 'inteiro' e 'real'. E '/ mavros' adicionado como:
rosservice call / mavros / param / set "param_id: 'SENS_EN_THERMAL'
valor:
inteiro: 55
real: 0,0 "
cf) Neste editor de comentários, um espaço em branco pode ser adicionado escrevendo
vez de '' (espaço).
@bigbellmercy Este problema é aparente apenas em argumentos de linha de comando? ou isso também é verdade quando você usa chamadas rosservice sobre roscpp?
@bigbellmercy Na verdade, isso foi há 3 anos e o espaço não era óbvio, eu apenas adicionei `` `em torno dele e agora é óbvio. A maneira típica de usar o rosservice é fazer uso abusivo de
@bigbellmercy Este problema é aparente apenas em argumentos de linha de comando? ou isso também é verdade quando você usa chamadas rosservice sobre roscpp?
@ Jaeyoung-Lim Não consegui 'rosservice calls over roscpp' usando as linhas de comando acima.
Mas o código a seguir funciona para a alteração do parâmetro PX4 em roscpp:
system("rosrun mavros mavparam set SENS_EN_THERMAL 55");
@ Jaeyoung-Lim, quis dizer roscpp usando as chamadas de serviço ros , não usando argumentos de linha de comando
@ Jaeyoung-Lim Não consegui encontrar a solução para isso em meus testes.
Usando chamadas de serviço roscpp , também não consegui obter ou definir diretamente um parâmetro PX4. Sempre recebo o seguinte erro:
[/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
Existe algum prefixo para adicionar ao ID do parâmetro?
Funcionou sem problemas usando o script mavparam :
rosrun mavros mavparam -n /mavros get MPC_XY_VEL_MAX
No entanto, quero fazer isso programaticamente. Eu encontrei uma solução alternativa puxando os parâmetros para ROS, fazendo as alterações desejadas e, em seguida, empurrando-os de volta:
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!");
}
Comentários muito úteis
É porque você está tentando chamar o método set por meio de um serviço.
Por meio de um serviço, a maneira ROS é: