国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

PX4無人機 - 鍵盤控制飛行代碼

這篇具有很好參考價值的文章主要介紹了PX4無人機 - 鍵盤控制飛行代碼。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

PX4無人機 - 鍵盤控制飛行代碼

仿真效果
無人機編程代碼,PX4,PX4,鍵盤控制,Offboard,Gazebo,無人機

實機效果
由于圖片限制5M以內(nèi),只能上傳一小段了,整段視頻請點擊鏈接 Pixhawk 6c | 無人機 | 鍵盤控制無人機 | Offboard模式
無人機編程代碼,PX4,PX4,鍵盤控制,Offboard,Gazebo,無人機

核心: 發(fā)布 mavros/setpoint_velocity/cmd_vel_unstamped 話題,控制x y z三個方向的速度
運行前先運行PX4自帶仿真,例如

roslaunch px4 mavros_posix_sitl.launch

接著運行以下代碼(根據(jù)WHEELTEC麥克納姆輪小車的鍵盤控制代碼改寫)

注意:

空格:降落

5 :開啟offboard模式

6 :解鎖,準備起飛

7 :起飛

控制順序:
先按 5 開啟offboard 模式
再按 6 解鎖,會看到漿液開始轉(zhuǎn)動
再按 7 起飛 (這里起飛后就不在 offboard 模式)
再按一次 5 切換到 offboard 模式(之后就可以通過鍵盤控制前后運動,左右旋轉(zhuǎn)了)

控制運動鍵如下
i 鍵:前進
K 鍵:停止運動
, 鍵:后退
J 鍵:向左轉(zhuǎn)
L鍵:向右轉(zhuǎn)
R鍵:上升
F鍵:下降

運動速度調(diào)整鍵如下
常用鍵如下:
W 鍵:增加運動線速度
X 鍵:減少運動線速度
E 鍵:增加旋轉(zhuǎn)角速度
C 鍵:減少旋轉(zhuǎn)角速度

降落
空格鍵

#!/usr/bin/env python
# coding=utf-8

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

# 空格:降落
# 5  :開啟offboard模式
# 6  :解鎖,準備起飛
# 7  :起飛

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 #全向移動模式

#鍵值對應移動/轉(zhuǎn)向方向
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),
          }

#獲取鍵值函數(shù)
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 #默認移動速度 m/s
turn  = 1   #默認轉(zhuǎn)向速度 rad/s
#以字符串格式返回當前速度
def vels(speed,turn):
    return "currently:\tspeed %s\tturn %s " % (speed,turn)

sita = 0.0  # 朝向
z = 0
w = 0
zf = 1
# 回調(diào)函數(shù):訂閱無人機位姿
def pose_cb(m):
    global sita
    global z
    global w
    global zf
    z = m.pose.orientation.z
    w = m.pose.orientation.w
    # 計算朝向在x軸的上方還是下方
    if z*w > 0:
        zf = 1
    else:
        zf = -1
    sita = 2*math.acos(w)*180/math.pi
    # rospy.loginfo('%.2f\r',sita)

current_state = State()
# 回調(diào)函數(shù):訂閱mavros狀態(tài)
def state_cb(state):
    global current_state
    current_state = state

#主函數(shù)
if __name__=="__main__":
    settings = termios.tcgetattr(sys.stdin) #獲取鍵值初始化,讀取終端相關(guān)屬性
    
    rospy.init_node('turtlebot_teleop') #創(chuàng)建ROS節(jié)點
    pub = rospy.Publisher('mavros/setpoint_velocity/cmd_vel_unstamped', Twist, queue_size=5) #創(chuàng)建速度話題發(fā)布者
    # 訂閱無人機位姿
    rospy.Subscriber('mavros/local_position/pose',PoseStamped, pose_cb)

    # 訂閱mavros狀態(tài)
    rospy.Subscriber('mavros/state',State,state_cb)

    # 定義起飛降落服務(wù)客戶端(起飛,降落)
    setModeServer = rospy.ServiceProxy('mavros/set_mode',SetMode)

    armServer = rospy.ServiceProxy('/mavros/cmd/arming', CommandBool)

    x      = 0   #前進后退方向
    y      = 0   #左右移動方向
    z      = 0   #上下移動方向
    th     = 0   #轉(zhuǎn)向/橫向移動方向
    count  = 0   #鍵值不再范圍計數(shù)
    target_speed = 0 #前進后退目標速度
    target_z_speed = 0 #上下運動目標速度
    target_turn  = 0 #轉(zhuǎn)向目標速度
    control_speed = 0 #前進后退實際控制速度
    control_z_speed = 0 #上下運動實際控制速度
    control_turn  = 0 #轉(zhuǎn)向?qū)嶋H控制速度
    try:
        print(msg) #打印控制說明
        print(vels(speed,turn)) #打印當前速度
        while(1):
            key = getKey() #獲取鍵值

            # if key:
            #     print('key = ',key)
            
            #判斷鍵值是否在移動/轉(zhuǎn)向方向鍵值內(nèi)
            # if key in moveBindings.keys():
            #     x  = moveBindings[key][0]
            #     th = moveBindings[key][1]
            #     count = 0

            if key == 'i':   #前進
                count = 0
                x = 1
                z = 0
            elif key == ',': #后退 
                count = 0
                x = -1
                z = 0
            elif key == 'j': #往左轉(zhuǎn)
                count = 0
                th = 1
                z = 0
            elif key == 'l': #往右轉(zhuǎn)
                count = 0
                th = -1
                z = 0
            elif key == 'r': #上升
                count = 0
                z = 1
            elif key == 'f': #下降
                count = 0
                z = -1
            #判斷鍵值是否在速度增量鍵值內(nèi)
            elif key in speedBindings.keys():
                speed = speed * speedBindings[key][0]
                turn  = turn  * speedBindings[key][1]
                count = 0
                print(vels(speed,turn)) #速度發(fā)生變化,打印出來

            #空鍵值/'k',相關(guān)變量置0
            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')
            # 開啟offboard模式
            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')

            #長期識別到不明鍵值,相關(guān)變量置0
            else:
                count = count + 1
                if count > 4:
                    x  = 0
                    y  = 0
                    z  = 0
                    th = 0
                if (key == '\x03'):
                    break

            #根據(jù)速度與方向計算目標速度
            target_speed = speed * x
            target_z_speed = speed * z
            target_turn  = turn * th

            #x方向平滑控制,計算前進后退實際控制速度
            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
            
            #z方向平滑控制,實際控制速度
            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

            #平滑控制,計算轉(zhuǎn)向?qū)嶋H控制速度
            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方向的sin值
            y_sita = math.sin(sita/180*math.pi)
            # 如果小于0,則改為正數(shù)
            if y_sita < 0:
                y_sita = -y_sita
            # 乘以y分量的正負(通過四元數(shù)z*w獲得,z*w>0,y分量在x軸上方)
            y_sita = y_sita * zf

            twist = Twist()  #創(chuàng)建ROS速度話題變量
            twist.linear.x = control_speed * math.cos(sita/180*math.pi)
            twist.linear.y = control_speed * y_sita  # 朝向速度乘以y軸sin值
            twist.linear.z = control_z_speed
            twist.angular.x = 0
            twist.angular.y = 0
            twist.angular.z = control_turn

            pub.publish(twist) #ROS發(fā)布速度話題

    #運行出現(xiàn)問題則程序終止并打印相關(guān)錯誤信息
    except Exception as e:
        print(e)

    #程序結(jié)束前發(fā)布速度為0的速度話題
    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)

    #程序結(jié)束前設(shè)置終端相關(guān)屬性
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)

跑實機的話,就不需要運行g(shù)azebo仿真了,直接運行mavros的px4.launch文件

roslaunch mavros px4.launch

再運行上面代碼即可控制實機(我用的飛控是 Pixhawk6C)
實機操作有風險,請各位有十足把握后再嘗試實機文章來源地址http://www.zghlxwxcb.cn/news/detail-600874.html

