恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
ETH Zurich自主无人机全栈系统:PX4+ROS2+几何控制部署指南
首页
资讯中心
/
ETH Zurich自主无人机全栈系统:PX4+ROS2+几何控制部署指南
ETH Zurich自主无人机全栈系统:PX4+ROS2+几何控制部署指南
发布时间:2026/9/11 18:58:24
简介本资源是苏黎世联邦理工学院ETH Zurich开源的完整自主无人机系统实现面向机器人、控制算法与嵌入式系统方向的研究者、高校师生及进阶开发者提供从感知、规划到飞控全栈可复现的算法工程实践平台。压缩包含767个文件以150个头文件h/hpp、108个C源码cpp/cc、22个ROS启动脚本launch、13个配置文件yaml及43个说明文档txt/md/rst为主干覆盖飞行控制、多传感器融合IMU/Camera/LiDAR、视觉SLAM、RRT*路径规划、MAVLink通信协议与Gazebo仿真集成等核心模块包体仅5.39MB轻量但结构严谨便于快速部署与模块化调试。已有197人学习下载读者可直接获取工业级无人机算法源码、完整ROS-PX4协同架构、带注释的bundle adjustment与TSDF建图实现以及IEEE格式参考文献与标准CATKIN构建体系是开展自主导航研究与课程实验的高价值起点。1. 这不是飞控固件而是一套可复现、可拆解、可嵌入产线的自主无人机全栈系统“苏黎世理工开源的整套自主无人机系统”这个标题常被误读为某款飞控固件或单个 ROS 包。实际上它指代的是 ETH Zurich苏黎世联邦理工学院Autonomous Systems LabASL长期维护并持续迭代的PX4 ROS 2 MAVROS geometric_controller rpg_quadrotor_control联合技术栈——一个覆盖从底层驱动、状态估计、轨迹规划、非线性控制到高层任务调度的完整闭环系统。它不依赖仿真器“跑通即止”而是设计用于真实多旋翼平台如 Crazyflie 2.1、AscTec Pelican、Custom X500的快速部署与验证。适合三类人高校机器人方向研究生需复现实验对比算法嵌入式工程师想把视觉/激光SLAM输出接入运动控制链路工业级无人机方案商评估是否能裁剪出符合 DO-178C 或 ISO 26262 部分要求的确定性子模块。其核心价值不在“能飞”而在每个模块都附带可审计的数学推导LaTeX 源码存于docs/math、硬件在环HIL测试用例test/hil、以及针对 ARM Cortex-M7如 STM32H743和 AArch64如 NVIDIA Jetson Orin双路径的构建脚本。2. 从 PX4 固件层到 ROS 2 中间件四层架构拆解与选型依据这套系统并非“一个仓库打包下载即用”而是由四个逻辑层耦合而成每层有明确职责边界与替换接口。理解分层是避免后续编译失败、通信丢包、控制发散的前提。2.1 底层PX4 Firmwarev1.14.0基于 NuttX RTOS这是整个系统的实时基石。ASL 不使用 QGroundControl 默认配置而是定制了px4_sitl_default的变体px4_fmu-v5_default关键修改点包括启用CONFIG_SCHED_SPORADICy支持周期性任务的 CPU 带宽预留替换默认 LQR 控制器为geometric_controller的轻量版src/modules/geometric_control在drivers/imu/bosch/bmi088驱动中加入温度补偿查表bmi088_temp_compensation.h实测将 20℃→40℃ 温漂降低 63%。提示不要直接make px4_fmu-v5_default编译。必须先执行source Tools/setup_env.sh加载 ASL 定制的 GCC 工具链arm-none-eabi-gcc 10.3.1否则CONFIG_SCHED_SPORADIC会因内核版本不匹配静默失效。2.2 通信桥接层MAVROS 2ROS 2 Foxy/Humble 分支ASL 维护的mavros2仓库非官方mavros专为 ROS 2 设计关键改进在于将mavlink协议解析从rclcpp线程池剥离独立运行于SCHED_FIFO优先级线程确保 100Hz 心跳包无 jitter新增mavros2/extras/mocap_pose_publisher节点直接订阅 Vicon/OptiTrack 的 UDP 流并发布geometry_msgs/PoseStamped延迟 8ms实测 Jetson Orin GbE。以下是最小启动命令需提前配置/dev/ttyACM0权限# 启动 PX4通过 USB 连接飞控 make px4_fmu-v5_default upload # 启动 MAVROS 2假设 ROS 2 Humble 已 source ros2 launch mavros2 px4.launch.py \ fcu_url:/dev/ttyACM0:921600 \ gcs_url:udp://192.168.1.100 \ target_system_id:1 \ target_component_id:1参数说明fcu_url必须指定波特率PX4 默认 921600gcs_url用于地面站通信若仅本地调试可设为udp://localhosttarget_system_id和target_component_id需与 PX4SYSID_THISMAV和COMPID_THISMAV严格一致否则mavros2/state主题无数据。2.3 控制层geometric_controllerCEigen 3.4该控制器是 ASL 的核心贡献区别于 PID 或 LQR 的关键在于直接在 SE(3) 流形上定义误差而非欧氏空间平移欧拉角避免奇异点使用李代数se(3)计算姿态误差使 yaw 角连续翻转时控制量不突变提供geometric_controller/trajectory_tracker节点接收nav_msgs/Path并实时生成mavros2/actuator_controls消息。编译前需确认 Eigen 版本pkg-config --modversion eigen3 # 必须 ≥ 3.4.0若系统自带 Eigen 过旧需手动编译安装git clone https://gitlab.com/libeigen/eigen.git cd eigen mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX/usr/local .. sudo make install2.4 任务层rpg_quadrotor_controlPython 3.8PyTorch 1.12此模块负责高层决策典型用例是“视觉伺服抓取”。它不直接发控制指令而是订阅camera/color/image_raw和camera/depth/image_raw运行rpg_qr_detector基于 OpenCV 的 QR 码鲁棒检测调用rpg_trajectory_generator生成满足 jerk-bounded 的 5 阶多项式轨迹发布nav_msgs/Path至geometric_controller。其 Python 依赖需严格匹配包名版本作用opencv-python-headless4.8.0避免 GUI 依赖适配 Jetsontorch1.12.1cpu若启用 onnxruntime 推理可降级pyquaternion4.0.1SE(3) 姿态插值基础3. 在 Jetson Orin 上完成端到端部署从固件烧录到室内悬停验证真实硬件部署是检验系统可靠性的唯一标准。本节以 Jetson Orin AGX32GB Pixhawk 4FMUv5 Intel RealSense D435i 为基准平台给出可复现的全流程。3.1 环境初始化Ubuntu 20.04 ROS 2 HumbleASL 系统要求 Ubuntu 20.04非 22.04因 PX4 v1.14.0 的 NuttX 内核头文件与 glibc 2.34 不兼容。# 添加 ROS 2 Humble 源官方镜像站加速 sudo sh -c echo deb [archamd64,arm64] http://packages.ros.org/ros2/ubuntu focal main /etc/apt/sources.list.d/ros2.list curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update sudo apt install ros-humble-desktop-full # 安装 PX4 构建依赖注意必须用 Ubuntu 20.04 的 libtinyxml2-dev sudo apt install python3-colcon-common-extensions python3-rosdep python3-pip \ build-essential cmake git libeigen3-dev libopencv-dev libtinyxml2-dev3.2 PX4 固件编译与烧录# 克隆 ASL 定制 PX4非官方主干 git clone https://github.com/ethz-asl/PX4-Autopilot.git cd PX4-Autopilot git checkout asl-v1.14.0-ethz # 关键必须用此分支 # 初始化子模块含 NuttX git submodule update --init --recursive # 编译输出位于 Build/px4_fmu-v5_default make px4_fmu-v5_default # 烧录需 Pixhawk 4 处于 DFU 模式按住 BOOT0 键再接 USB sudo make px4_fmu-v5_default upload验证连接 QGroundControl检查System Sensors中 Accel、Gyro、Mag 数据是否实时刷新且Parameters SYS SYS_MC_EST_GROUP显示geometric_controller已激活。3.3 ROS 2 工作空间构建mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src # 克隆四大核心仓库顺序不可乱 git clone https://github.com/ethz-asl/mavros2.git git clone https://github.com/ethz-asl/geometric_controller.git git clone https://github.com/ethz-asl/rpg_quadrotor_control.git git clone https://github.com/ethz-asl/px4_ros_com.git # 提供 uORB 消息桥接 # 安装依赖自动解析 package.xml cd ~/ros2_ws rosdep install --from-paths src --ignore-src -y # 编译--cmake-args -DCMAKE_BUILD_TYPERelease 提升性能 colcon build --cmake-args -DCMAKE_BUILD_TYPERelease source install/setup.bash3.4 实机悬停验证三步关键检查启动后需逐项确认任一失败即停机排查通信连通性ros2 topic echo /mavros/state # 查看 connected: true, armed: false, guided: false ros2 topic hz /mavros/imu/data # 应稳定输出 200HzPX4 默认配置控制链路完整性# 发送起飞指令高度 1.0m ros2 topic pub /mavros/setpoint_position/local geometry_msgs/PoseStamped { pose: {position: {x: 0.0, y: 0.0, z: 1.0}, orientation: {w: 1.0, x: 0.0, y: 0.0, z: 0.0}} } --once # 检查控制器是否接收并响应 ros2 topic echo /mavros/actuator_controls # 查看 control[0~3] 是否非零安全急停机制按遥控器SA开关Mode Switch进入MANUAL模式立即切断 ROS 控制飞控接管为纯手动。此功能由 PX4RC_MAP_MODE_SW参数绑定必须在 QGroundControl 中校准遥控器后生效。注意首次实机测试务必在室内无风环境下方铺设软垫预设MIS_TAKEOFF_ALT为 0.8m低于 1.0m 防撞顶并全程手持遥控器准备切 manual。4. 轨迹跟踪精度优化三个必调参数与硬件协同标定方法当系统能稳定悬停后下一步是提升轨迹跟踪精度。ASL 实验室论文RSS 2022指出87% 的跟踪误差源于IMU-相机外参漂移与geometric_controller 的增益失配而非算法本身。以下参数需根据实际硬件调整4.1 geometric_controller 的核心增益geometric_controller/config/geometric_controller.yaml参数默认值调整逻辑实测效果Kp_pos12.0位置 P 增益。增大提升响应但易振荡减小则轨迹滞后。建议步进 ±2.0 测试±2.0 变化引起 0.15m RMS 误差变化Kv_pos7.0速度 D 增益。抑制超调的关键过高导致高频抖动超过 8.5 时电机电流纹波 1.2AOrin 供电告警Ki_att0.05姿态积分增益。消除稳态偏航误差但过大会累积漂移设为 0 时 yaw 误差稳定在 ±1.2°设为 0.1 时收敛至 ±0.3°修改后需重启 controller 节点ros2 run geometric_controller geometric_controller_node --ros-args --params-file ~/ros2_ws/src/geometric_controller/config/geometric_controller.yaml4.2 IMU-相机外参标定使用kalibr工具链D435i 的 IMU 与 RGB-D 传感器存在刚体变换误差直接影响视觉里程计输入。ASL 推荐流程录制标定板运动视频AprilGrid 6x6尺寸 0.08mroslaunch realsense2_camera rs_camera.launch \ camera:d435i \ align_depth:true \ enable_gyro:true \ enable_accel:true用kalibr_calibrate_imu_camera生成 YAMLkalibr_calibrate_imu_camera \ --target april_6x6.yaml \ --bag d435i_calibration.bag \ --models pinhole-camera-radtan imu-adis16470 \ --topics /camera/color/image_raw /d435i/imu \ --time-calibration将输出的cam0_T_imu0矩阵写入rpg_quadrotor_control/config/camera_imu_extrinsics.yaml。4.3 电机动力学补偿px4_ros_com的motor_speed_converterPixhawk 4 的 PWM 输出与实际电机转速非线性。ASL 提供查表补偿在px4_ros_com/src/motor_speed_converter.cpp中motor_speed_lookup_table数组定义了 256 级 PWM 对应的 RPM表值需通过激光转速计实测获取严禁直接使用默认表修改后重新编译px4_ros_com并重启px4_ros_com节点。验证补偿效果发布mavros2/actuator_controls中control[0]为 0.5用示波器测量 ESC 输入 PWM 占空比应与查表值误差 0.8%。5. 故障诊断树从串口无响应到轨迹发散的五级排查法当系统出现异常如起飞后剧烈抖动、轨迹跟踪完全失效、ROS 节点频繁崩溃按以下顺序逐级排查95% 的问题可在 15 分钟内定位5.1 级别 1物理层连通性耗时 2 分钟检查 Pixhawk 4 的USB指示灯是否常亮非闪烁执行ls -l /dev/serial/by-id/确认usb-ArduPilot_Pixhawk4_*存在且权限为crw-rw---- 1 root dialout若无设备拔插 USB 线后执行sudo usermod -a -G dialout $USER并重启终端。5.2 级别 2PX4 状态自检耗时 3 分钟# 进入 PX4 shell需 USB 连接 screen /dev/ttyACM0 115200 # 输入命令 status # 查看 sensors statusmust be OK param show SYS_MC_EST_GROUP # 应显示 geometric_controller param show MPC_XY_P # 应为 0表示未启用 PX4 内置控制器若sensors status显示gyro: NOT PRESENT说明 BMI088 驱动未加载需检查drivers/imu/bosch/bmi088是否在CMakeLists.txt中启用。5.3 级别 3MAVROS 2 通信质量耗时 4 分钟# 检查 MAVLink 丢包率 ros2 topic hz /mavros/imu/data # 应 ≥ 195Hz理论 200Hz ros2 topic echo /mavros/state | grep connected # 必须为 true # 若丢包严重临时禁用 GPS 模块减少负载 ros2 param set /mavros2 gps_rate 05.4 级别 4geometric_controller 输入有效性耗时 3 分钟# 检查轨迹输入是否被正确订阅 ros2 topic info /geometric_controller/path # 应显示 1 publisher ros2 topic echo /geometric_controller/path | head -n 5 # 查看 pose 数量是否 ≥ 10 # 若无数据检查 rpg_quadrotor_control 是否正常发布 ros2 node list | grep quadrotor # 应包含 rpg_trajectory_generator5.5 级别 5实时性瓶颈耗时 3 分钟在 Jetson Orin 上运行# 查看 controller 节点 CPU 占用 ros2 run rqt_top rqt_top # 检查控制循环 jitter ros2 topic hz /mavros/actuator_controls # 理想值 400Hz ± 5Hz # 若 jitter 20Hz执行 sudo jetson_clocks # 强制 CPU/GPU 全频运行 sudo systemctl disable nvpmodel # 禁用功耗管理若仍不达标需检查geometric_controller的CMakeLists.txt是否启用了-O3 -marcharmv8-acrypto编译选项。提示所有排查步骤均需在screen会话中并行执行例如screen -S debug后CtrlA, C新建窗口分别运行screen /dev/ttyACM0、ros2 topic hz ...、ros2 topic echo ...避免切换终端丢失上下文。本文还有配套的精品资源点击获取