Mavros: 使用 MAVROS 设置 PX4 参数

创建于 2017-08-31  ·  10评论  ·  资料来源: mavlink/mavros

你好

我正在尝试使用 MAVROS 更改 PX4 飞行堆栈上的一些参数。

我可以使用 mavros 读取参数
rosservice 调用 /mavros/param/get MPC_LAND_SPEED

但是我无法使用 mavros 设置它。 我不知道他正确的语法是什么

我试过
rosservice 调用 /mavros/param/set MPC_LAND_SPEED '0.4'
但是它给了我一个错误。 如果有人可以帮助我将不胜感激!

谢谢

塞巴斯蒂安

question

最有用的评论

这是因为您试图通过服务调用 set 方法。

通过一个服务,ROS的方式是:

rosservice call /param/set "param_id: 'MPC_LAND_SPEED'
value:
  integer: 0
  real: 0.4" 

所有10条评论

你试过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 的典型方式是滥用防止打错字:laughing:

@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!");
}
此页面是否有帮助?
0 / 5 - 0 等级