PX4-terrain_estimator

本文详细介绍了PX4飞行控制系统中的TerrainEstimator模块,该模块利用卡尔曼滤波算法估计地形高度,通过预测与校正两个步骤实现精确的高度估计。文中还深入解析了核心函数predict与measurement_update的具体实现。

by luoshi006

参考
https://github.com/PX4/Firmware/blob/master/src/lib/terrain_estimation/terrain_estimator.h


PX4 位置估计中的 TerrainEstimator,直译为地形估计,用于估计地形高度 。

该部分代码使用卡尔曼滤波进行估计,分为* 预测 - 校正 *两步。




变量

    // 函数主要变量。
    matrix::Vector<float, n_x> _x;      // state: ground distance, velocity, accel bias in z direction
    float  _u_z;            // acceleration in earth z direction
    matrix::Matrix<float, 3, 3> _P; // covariance matrix
    ....
    //构造函数中的初始化:
    _u_z = 0.0f;
    _P.setIdentity();//单位阵;

主要函数声明

//函数主要部分【预测】【校正】。
    void predict(float dt, const struct vehicle_attitude_s *attitude, 
                const struct sensor_combined_s *sensor,
                const struct distance_sensor_s *distance);

    void measurement_update(uint64_t time_ref, const struct vehicle_gps_position_s *gps,
                const struct distance_sensor_s *distance,
                const struct vehicle_attitude_s *attitude);

预测 predict

void TerrainEstimator::predict(float dt, const struct vehicle_attitude_s *attitude,
                   const struct sensor_combined_s *sensor,
                   const struct distance_sensor_s *distance)
{
    //获取当前姿态旋转矩阵;
    matrix::Dcmf R_att = matrix::Quatf(attitude->q);
    //加速度计读数;
    matrix::Vector<float, 3> a(&sensor->accelerometer_m_s2[0]);
    matrix::Vector<float, 3> u;
    //将加速度计读数投影到导航坐标系;
    u = R_att * a;
    //补偿重力加速度 9.80665f  m/s^2
    _u_z = u(2) + CONSTANTS_ONE_G; // compensate for gravity

    // dynamics matrix
    matrix::Matrix<float, n_x, n_x> A;
    A.setZero(); //        [ 0 1 0 ]
    A(0, 1) = 1; //        [ 0 0 1 ]
    A(1, 2) = 1; //        [ 0 0 0 ]  

    // input matrix
    matrix::Matrix<float, n_x, 1>  B;
    B.setZero();  //        [ 0 ]
    B(1, 0) = 1;  //        [ 1 ]
                  //        [ 0 ]

    // input noise variance
    // 博主认为此处 R 为加速度计参数
    float R = 0.135f;

    // process noise convariance
    //这里的Q为零阵,好像没有用,作用被上方的R代替;
    matrix::Matrix<float, n_x, n_x>  Q;
    Q(0, 0) = 0;
    Q(1, 1) = 0;

    // do prediction
    //此处代码解释见下方图片内容;
    matrix::Vector<float, n_x>  dx = (A * _x) * dt;
    dx(1) += B(1, 0) * _u_z * dt;

    // propagate state and covariance matrix
    _x += dx;
    _P += (A * _P + _P * A.transpose() +
           B * R * B.transpose() + Q) * dt;
}

这里写图片描述


校正 update

此处 distance_sensor_s 对应的传感器有[laser range finder]、[ultra Sound]、[infrared]。

void TerrainEstimator::measurement_update(uint64_t time_ref, const struct vehicle_gps_position_s *gps,
        const struct distance_sensor_s *distance,
        const struct vehicle_attitude_s *attitude)
{
    // terrain estimate is invalid if we have range sensor timeout
    if (time_ref - distance->timestamp > DISTANCE_TIMEOUT) {
        _terrain_valid = false;
    }

    if (distance->timestamp > _time_last_distance) {
        matrix::Quatf q(attitude->q);
        matrix::Eulerf euler(q);
        //传感器测量高度;
        float d = distance->current_distance;

        matrix::Matrix<float, 1, n_x> C;
        C(0, 0) = -1; // measured altitude,  [ -1 0 0 ]

        float R = 0.009f; //并不知道怎么得到的这个参数;

        matrix::Vector<float, 1> y;
        //校正 roll  pitch 引起的高度变化;
        y(0) = d * cosf(euler.phi()) * cosf(euler.theta());

        // residual 残差
        //此处代码解释见下方图片内容;
        matrix::Matrix<float, 1, 1> S_I = (C * _P * C.transpose());
        S_I(0, 0) += R;
        S_I = matrix::inv<float, 1> (S_I);
        matrix::Vector<float, 1> r = y - C * _x;

        matrix::Matrix<float, n_x, 1> K = _P * C.transpose() * S_I;

        // some sort of outlayer rejection 野值处理
        if (fabsf(distance->current_distance - _distance_last) < 1.0f) {
            _x += K * r;
            _P -= K * C * _P;
        }

        ....

        }

这里写图片描述

GPS 部分代码,原理同上,用于校正 velocity
gps->vel_d_m_s GPS Down Velocity (m/s)


lixing@lixing:~/1/Fast-LIO2$ rostopic list /broadcast_bspline /clicked_point /clock /diagnostics /drone_0_ego_planner_node/a_star_list /drone_0_ego_planner_node/global_list /drone_0_ego_planner_node/goal_point /drone_0_ego_planner_node/grid_map/occupancy /drone_0_ego_planner_node/grid_map/occupancy_inflate /drone_0_ego_planner_node/init_list /drone_0_ego_planner_node/optimal_list /drone_0_ego_planner_node/optimal_list_array /drone_0_odom_visualization/cmd /drone_0_odom_visualization/covariance /drone_0_odom_visualization/covariance_velocity /drone_0_odom_visualization/height /drone_0_odom_visualization/path /drone_0_odom_visualization/pose /drone_0_odom_visualization/robot /drone_0_odom_visualization/robot_array /drone_0_odom_visualization/sensor /drone_0_odom_visualization/trajectory /drone_0_odom_visualization/velocity /drone_0_pcl_render_node/camera_pose /drone_0_pcl_render_node/cloud /drone_0_pcl_render_node/depth /drone_0_pcl_render_node/depth/mouse_click /drone_0_pcl_render_node/local_map /drone_0_planning/bspline /drone_0_planning/data_display /drone_0_planning/pos_cmd /drone_0_planning/swarm_trajs /drone_0_visual_slam/odom /drone_10_ego_planner_node/optimal_list /drone_10_ego_planner_node/optimal_list_array /drone_10_odom_visualization/path /drone_10_odom_visualization/robot /drone_10_odom_visualization/robot_array /drone_11_ego_planner_node/optimal_list /drone_11_ego_planner_node/optimal_list_array /drone_11_odom_visualization/path /drone_11_odom_visualization/robot /drone_11_odom_visualization/robot_array /drone_12_ego_planner_node/optimal_list /drone_12_ego_planner_node/optimal_list_array /drone_12_odom_visualization/path /drone_12_odom_visualization/robot /drone_12_odom_visualization/robot_array /drone_13_ego_planner_node/optimal_list /drone_13_ego_planner_node/optimal_list_array /drone_13_odom_visualization/path /drone_13_odom_visualization/robot /drone_13_odom_visualization/robot_array /drone_14_ego_planner_node/optimal_list /drone_14_ego_planner_node/optimal_list_array /drone_14_odom_visualization/path /drone_14_odom_visualization/robot /drone_14_odom_visualization/robot_array /drone_15_ego_planner_node/optimal_list /drone_15_ego_planner_node/optimal_list_array /drone_15_odom_visualization/path /drone_15_odom_visualization/robot /drone_15_odom_visualization/robot_array /drone_16_ego_planner_node/optimal_list /drone_16_ego_planner_node/optimal_list_array /drone_16_odom_visualization/path /drone_16_odom_visualization/robot /drone_16_odom_visualization/robot_array /drone_17_ego_planner_node/optimal_list /drone_17_ego_planner_node/optimal_list_array /drone_17_odom_visualization/path /drone_17_odom_visualization/robot /drone_17_odom_visualization/robot_array /drone_18_ego_planner_node/optimal_list /drone_18_ego_planner_node/optimal_list_array /drone_18_odom_visualization/path /drone_18_odom_visualization/robot /drone_18_odom_visualization/robot_array /drone_19_ego_planner_node/optimal_list /drone_19_ego_planner_node/optimal_list_array /drone_19_odom_visualization/path /drone_19_odom_visualization/robot /drone_19_odom_visualization/robot_array /drone_1_ego_planner_node/grid_map/occupancy_inflate /drone_1_ego_planner_node/optimal_list /drone_1_ego_planner_node/optimal_list_array /drone_1_odom_visualization/path /drone_1_odom_visualization/robot /drone_1_odom_visualization/robot_array /drone_1_pcl_render_node/depth/mouse_click /drone_20_ego_planner_node/optimal_list /drone_20_ego_planner_node/optimal_list_array /drone_20_odom_visualization/path /drone_20_odom_visualization/robot /drone_20_odom_visualization/robot_array /drone_2_ego_planner_node/grid_map/occupancy_inflate /drone_2_ego_planner_node/optimal_list /drone_2_ego_planner_node/optimal_list_array /drone_2_odom_visualization/path /drone_2_odom_visualization/robot /drone_2_odom_visualization/robot_array /drone_2_pcl_render_node/depth/mouse_click /drone_3_ego_planner_node/grid_map/occupancy_inflate /drone_3_ego_planner_node/optimal_list /drone_3_ego_planner_node/optimal_list_array /drone_3_odom_visualization/path /drone_3_odom_visualization/robot /drone_3_odom_visualization/robot_array /drone_3_pcl_render_node/depth/mouse_click /drone_4_ego_planner_node/grid_map/occupancy_inflate /drone_4_ego_planner_node/optimal_list /drone_4_ego_planner_node/optimal_list_array /drone_4_odom_visualization/path /drone_4_odom_visualization/robot /drone_4_odom_visualization/robot_array /drone_4_pcl_render_node/depth/mouse_click /drone_5_ego_planner_node/grid_map/occupancy_inflate /drone_5_ego_planner_node/optimal_list /drone_5_ego_planner_node/optimal_list_array /drone_5_odom_visualization/path /drone_5_odom_visualization/robot /drone_5_odom_visualization/robot_array /drone_5_pcl_render_node/depth/mouse_click /drone_6_ego_planner_node/grid_map/occupancy_inflate /drone_6_ego_planner_node/optimal_list /drone_6_ego_planner_node/optimal_list_array /drone_6_odom_visualization/path /drone_6_odom_visualization/robot /drone_6_odom_visualization/robot_array /drone_6_pcl_render_node/depth/mouse_click /drone_7_ego_planner_node/optimal_list /drone_7_ego_planner_node/optimal_list_array /drone_7_odom_visualization/path /drone_7_odom_visualization/robot /drone_7_odom_visualization/robot_array /drone_8_ego_planner_node/grid_map/occupancy_inflate /drone_8_ego_planner_node/optimal_list /drone_8_ego_planner_node/optimal_list_array /drone_8_odom_visualization/path /drone_8_odom_visualization/robot /drone_8_odom_visualization/robot_array /drone_9_ego_planner_node/grid_map/occupancy_inflate /drone_9_ego_planner_node/optimal_list /drone_9_ego_planner_node/optimal_list_array /drone_9_odom_visualization/path /drone_9_odom_visualization/robot /drone_9_odom_visualization/robot_array /gazebo/link_states /gazebo/model_states /gazebo/parameter_descriptions /gazebo/parameter_updates /gazebo/performance_metrics /gazebo/set_link_state /gazebo/set_model_state /initialpose /map_generator/global_cloud /map_generator/local_cloud /mavlink/from /mavlink/gcs_ip /mavlink/to /mavros/actuator_control /mavros/adsb/send /mavros/adsb/vehicle /mavros/altitude /mavros/battery /mavros/cam_imu_sync/cam_imu_stamp /mavros/camera/image_captured /mavros/cellular_status/status /mavros/companion_process/status /mavros/debug_value/debug /mavros/debug_value/debug_float_array /mavros/debug_value/debug_vector /mavros/debug_value/named_value_float /mavros/debug_value/named_value_int /mavros/debug_value/send /mavros/esc_info /mavros/esc_status /mavros/esc_telemetry /mavros/estimator_status /mavros/extended_state /mavros/fake_gps/mocap/tf /mavros/geofence/waypoints /mavros/global_position/compass_hdg /mavros/global_position/global /mavros/global_position/gp_lp_offset /mavros/global_position/gp_origin /mavros/global_position/local /mavros/global_position/raw/fix /mavros/global_position/raw/gps_vel /mavros/global_position/raw/satellites /mavros/global_position/rel_alt /mavros/global_position/set_gp_origin /mavros/gps_input/gps_input /mavros/gps_rtk/rtk_baseline /mavros/gps_rtk/send_rtcm /mavros/gpsstatus/gps1/raw /mavros/gpsstatus/gps1/rtk /mavros/gpsstatus/gps2/raw /mavros/gpsstatus/gps2/rtk /mavros/hil/actuator_controls /mavros/hil/controls /mavros/hil/gps /mavros/hil/imu_ned /mavros/hil/optical_flow /mavros/hil/rc_inputs /mavros/hil/state /mavros/home_position/home /mavros/home_position/set /mavros/imu/data /mavros/imu/data_raw /mavros/imu/diff_pressure /mavros/imu/mag /mavros/imu/static_pressure /mavros/imu/temperature_baro /mavros/imu/temperature_imu /mavros/landing_target/lt_marker /mavros/landing_target/pose /mavros/landing_target/pose_in /mavros/local_position/accel /mavros/local_position/odom /mavros/local_position/pose /mavros/local_position/pose_cov /mavros/local_position/velocity_body /mavros/local_position/velocity_body_cov /mavros/local_position/velocity_local /mavros/log_transfer/raw/log_data /mavros/log_transfer/raw/log_entry /mavros/mag_calibration/report /mavros/mag_calibration/status /mavros/manual_control/control /mavros/manual_control/send /mavros/mission/reached /mavros/mission/waypoints /mavros/mocap/pose /mavros/mount_control/command /mavros/mount_control/orientation /mavros/mount_control/status /mavros/nav_controller_output /mavros/obstacle/send /mavros/odometry/in /mavros/odometry/out /mavros/onboard_computer/status /mavros/param/param_value /mavros/play_tune /mavros/px4flow/ground_distance /mavros/px4flow/raw/optical_flow_rad /mavros/px4flow/raw/send /mavros/px4flow/temperature /mavros/radio_status /mavros/rallypoint/waypoints /mavros/rc/in /mavros/rc/out /mavros/rc/override /mavros/setpoint_accel/accel /mavros/setpoint_attitude/cmd_vel /mavros/setpoint_attitude/thrust /mavros/setpoint_position/global /mavros/setpoint_position/global_to_local /mavros/setpoint_position/local /mavros/setpoint_raw/attitude /mavros/setpoint_raw/global /mavros/setpoint_raw/local /mavros/setpoint_raw/target_attitude /mavros/setpoint_raw/target_global /mavros/setpoint_raw/target_local /mavros/setpoint_trajectory/desired /mavros/setpoint_trajectory/local /mavros/setpoint_velocity/cmd_vel /mavros/setpoint_velocity/cmd_vel_unstamped /mavros/state /mavros/statustext/recv /mavros/statustext/send /mavros/sys_status /mavros/target_actuator_control /mavros/terrain/report /mavros/time_reference /mavros/timesync_status /mavros/trajectory/desired /mavros/trajectory/generated /mavros/trajectory/path /mavros/tunnel/in /mavros/tunnel/out /mavros/vfr_hud /mavros/vision_pose/pose /mavros/vision_pose/pose_cov /mavros/vision_speed/speed_twist_cov /mavros/wind_estimation /move_base_simple/goal /pcl_render_node/local_map /random_forest/odometry /rosout /rosout_agg /scan /stereo/left/camera_info /stereo/left/image_raw /stereo/left/image_raw/compressed /stereo/left/image_raw/compressed/parameter_descriptions /stereo/left/image_raw/compressed/parameter_updates /stereo/left/image_raw/compressedDepth /stereo/left/image_raw/compressedDepth/parameter_descriptions /stereo/left/image_raw/compressedDepth/parameter_updates /stereo/left/image_raw/theora /stereo/left/image_raw/theora/parameter_descriptions /stereo/left/image_raw/theora/parameter_updates /stereo/left/parameter_descriptions /stereo/left/parameter_updates /stereo/right/camera_info /stereo/right/image_raw /stereo/right/image_raw/compressed /stereo/right/image_raw/compressed/parameter_descriptions /stereo/right/image_raw/compressed/parameter_updates /stereo/right/image_raw/compressedDepth /stereo/right/image_raw/compressedDepth/parameter_descriptions /stereo/right/image_raw/compressedDepth/parameter_updates /stereo/right/image_raw/theora /stereo/right/image_raw/theora/parameter_descriptions /stereo/right/image_raw/theora/parameter_updates /stereo/right/parameter_descriptions /stereo/right/parameter_updates /tf /tf_static /vins_estimator/extrinsic 对比一下上个问题多出了哪些话题并详细解释一下这些话题
最新发布
08-30
lixing@lixing:~/PX4-Autopilot$ make px4_sitl gazebo [0/4] Performing build step for 'sitl_gazebo-classic' [11/62] Building CXX object CMakeFiles...ugin.dir/src/gazebo_aruco_plugin.cpp.o FAILED: CMakeFiles/gazebo_aruco_plugin.dir/src/gazebo_aruco_plugin.cpp.o /usr/bin/ccache /usr/bin/c++ -DBOOST_ALL_NO_LIB -DBOOST_ATOMIC_DYN_LINK -DBOOST_DATE_TIME_DYN_LINK -DBOOST_FILESYSTEM_DYN_LINK -DBOOST_IOSTREAMS_DYN_LINK -DBOOST_PROGRAM_OPTIONS_DYN_LINK -DBOOST_REGEX_DYN_LINK -DBOOST_SYSTEM_DYN_LINK -DBOOST_TEST_DYN_LINK -DBOOST_THREAD_DYN_LINK -DLIBBULLET_VERSION=2.88 -DLIBBULLET_VERSION_GT_282 -Dgazebo_aruco_plugin_EXPORTS -I/home/lixing/PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/include -I. -I/usr/local/include/eigen3/eigen3 -I/usr/include/gazebo-11/gazebo/msgs -I/home/lixing/PX4-Autopilot/build/px4_sitl_default/mavlink -I/home/lixing/PX4-Autopilot/build/px4_sitl_default/mavlink/mavlink/v2.0 -I/home/lixing/PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/external/OpticalFlow/include -I/usr/include/gstreamer-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem /usr/include/gazebo-11 -isystem /usr/include/bullet -isystem /usr/include/simbody -isystem /usr/include/sdformat-9.10 -isystem /usr/include/ignition/math6 -isystem /usr/include/OGRE -isystem /usr/include/OGRE/Terrain -isystem /usr/include/OGRE/Paging -isystem /usr/include/ignition/transport8 -isystem /usr/include/ignition/msgs5 -isystem /usr/include/ignition/common3 -isystem /usr/include/ignition/fuel_tools4 -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -isystem /usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -isystem /usr/local/include/eigen3 -isystem /usr/local/opencv3.4/include/opencv4 -isystem /usr/include/sdformat-9.10/sdf/.. -isystem /usr/include/ignition/cmake2 -isystem /usr/include/uuid -O2 -g -DNDEBUG -fPIC -Wno-deprecated-declarations -Wno-address-of-packed-member -I/usr/include/uuid -std=gnu++17 -MD -MT CMakeFiles/gazebo_aruco_plugin.dir/src/gazebo_aruco_plugin.cpp.o -MF CMakeFiles/gazebo_aruco_plugin.dir/src/gazebo_aruco_plugin.cpp.o.d -o CMakeFiles/gazebo_aruco_plugin.dir/src/gazebo_aruco_plugin.cpp.o -c /home/lixing/PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/src/gazebo_aruco_plugin.cpp In file included from /home/lixing/PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/src/gazebo_aruco_plugin.cpp:31: /home/lixing/PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/include/gazebo_aruco_plugin.h:42:10: fatal error: opencv2/aruco.hpp: 没有那个文件或目录 42 | #include <opencv2/aruco.hpp> | ^~~~~~~~~~~~~~~~~~~ compilation terminated. [22/62] Building CXX object CMakeFiles...src/gazebo_camera_manager_plugin.cpp.o ninja: build stopped: subcommand failed. FAILED: external/Stamp/sitl_gazebo-classic/sitl_gazebo-classic-build cd /home/lixing/PX4-Autopilot/build/px4_sitl_default/build_gazebo-classic && /usr/bin/cmake --build /home/lixing/PX4-Autopilot/build/px4_sitl_default/build_gazebo-classic -- -j 12 ninja: build stopped: subcommand failed. make: *** [Makefile:227:px4_sitl] 错误 1
07-23
<think>我们遇到了编译错误,具体是在编译gazebo_aruco_plugin时,找不到opencv2/aruco.hpp头文件。 这个错误表明系统缺少必要的OpenCV库,特别是包含ArUco模块的部分。 解决方案: 1. 确认是否安装了OpenCV,并且版本是否包含ArUco模块。 2. 安装或更新OpenCV到包含ArUco模块的版本(OpenCV 3.x及以上,但需要确保编译时包含了opencv_contrib模块中的aruco)。 步骤: 由于PX4的Gazebo仿真需要OpenCV的ArUco库,我们可以通过安装完整的OpenCV(包括contrib模块)来解决。 对于Ubuntu系统,可以尝试以下命令安装OpenCV(包含contrib): sudo apt-get install libopencv-dev 但是,请注意,Ubuntu官方仓库中的OpenCV可能不包含contrib模块,或者版本较旧。因此,我们可能需要从源码编译安装OpenCV。 不过,先尝试安装官方提供的包,因为PX4的Gazebo插件可能对版本有要求。 如果已经安装了OpenCV但缺少aruco,可以尝试安装额外的包: sudo apt-get install libopencv-contrib-dev 如果上述方法无效,则需要从源码编译安装OpenCV(包括contrib模块)。 另外,确保在编译PX4之前已经正确设置了环境变量,以便编译器能够找到OpenCV。 如果问题仍然存在,可以尝试清理构建并重新编译: make distclean make px4_sitl gazebo 但是,根据错误信息,我们首先需要解决OpenCV中缺少aruco.hpp的问题。 因此,第一步是安装包含aruco模块的OpenCV。 如果使用apt安装,可以尝试: sudo apt-get install libopencv-dev libopencv-contrib-dev 安装后,再次尝试编译。 如果问题依旧,可能是因为Gazebo插件在查找OpenCV时没有找到正确的路径。这时需要检查OpenCV的安装路径,并确保头文件在编译器的搜索路径中。 注意:PX4的sitl_gazebo子模块在编译时会尝试查找OpenCV,如果找不到,则可能报错。我们可以检查sitl_gazebo的CMakeLists.txt中关于OpenCV的配置。 但是,通常安装libopencv-dev和libopencv-contrib-dev可以解决。 如果还是不行,可能需要手动指定OpenCV路径。但这种情况较少,除非系统中有多个OpenCV版本。 总结步骤: 1. 安装OpenCV和contrib:sudo apt-get install libopencv-dev libopencv-contrib-dev 2. 如果安装成功,再次运行编译命令:make px4_sitl gazebo 3. 如果仍然出现同样错误,则可能需要从源码编译OpenCV(包含contrib模块)。 从源码编译OpenCV的步骤(简要): - 下载OpenCV和opencv_contrib源码(选择相同版本,例如4.5.0)。 - 创建构建目录,进入并执行cmake命令,指定contrib模块路径: cmake -DOPENCV_EXTRA_MODULES_PATH=<opencv_contrib>/modules <opencv_source_directory> - 然后make和sudo make install。 安装完成后,再尝试编译PX4。 注意:从源码编译OpenCV可能会覆盖系统原有的OpenCV,且耗时较长,请谨慎操作。 此外,还可以检查PX4的文档,确认推荐的OpenCV版本和安装方式。 根据错误信息,我们也可以尝试更新子模块(因为sitl_gazebo是子模块): git submodule update --init --recursive 但通常这个错误是由于本地OpenCV环境问题引起的。 最后,如果问题仍然存在,可以尝试在PX4的构建目录中删除与sitl_gazebo相关的部分,然后重新构建。 但是,我们先尝试安装libopencv-contrib-dev。 现在,根据以上分析,给出回答。</think>### 问题分析与解决方案 您遇到的编译错误是由于缺少 OpenCV 的 ArUco 模块导致的。关键错误信息: ```bash fatal error: opencv2/aruco.hpp: 没有那个文件或目录 ``` #### 原因分析: 1. **OpenCV 模块缺失**:PX4 的 Gazebo 仿真需要 `opencv_contrib` 中的 ArUco 模块,但标准 OpenCV 安装不包含此扩展 2. **依赖不完整**:编译 Gazebo 插件时未检测到完整的 OpenCV 开发包 3. **版本冲突**:系统可能安装了多个 OpenCV 版本导致路径混乱 #### 解决方案: 1. **安装完整 OpenCV 开发包**(推荐): ```bash # 安装 OpenCV 核心库 + 扩展模块 sudo apt-get update sudo apt-get install libopencv-dev libopencv-contrib-dev ``` 2. **验证 OpenCV 安装**: ```bash # 检查 ArUco 头文件是否存在 ls /usr/include/opencv4/opencv2/aruco.hpp # 检查库文件 pkg-config --modversion opencv4 ``` 3. **清理并重新编译**: ```bash cd ~/PX4-Autopilot make distclean # 彻底清理构建缓存 make px4_sitl gazebo # 重新编译 ``` 4. **手动指定 OpenCV 路径**(如果安装位置特殊): ```bash # 在编译命令前添加路径变量 export OpenCV_DIR=/usr/local/opencv4/share/opencv4 make px4_sitl gazebo ``` 5. **源码编译 OpenCV**(若 apt 安装无效): ```bash # 安装编译依赖 sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config git clone https://github.com/opencv/opencv_contrib.git # 配置时添加扩展模块路径 cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules .. ``` ### 补充说明 - 成功安装后,`gazebo_aruco_plugin.cpp` 应能正常找到 `<opencv2/aruco.hpp>` - 如果使用自定义 OpenCV 版本,需确保 Gazebo 插件配置指向正确路径 - 建议保持 PX4 子模块更新:`git submodule update --init --recursive`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值