你好
我正在尝试使用 MAVROS 更改 PX4 飞行堆栈上的一些参数。
我可以使用 mavros 读取参数
rosservice 调用 /mavros/param/get 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"
似乎您有两个工作选项@shening。 收盘
这是因为您试图通过服务调用 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这个问题是否仅在命令行参数中明显? 或者当您通过 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 我的意思是 roscpp 通过使用ros 服务调用,而不是使用命令行参数
@Jaeyoung-Lim 我在试验中找不到解决方案。
使用roscpp service calls ,我也无法直接获取或设置 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的方式是: