Python控制Ardupilot和gazebo

搭建基本环境Ubuntu22.04+gazebo+ardupilot

  1. 跑通Ardupilot和Gazebo

  1. 查看主机IP(Python程序所在电脑的IP)

    bash 复制代码
    ipconfig
    
    172.22.46.xx

  1. 启动gazebo和ardupilot
    • 启动gazebo

      bash 复制代码
      cd ardupilot_gazebo
      gz sim -v4 -r iris_runway.sdf --render-engine ogre
    • 启动ardupilot 将数据通过14550端口转发出去,并可以通过该端口接受命令,双向通信

      bash 复制代码
      cd ardupilot
      sim_vehicle.py -v ArduCopter -f gazebo-iris --model JSON --map --console --out=udp:172.22.46.xx:14550
    • 运行Python代码

      python 复制代码
      from pymavlink import mavutil
      import time
      
      # 建立连接
      master = mavutil.mavlink_connection('udpin:0.0.0.0:14550')
      master.wait_heartbeat()
      print("✅ 已连接飞控!")
      
      
      def set_target_location(n, e, d):
          """
          发送本地 NED 坐标目标点
          n: 北向位移 (米)
          e: 东向位移 (米)
          d: 高度 (注意:NED系中,高度为负值,-5代表上方5米)
          """
          master.mav.set_position_target_local_ned_send(
              0,  # 时间戳
              master.target_system, master.target_component,
              mavutil.mavlink.MAV_FRAME_LOCAL_NED,  # 使用本地坐标系
              0b0000111111111000,  # 掩码:只关注位置信息 (X, Y, Z)
              n, e, d,  # 目标位置
              0, 0, 0,  # 速度
              0, 0, 0,  # 加速度
              0, 0  # 偏航角
          )
      
      
      def wait_reach_target(target_n, target_e, threshold=0.3):
          """等待无人机到达目标点误差范围内 + 实时打印姿态数据"""
          while True:
              # --------------------------
              # 【核心新增】实时获取并打印数据
              # --------------------------
              # 1. 获取位置 (NED)
              pos_msg = master.recv_match(type='LOCAL_POSITION_NED', blocking=True)
      
              # 2. 获取姿态 (角速率 / 欧拉角)
              att_msg = master.recv_match(type='ATTITUDE', blocking=True)
      
              # 解析数据
              # 位置
              north = pos_msg.x  # 北
              east = pos_msg.y  # 东
              down = pos_msg.z  # 下(负值=高度)
              alt_abs = -down  # 真实高度(米)
      
              # 姿态 (弧度转角度)
              roll = att_msg.roll * 180 / 3.14159  # 横滚
              pitch = att_msg.pitch * 180 / 3.14159  # 俯仰
              yaw = att_msg.yaw * 180 / 3.14159  # 偏航
      
              # 速度
              v_n = pos_msg.vx
              v_e = pos_msg.vy
              v_d = pos_msg.vz
      
              # --------------------------
              # 【打印】位置 + 姿态 + 高度
              # --------------------------
              print(f"📊 位置(N/E): {north:6.2f} / {east:6.2f} m | "
                    f"高度: {alt_abs:5.2f} m | "
                    f"姿态(R/P/Y): {roll:6.1f} / {pitch:6.1f} / {yaw:6.1f} °")
      
              # 判断是否到达目标点
              dist = ((pos_msg.x - target_n) ** 2 + (pos_msg.y - target_e) ** 2) ** 0.5
              if dist < threshold:
                  print(f"\n🎯 到达目标点: ({target_n}, {target_e})")
                  break
              time.sleep(0.2)
      
      
      # --- 任务开始 ---
      
      # 1. 切换模式、解锁、起飞
      print("🔄 切换到 GUIDED 模式")
      master.mav.set_mode_send(master.target_system, mavutil.mavlink.MAV_MODE_FLAG_CUSTOM_MODE_ENABLED, 4)  # GUIDED
      time.sleep(1)
      
      print("🔓 解锁电机")
      master.mav.command_long_send(master.target_system, master.target_component,
                                   mavutil.mavlink.MAV_CMD_COMPONENT_ARM_DISARM, 0,
                                   1, 0, 0, 0, 0, 0, 0)
      time.sleep(2)
      
      print("🚀 起飞到 5米 高度")
      master.mav.command_long_send(master.target_system, master.target_component,
                                   mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0,
                                   0, 0, 0, 0, 0, 0, 5)
      
      # 等待起飞并打印数据
      print("起飞中... 实时数据如下:\n")
      time.sleep(8)
      
      # 2. 绘制正方形 (边长 5m)
      waypoints = [
          (5, 0),  # 向北 5m
          (5, 5),  # 向东 5m
          (0, 5),  # 向南 5m
          (0, 0)  # 回到原点上方
      ]
      
      for n, e in waypoints:
          print(f"\n➡️  正在前往: 北 {n}, 东 {e}")
          set_target_location(n, e, -5)  # 保持高度在 -5m (NED系)
          wait_reach_target(n, e)
      
      # 3. 降落
      print("\n⏬ 回到原点,准备降落...")
      master.mav.command_long_send(
          master.target_system, master.target_component,
          mavutil.mavlink.MAV_CMD_NAV_LAND, 0, 0, 0, 0, 0, 0, 0, 0
      )
      
      # 4. 确认锁定 (Disarm)
      while True:
          heartbeat = master.recv_match(type='HEARTBEAT', blocking=True)
          if not (heartbeat.base_mode & mavutil.mavlink.MAV_MODE_FLAG_SAFETY_ARMED):
              print("\n🛬 降落完成,电机已锁定。")
              break
          time.sleep(1)
      • 结果
相关推荐
24年生活经验_小旻1 小时前
Ardupilot和Gazebo的环境搭建
无人机
YOLO数据集集合1 小时前
无人机航拍人体检测数据集|低空巡检搜救智能监控|YOLO目标检测算法训练集
人工智能·深度学习·yolo·目标检测·无人机
小O的算法实验室1 天前
2026年IEEE TASE,未知环境中的无人机群动态轨迹规划
无人机
zh路西法1 天前
【OpenCV无人机光流速度估计】基于Farneback稠密光流方法的无人机速度估计
人工智能·python·opencv·计算机视觉·无人机
德思特1 天前
特斯拉同款智慧充电站方案 | 德思特5G天线方案,解决充电桩分散联网难题
自动驾驶·无人机·天线
钓了猫的鱼儿1 天前
基于深度学习+AI的无人机违规防控目标检测与预警系统(Python源码+数据集+UI可视化界面+YOLOv11训练结果)
人工智能·深度学习·无人机
LONGZETECH1 天前
Unity 3D工业级教育软件实战:200+无人机装调任务的碰撞检测与交互落地
3d·unity·架构·游戏引擎·无人机·交互·cocos2d
LONGZETECH2 天前
架构师实战拆解|无人机智慧实训SaaS中台:断电续考、AI组卷、多端同步核心设计
大数据·人工智能·架构·系统架构·无人机
战族狼魂2 天前
集 “自动飞行、智能识别、实时预警、勤务联动” 于一体的高速公路应急车道无人机检测系统方案
java·人工智能·大模型·无人机