1. 硬件连接与基础配置第一次用树莓派控制Pixhawk飞控时我对着桌上那堆线材发呆了半小时。后来才发现硬件连接其实就三个关键点物理接口选择、波特率匹配和权限配置。先说最常用的两种连接方式USB直连用Micro USB线连接树莓派和Pixhawk的USB口相当于给飞控接了个外挂大脑。实测时发现个坑——某些Pixhawk克隆板的USB驱动不稳定飞行中可能断连。解决方法是在/etc/udev/rules.d/下创建规则文件给设备分配固定别名SUBSYSTEMtty, ATTRS{idVendor}26ac, ATTRS{idProduct}0011, SYMLINKpixhawk串口连接更稳定的方案是用树莓派的GPIO串口/dev/ttyAMA0。记得关闭串口控制台功能sudo raspi-config # 选择Interface Options → Serial → 关闭shell访问接线时注意电平转换Pixhawk的TELEM1口3.3V电平直接连树莓派GPIO的UART引脚就行。有次我偷懒没接GND数据包丢得亲妈都不认识。MAVLink协议就像无人机界的普通话不管飞控是PX4还是ArduPilot都得说这套。在树莓派上装环境比想象中简单sudo apt install python3-pip pip3 install pymavlink dronekit装完一定要测试心跳包from pymavlink import mavutil master mavutil.mavlink_connection(/dev/ttyAMA0, baud57600) master.wait_heartbeat() # 这里卡住说明物理层有问题2. 飞控模式深度配置很多人不知道Pixhawk2.4.8的GUIDED模式其实有两副面孔。在Mission Planner里看到模式编号4时先别急着写代码PX4固件GUIDED模式对应主模式1MAV_MODE_FLAG_CUSTOM_MODE_ENABLED加子模式4ArduPilot固件直接发主模式4就行我翻车过三次才记住这个区别。验证模式是否切换成功可以监听HEARTBEAT消息的base_mode字段msg master.recv_match(typeHEARTBEAT, blockingTrue) print(f当前模式: {msg.base_mode} {msg.custom_mode})关键参数配置用QGC地面站修改COM_RC_IN_MODE1# 必须关掉遥控器直通模式NAV_DLL_ACT0# 禁用失控返航调试阶段很危险MIS_TAKEOFF_ALT10# 默认起飞高度有个隐藏坑点Pixhawk2.4.8的USB口和TELEM1口会抢MAVLink通道。建议在参数表里把SER_TEL1_BAUD调到921600然后在脚本里用mavproxy做数据分流mavproxy.py --master/dev/ttyAMA0 --outudp:127.0.0.1:145503. 自主巡航路径算法实战纯用MAVLink指令飞航点太原始了我后来改用Dubins路径动态避障的方案。核心思路是把树莓派变成机载计算机全局路径规划用Python的networkx库加载OpenStreetMap数据生成A*路径局部避障通过MAVLINK_MSG_ID_DISTANCE_SENSOR处理激光雷达数据运动控制将路径点转为MAV_CMD_NAV_WAYPOINT指令序列实测代码片段def send_waypoint(lat, lon, alt): master.mav.command_long_send( master.target_system, master.target_component, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 0, 0, 0, 0, # param1-4 lat, lon, alt # 经纬度单位是度高度是米 ) # 等待到达目标点 while True: pos master.recv_match(typeGLOBAL_POSITION_INT, blockingTrue) current (pos.lat/1e7, pos.lon/1e7, pos.alt/1000) if distance(current, (lat,lon,alt)) 5: # 5米阈值 break遇到的最大挑战是坐标系转换。有次在深圳测试直接把GPS的WGS84坐标当平面坐标发出去无人机差点飞进香港空域。后来乖乖装上了pyproj库做坐标转换from pyproj import Transformer transformer Transformer.from_crs(EPSG:4326, EPSG:2435) # WGS84转本地坐标系 local_x, local_y transformer.transform(lat, lon)4. 毫米级精准降落技术想让无人机像京东物流无人机那样稳稳降落在快递柜上关键在视觉辅助多传感器融合。我的方案是用树莓派跑OpenCV做AprilTag识别硬件配置树莓派4B树莓派官方摄像头CS接口加装超声波模块HC-SR04做高度校验红外测距传感器做接触检测视觉处理流水线import cv2 from pupil_apriltags import Detector at_detector Detector(familiestag36h11) while True: img get_camera_image() # 从CSI摄像头获取图像 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) tags at_detector.detect(gray) if len(tags) 0: tag_center tags[0].center # 获取二维码中心像素坐标 send_landing_adjustment(tag_center) # 发送位置修正指令MAVLink混合控制逻辑当高度2米时用GPS定位粗调高度2米时切换为视觉定位最后0.5米激活超声波红外传感器降落过程状态机代码框架class LandingFSM: def __init__(self): self.state APPROACH def update(self, sensor_data): if self.state APPROACH and sensor_data.alt 100: self.state VISION_GUIDED master.mav.set_position_target_local_ned_send( 0, master.target_system, master.target_component, mavutil.mavlink.MAV_FRAME_LOCAL_NED, 0b0000111111000111, # 只控制XY位置 0, 0, 0, 0, 0, 0, 0, 0, 0 )调试时发现个有趣现象树莓派的WiFi信号会影响Pixhawk的磁罗盘。后来不得不在降落阶段关闭树莓派的无线模块sudo ifconfig wlan0 down # 降落前关闭WiFi5. 实战中的血泪经验电源管理别以为树莓派飞控用充电宝就能带起来。有次飞行中树莓派突然重启后来发现是瞬时电流不够。现在都用6A的PD电源模块还在电源线上串了磁环。看门狗机制一定要给Python脚本加守护进程。我的方案是用systemd服务文件[Unit] DescriptionDrone Control Service Afternetwork.target [Service] ExecStart/usr/bin/python3 /home/pi/drone_control.py Restartalways Userpi [Install] WantedBymulti-user.target日志系统用mavproxy的--log参数记录原始数据还不够。我额外写了个异步日志器import logging from concurrent.futures import ThreadPoolExecutor executor ThreadPoolExecutor(max_workers1) def async_log(level, message): executor.submit(logging.log, level, message)电磁兼容飞控和树莓派之间最好加光电隔离模块。有次电机启动时PWM噪声导致MAVLink数据包错误无人机直接进入失控保护。最后说个真实案例去年给某农业项目做巡检无人机发现棉田里的金属支架会干扰地磁传感器。解决方案是在降落阶段完全禁用磁罗盘纯靠视觉GPS融合定位。这事教会我一个道理——再精确的算法也干不过物理定律做无人机开发永远要有Plan B。