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)
      • 结果
相关推荐
地图小课堂19 小时前
Bigemap Pro如何打开无人机航拍影像并套合配准(有坐标 geoTiff、ecw)
无人机·软件工程
Multipath71221 小时前
上车即入院,链路先到院——乾元通多链路聚合,为智慧救护车守住移动中的生命线
网络·人工智能·网络协议·udp·无人机
moonsims1 天前
AiBrainBox-UGV 通 · 感 · 算 · 控一体化地面机器人边缘智能平台 规格书
大数据·网络·人工智能·无人机
AiNightVision1 天前
星光级 是什么?——星光级摄像机是什么?0.001Lux 照度门槛与选型真相
人工智能·算法·车载系统·自动驾驶·无人机·视频·智能硬件
飞Link1 天前
什么是 AirSim?一文读懂无人机仿真平台
python·算法·无人机
亥时无人机管理系统2 天前
一网统飞无人机管理系统源码深度评测
架构·私有化部署·无人机·低空经济·无人机管理系统·一网统飞
蓝悦无人机2 天前
如何选择直升机桨盘载荷
无人机·桨盘载荷·悬停升限·最大平飞速度·旋翼重量·诱导功率
QXWZ_IA2 天前
无人机巡检油气管道如何实现自主飞行和AI识别?
人工智能·无人机
Frankie_stand2 天前
大模型与无人机结合:从遥控工具到智能副驾的六大落地场景
无人机
QXWZ_IA2 天前
油气行业如何实现AI智能巡检?无人机+机器人+视觉AI全栈方案
人工智能·机器人·无人机