到了這里,關(guān)于PX4無人機 - 鍵盤控制飛行代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【PX4&Simulink&Gazebo聯(lián)合仿真】在Simulink中使用ROS2控制無人機沿自定義圓形軌跡飛行并在Gazebo中可視化

    【PX4&Simulink&Gazebo聯(lián)合仿真】在Simulink中使用ROS2控制無人機沿自定義圓形軌跡飛行并在Gazebo中可視化

    本篇文章介紹如何使用ROS2控制無人機沿自定義圓形軌跡飛行并在Gazebo中可視化,提供了Matlab/Simulink源代碼,以及演示效果圖。 環(huán)境: MATLAB : R2022b Ubuntu :20.04 LTS Windows :Windows 10 ROS :ROS2 Foxy Python: 3.8.2 Visual Studio :Visual Studio 2019 PX4 :1.13.0 ROS2的應用程序管道非常簡單,這要

    2024年02月22日
    瀏覽(96)
  • 無人機仿真—PX4編譯,gazebo仿真及簡單off board控制模式下無人機起飛

    無人機仿真—PX4編譯,gazebo仿真及簡單off board控制模式下無人機起飛

    在上篇記錄中,已經(jīng)對整體的PX4仿真環(huán)境有了一定的了解,現(xiàn)如今就要開始對無人機進行起飛等仿真環(huán)境工作,在整體虛擬環(huán)境中如果程序能夠安穩(wěn)起飛降落,即可對無人機進行實飛操作。 需要做的是,通過PX4官網(wǎng)提供的基本程序包,在ROS工作空間下新建程序包對其進行運行

    2024年02月03日
    瀏覽(628)
  • xtdrone用鍵盤控制無人機飛行 無法起飛

    xtdrone用鍵盤控制無人機飛行 無法起飛

    運行案例 解鎖無人機螺旋槳轉(zhuǎn)動但無法起飛 也未報錯 解決方法: 在QGC中修改: PX4飛控EKF配置 將PX4使用的EKF配置為 融合GPS的水平位置與氣壓計高度 。 如果我們想使用視覺定位,就需要把修改配置文件。 ?此修改意味著EKF融合來自mavros/vision_pose/pose的數(shù)據(jù),并不是修改完無

    2024年01月22日
    瀏覽(25)
  • PX4無人機調(diào)參

    PX4無人機調(diào)參

    PX4 1.13.2 日志分析軟件:flight review https://logs.px4.io/ 產(chǎn)生震動的原因: 1,槳葉損壞、動平衡差 2,電機槳座不垂直,電機動平衡差 3,機架剛性不足 4,部件松動 降低震動的方法: 軟件濾波:調(diào)低通濾波或者陷波濾波器參數(shù) 硬件減震:調(diào)減震球的軟度或者加配重 調(diào)參時可以用

    2024年02月15日
    瀏覽(22)
  • 【無人機】PIXHAWK、PX4、APM區(qū)別

    PIXHAWK、PX4、APM APM固件 專為Arduupilot開發(fā)的固件,現(xiàn)也用于PIXHAWK。有ArduCopter社區(qū)支撐、開放,功能全、迭代升級快,適合直接用。由于有較多的歷史兼容性需求,軟件代碼體系相對雜亂,還封裝了PX4的內(nèi)核,學習起來困難些。 PX4固件 專為PIXHAWK開發(fā)的固件。相對封閉,代碼體

    2024年02月20日
    瀏覽(86)
  • Ubuntu PX4無人機仿真環(huán)境配置

    Ubuntu PX4無人機仿真環(huán)境配置

    ?目錄 一、VM虛擬機安裝ubuntu18.04 ? 1、VMware安裝 ? 2、新建虛擬機 二、Ubuntu系統(tǒng)配置 ? 1、更改軟件安裝源 ? 2、安裝中文輸入法 三、PX4環(huán)境搭建 ? 1、安裝git ? 2、下載px4源碼 ? 3、安裝ROS ? 4、安裝MAVROS ? 5、安裝QGC ? 6、仿真測試 四、其他工具安裝 ? 1、VScode安裝 ?????

    2024年02月02日
    瀏覽(1048)
  • px4+vio實現(xiàn)無人機室內(nèi)定位

    px4+vio實現(xiàn)無人機室內(nèi)定位

    文章主要講述px4 如何利用vins_fusion里程計數(shù)據(jù)實現(xiàn)在室內(nèi)定位功能。 文章基于以下軟、硬件展開。 硬件 軟件 機載電腦: Intel NUC 系統(tǒng):Ubuntu 20.04 相機: Intel Realsense D435i ros:noetic 飛控:Pixhawk 2.4.8 固件:PX4 1.14.0 完整vins_to_mavros 功能包地址: https://github.com/rotorcraftman/px4ctr

    2024年02月03日
    瀏覽(30)
  • 無人機/飛控--ArduPilot、PX4學習記錄(2)

    無人機/飛控--ArduPilot、PX4學習記錄(2)

    這是一篇碎碎念,零零碎碎的記錄了環(huán)境配置過程, 僅供本人記錄學習歷程和參考。 (記錄的挺亂的,但是文章鏈接里的博客寫的是真好) 本章主要完成的目標 : 安裝PX4 并 成功運行出3D無人機界面。 參考文章: 搭建PX4環(huán)境: PX4/Pixhawk - 編譯環(huán)境搭建_pix4 yu pixhawk-CSDN博客 使

    2024年03月21日
    瀏覽(89)
  • 無人機/飛控--ArduPilot、PX4學習記錄(5)

    無人機/飛控--ArduPilot、PX4學習記錄(5)

    這幾天看dronekit,做無人機失控保護。 PX4官網(wǎng)上的經(jīng)典案例,我做了很多注解,把代碼過了一遍。 無人機具體執(zhí)行了: ?先起飛,飛至正上空10m-向北移動10m-向東移動10m-向南移動10m-向西移動10m-回到初始起飛點(即home點),降落。 具體執(zhí)行之前,要打開JMAVSim,接下來會在JMAV

    2024年04月15日
    瀏覽(116)
  • PX4學習筆記——無人機以及QGC操作

    PX4學習筆記——無人機以及QGC操作

    官方教程鏈接:https://docs.qgroundcontrol.com/master/en/SetupView/SetupView.html 電腦先打開QGC,進入Vehicle Setup,點擊Firmware。無人機飛控使用USB線連接電腦,然后選擇燒錄的.px4程序(可以是官方的,也可以是自己編譯生成的)。 點擊Airframe,如果無人機為四旋翼,則點擊 Generic Quadcopter

    2024年02月11日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包