PX4无人机 - 键盘控制飞行代码
仿真效果
实机效果
由于图片限制5M以内,只能上传一小段了,整段视频请点击链接 Pixhawk 6c | 无人机 | 键盘控制无人机 | Offboard模式
核心: 发布 mavros/setpoint_velocity/cmd_vel_unstamped 话题,控制x y z三个方向的速度
运行前先运行PX4自带仿真,例如
roslaunch px4 mavros_posix_sitl.launch
接着运行以下代码(根据WHEELTEC麦克纳姆轮小车的键盘控制代码改写)
注意:
空格:降落
5 :开启offboard模式
6 :解锁,准备起飞
7 :起飞
控制顺序:
先按 5 开启offboard 模式
再按 6 解锁,会看到浆液开始转动
再按 7 起飞 (这里起飞后就不在 offboard 模式)
再按一次 5 切换到 offboard 模式(之后就可以通过键盘控制前后运动,左右旋转了)
控制运动键如下
i 键:前进
K 键:停止运动
, 键:后退
J 键:向左转
L键:向右转
运动速度调整键如下
常用键如下:
W 键:增加运动线速度
X 键:减少运动线速度
E 键:增加旋转角速度
C 键:减少旋转角速度
降落
空格键
import rospy
from geometry_msgs.msg import Twist
from geometry_msgs.msg import PoseStamped
from mavros_msgs.srv import *
from mavros_msgs.msg import State
import math
import sys, select, termios, tty
msg = """
Control Your Turtlebot!
---------------------------
Moving around:
u i o
j k l
m , .
q/z : increase/decrease max speeds by 10%
w/x : increase/decrease only linear speed by 10%
e/c : increase/decrease only angular speed by 10%
space key, k : force stop
anything else : stop smoothly
b : switch to OmniMode/CommonMode
CTRL-C to quit
"""
Omni = 0
moveBindings = {
'i':( 1, 0),
'o':( 1,-1),
'j':( 0, 1),
'l':( 0,-1),
'u':( 1, 1),
',':(-1, 0),
'.':(-1, 1),
'm':(-1,-1),
}
speedBindings={
'q':(1.1,1.1),
'z':(0.9,0.9),
'w':(1.1,1),
'x':(0.9,1),
'e':(1, 1.1),
'c':(1, 0.9),
}
def getKey():
tty.setraw(sys.stdin.fileno())
rlist, _, _ = select.select([sys.stdin], [], [], 0.1)
if rlist:
key = sys.stdin.read(1)
else:
key = ''
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
return key
speed = 0.2
turn = 1
def vels(speed,turn):
return "currently:\tspeed %s\tturn %s " % (speed,turn)
sita = 0.0
z = 0
w = 0
zf = 1
def pose_cb(m):
global sita
global z
global w
global zf
z = m.pose.orientation.z
w = m.pose.orientation.w
if z*w > 0:
zf = 1
else:
zf = -1
sita = 2*math.acos(w)*180/math.pi
current_state = State()
def state_cb(state):
global current_state
current_state = state
if __name__=="__main__":
settings = termios.tcgetattr(sys.stdin)
rospy.init_node('turtlebot_teleop')
pub = rospy.Publisher('mavros/setpoint_velocity/cmd_vel_unstamped', Twist, queue_size=5)
rospy.Subscriber('mavros/local_position/pose',PoseStamped, pose_cb)
rospy.Subscriber('mavros/state',State,state_cb)
setModeServer = rospy.ServiceProxy('mavros/set_mode',SetMode)
armServer = rospy.ServiceProxy('/mavros/cmd/arming', CommandBool)
x = 0
y = 0
z = 0
th = 0
count = 0
target_speed = 0
target_z_speed = 0
target_turn = 0
control_speed = 0
control_z_speed = 0
control_turn = 0
try:
print(msg)
print(vels(speed,turn))
while(1):
key = getKey()
if key == 'i':
count = 0
x = 1
z = 0
elif key == ',':
count = 0
x = -1
z = 0
elif key == 'j':
count = 0
th = 1
z = 0
elif key == 'l':
count = 0
th = -1
z = 0
elif key == 'r':
count = 0
z = 1
elif key == 'f':
count = 0
z = -1
elif key in speedBindings.keys():
speed = speed * speedBindings[key][0]
turn = turn * speedBindings[key][1]
count = 0
print(vels(speed,turn))
elif key == 'k' :
x = 0
y = 0
z = 0
th = 0
control_speed = 0
control_z_speed = 0
control_turn = 0
elif key == ' ':
print("Vehicle Land")
setModeServer(custom_mode='AUTO.LAND')
elif key == '5':
if current_state.mode != "OFFBOARD" :
setModeServer(custom_mode='OFFBOARD')
print("Offboard enabled")
elif key == '6':
armServer(True)
print("Vehicle armed")
elif key == '7':
print("Vehicle Takeoff")
setModeServer(custom_mode='AUTO.TAKEOFF')
else:
count = count + 1
if count > 4:
x = 0
y = 0
z = 0
th = 0
if (key == '\x03'):
break
target_speed = speed * x
target_z_speed = speed * z
target_turn = turn * th
if target_speed > control_speed:
control_speed = min( target_speed, control_speed + 0.1 )
elif target_speed < control_speed:
control_speed = max( target_speed, control_speed - 0.1 )
else:
control_speed = target_speed
if target_z_speed > control_z_speed:
control_z_speed = min( target_z_speed, control_z_speed + 0.1 )
elif target_z_speed < control_z_speed:
control_z_speed = max( target_z_speed, control_z_speed - 0.1 )
else:
control_z_speed = target_z_speed
if target_turn > control_turn:
control_turn = min( target_turn, control_turn + 0.5 )
elif target_turn < control_turn:
control_turn = max( target_turn, control_turn - 0.5 )
else:
control_turn = target_turn
y_sita = math.sin(sita/180*math.pi)
if y_sita < 0:
y_sita = -y_sita
y_sita = y_sita * zf
twist = Twist()
twist.linear.x = control_speed * math.cos(sita/180*math.pi)
twist.linear.y = control_speed * y_sita
twist.linear.z = control_z_speed
twist.angular.x = 0
twist.angular.y = 0
twist.angular.z = control_turn
pub.publish(twist)
except Exception as e:
print(e)
finally:
twist = Twist()
twist.linear.x = 0; twist.linear.y = 0; twist.linear.z = 0
twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = control_turn
pub.publish(twist)
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
跑实机的话,就不需要运行gazebo仿真了,直接运行mavros的px4.launch文件
roslaunch mavros px4.launch
再运行上面代码即可控制实机(我用的飞控是 Pixhawk6C)
实机操作有风险,请各位有十足把握后再尝试实机
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)