PX4飞控舵机控制全攻略

方法一:配置混控组,使用/mavros/actuator_control话题控制

通过MAVROS让PX4飞控输出pwm控制舵机转动_px4 舵机控制-优快云博客

PX4通过程序输出PWM波控制舵机或者电机_px4 舵机控制-优快云博客

这个方法需要通过读取飞控SD卡修改其中一个文件配置混控组。

方法二:使用/mavros/rc/override话题控制

https://github.com/potato77/Tech_Blog/blob/master/mavros%E5%8F%8Apx4_command/%E3%80%90%E6%95%99%E7%A8%8B%E3%80%91%E6%97%A0%E4%BA%BA%E6%9C%BA%E5%AE%9A%E7%82%B9%E6%8A%95%E6%8E%B7%E4%BB%BB%E5%8A%A1.md

但是笔者亲测,修改override话题对于rcin和rcout这两个话题没有任何影响,舵机也无法控制

方法三:修改参数法

参考了上面几种方法,还是控不了,很大可能的原因是我的PX4没有PWM_AUX,舵机只能插在PWM_MAIN上

使用这一种方法前,请先打开地面站,将舵机的对应端口设置成Constant Max或者Constant Min模式,修改Maximum或者Minimum的值,看看舵机能不能转,如果不能转,请查看一下地面站的映射是否和飞控上的丝印一一对应,很可能的原因是飞控上的PWM5对应了地面站的MAIN7。

 确定能够通过修改这两个参数控制舵机后,使用以下代码;

import rospy 
from mavros_msgs.srv import ParamSet, ParamSetRequest

"使用参数设置服务对舵机进行控制"
rospy.wait_for_service("/mavros/param/set")
servo_ctrl = rospy.ServiceProxy("/mavros/param/set", ParamSet)

servo_mode = ParamSetRequest() # 舵机模式 aux1控制是(407),使用offboard控制时,切换到最小值(1)或者最大值(2)
servo_mode.param_id = "PWM_MAIN_FUNC5"
servo_angel = ParamSetRequest() # 舵机角度 (800-1400 | 1600 - 2200)
servo_angel.param_id = "PWM_MAIN_MAX5"

"舵机控制接口"
"舵机使用指南:"
"使用servo_setangle(angle)前需要先运行servo_setmode(2)把舵机模式改成最大值输出"
# CONSTANT_MIN = 1
# CONSTANT_MAX = 2
# RC_AUX1 = 407
def servo_setmode(modeID):
    if modeID == 1 or 2 or 407:
        servo_mode.value.integer = modeID
        try:
            if servo_ctrl.call(servo_mode).success:
                rospy.loginfo(f"{node_name}: Turn Servo mode {modeID}!")
            else:
                rospy.loginfo(f"{node_name}: Turn Servo mode False-->no_success")
        except rospy.ROSInterruptException:
            pass
    else:
        rospy.loginfo(f"{node_name}: Turn Servo mode False-->modeID_unuse")

"设置舵机角度"
# angle :200 - 2450
def servo_setangle(angle):
    if 200 <= angle and angle <= 2450:
        servo_angel.value.integer = angle
        try:
            if servo_ctrl.call(servo_angel).success:
                rospy.loginfo(f"{node_name}: Set Servo angle {angle}!")
            else:
                rospy.loginfo(f"{node_name}: Set Servo angle False-->no_success")
        except rospy.ROSInterruptException:
            pass
    else:
        rospy.loginfo(f"{node_name}: Set Servo angle False-->angle_limit")

代码的原理是,MAVROS有一个服务 /mavros/param/set 它可以直接对px4的参数进行修改,我们将PWM_MAIN的输出模式设置成最大值输出(Constant Max)或者最小值输出(Constant Min)然后修改最大值(Maximum)和最小值(Minimum)的值,就可以控制舵机以任意角度旋转了!

官方文档详见:

Step4 How to set and get parameters - MAVROS Tutorial

 希望对你有帮助!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值