方法一:配置混控组,使用/mavros/actuator_control话题控制
通过MAVROS让PX4飞控输出pwm控制舵机转动_px4 舵机控制-优快云博客
PX4通过程序输出PWM波控制舵机或者电机_px4 舵机控制-优快云博客
这个方法需要通过读取飞控SD卡修改其中一个文件配置混控组。
方法二:使用/mavros/rc/override话题控制
但是笔者亲测,修改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
希望对你有帮助!
3369

被折叠的 条评论
为什么被折叠?



