前言:这个程序可以说看的非常仔细和透彻,里面所涉及的算法都弄明白了。也不枉花了二周时间呀0.0


#include <drivers/drv_hrt.h>  //高精度的定时器。 在控制过程中多数环节都是使用经典的PID控制算法为
//了获取较为实时的响应最重要的时间变量,这就涉及如何获取高精度的时间问题。pixhawk中就有高精度的RTC(实时时钟),这个
//头文件就做了介绍#include <lib/geo/geo.h>
#include <mathlib/math/filter/LowPassFilter2p.hpp>  /**滤波器**/
#include <mathlib/mathlib.h>
#include <px4_config.h>
#include <px4_posix.h>
#include <px4_tasks.h>
#include <systemlib/err.h>         /**包含一些错误警告的功能**/
#include <systemlib/param/param.h>
#include <systemlib/perf_counter.h>      /**性能评估**/
#include <uORB/topics/att_pos_mocap.h>
#include <uORB/topics/parameter_update.h>
#include <uORB/topics/sensor_combined.h>
#include <uORB/topics/vehicle_attitude.h>/**我们在这个程序中解算的姿态就要发布进这个**/
#include <uORB/topics/vehicle_global_position.h>   /**去看看有什么,后面讲位置估计时要用到**/extern "C" __EXPORT int attitude_estimator_q_main(int argc, char *argv[]);using math::Vector;         /*****使用向量****/
using math::Matrix;         /*****使用矩阵****/
using math::Quaternion;     /*****使用四元数****/class AttitudeEstimatorQ;namespace attitude_estimator_q
{
AttitudeEstimatorQ *instance;
} // namespace attitude_estimator_q attitude_estimator_qclass AttitudeEstimatorQ
{
public:/*** Constructor*/AttitudeEstimatorQ();/*** Destructor, also kills task.*/~AttitudeEstimatorQ();/*** Start task.** @return      OK on success.*/int  start();                           //创建一个新的任务 static void task_main_trampoline(int argc, char *argv[]);void        task_main();private:const float _dt_min = 0.00001f;         /***dt是指更新数据的时间间隔,也就是离散pid公式中的T***/const float _dt_max = 0.02f;bool        _task_should_exit = false;  /**< if true, task should exit */int     _control_task = -1;             /**< task handle for task */int     _params_sub = -1;               /****与parameter_update有关****/int     _sensors_sub = -1;              /****这个变量是订阅传感器数据时用的句柄****/int     _global_pos_sub = -1;           /****这个变量是订阅地理位置数据时用的句柄****/int     _vision_sub = -1;               /****这个变量是视觉信息时用的句柄****/int     _mocap_sub = -1;                /****mocap=motion capture,动作捕捉****/orb_advert_t    _att_pub = nullptr;     /***nullptr是c++11标准引入的更严谨的空指针,这里的att_pub是用于发布姿态信息的handle***/struct {/**前面带w都是权重的意思**/param_t w_acc;              /**这里的acc为加速度计的权重,用于后面互补滤波**/param_t w_mag;              /**mag为磁力计**/param_t w_ext_hdg;param_t w_gyro_bias;        /***陀螺仪偏差***/param_t mag_decl;           /**磁方位角**/param_t mag_decl_auto;      /**利用gps自动获得磁方位角**/param_t acc_comp;           /**加速度的补偿**/param_t bias_max;          /**最大偏差**/param_t ext_hdg_mode;  /***外部的航向使用模式,=1表示来自于视觉,=2表示来自mocap***/} _params_handles{};        /**< handles for interesting parameters   这个结构体里面全是一些系统参数**//**在px4的程序中获取系统参数的方法是用param_get和param_find去获取,而不是通过uorb**//**下面这些初始化的数据是用来存放从系统参数get过来的数据***/float       _w_accel = 0.0f;float       _w_mag = 0.0f;float       _w_ext_hdg = 0.0f;float       _w_gyro_bias = 0.0f;float       _mag_decl = 0.0f;bool        _mag_decl_auto = false;bool        _acc_comp = false;float       _bias_max = 0.0f;int32_t     _ext_hdg_mode = 0;Vector<3>   _gyro;     /**通过传感器获取的三轴的角速度**/Vector<3>    _accel;  /***通过加速度计获取的三轴的加速度***/Vector<3>   _mag;    /***通过磁力计获取的磁航向***/Vector<3>   _vision_hdg; /**通过视觉获取的handing**/Vector<3>   _mocap_hdg;  /**通过mocap获取的handing**/Quaternion  _q;Vector<3>   _rates;     /**与上面_gyro不同的是这个用于存放修正后的绕三轴角速度**/Vector<3>   _gyro_bias;Vector<3>   _vel_prev;  /**前一刻的速度**/hrt_abstime _vel_prev_t = 0;   /**uint64_t的typedef,abstime意思为绝对时间,这里为记录前一时刻速度时的绝对时间**//**用于后面根据速度差除以时间差求加速度**/Vector<3>   _pos_acc;  //运动加速度,注意:这个加速度不包括垂直方向的bool        _inited = false; //初始化标识bool        _data_good = false;//数据可用bool        _ext_hdg_good = false;//外部航向可用void update_parameters(bool force);int update_subscriptions();  /**只有声明,无定义???字面的意思是更新订阅信息??**/bool init();//初始化函数,初始化旋转矩阵和四元数bool update(float dt);//dt是更新周期,这个函数是整个程序的核心//Update magnetic declination (in rads) immediately changing yaw rotation//偏航角改变立刻更新磁方位角void update_mag_declination(float new_declination);
};AttitudeEstimatorQ::AttitudeEstimatorQ()
{//先用find匹配系统参数,然后用get拷贝系统的参数,之所以这样不会直接影响到系统参数,但是又可以正常使用系统参数。_params_handles.w_acc       = param_find("ATT_W_ACC");_params_handles.w_mag       = param_find("ATT_W_MAG");_params_handles.w_ext_hdg   = param_find("ATT_W_EXT_HDG");_params_handles.w_gyro_bias = param_find("ATT_W_GYRO_BIAS");_params_handles.mag_decl    = param_find("ATT_MAG_DECL");_params_handles.mag_decl_auto   = param_find("ATT_MAG_DECL_A");_params_handles.acc_comp    = param_find("ATT_ACC_COMP");_params_handles.bias_max    = param_find("ATT_BIAS_MAX");_params_handles.ext_hdg_mode    = param_find("ATT_EXT_HDG_M");_vel_prev.zero();/**清零**/_pos_acc.zero();_gyro.zero();_accel.zero();_mag.zero();_vision_hdg.zero();/**通过视觉得到的航向清零**/_mocap_hdg.zero();/**通过mocap得到的航向清零**/_q.zero();_rates.zero();_gyro_bias.zero();_vel_prev.zero();_pos_acc.zero();
}/*** Destructor, also kills task.* 析构函数,也用于结束任务*/
AttitudeEstimatorQ::~AttitudeEstimatorQ()
{if (_control_task != -1) {/* task wakes up every 100ms or so at the longest */_task_should_exit = true;/* wait for a second for the task to quit at our request */unsigned i = 0;do {/* wait 20ms */usleep(20000);/* if we have given up, kill it */if (++i > 50) {px4_task_delete(_control_task);break;}} while (_control_task != -1);}attitude_estimator_q::instance = nullptr;
}int AttitudeEstimatorQ::start()
{ASSERT(_control_task == -1);    //AEESRT是assert函数的define了,作用是参数值为0时终止程序/* start the task *//*这里的px4_task_spawn_cmd函数的作用是创建一个新的任务,属于nuttx系统中的**/_control_task = px4_task_spawn_cmd("attitude_estimator_q",SCHED_DEFAULT,SCHED_PRIORITY_ESTIMATOR,2000,(px4_main_t)&AttitudeEstimatorQ::task_main_trampoline,nullptr);if (_control_task < 0){warn("task start failed");return -errno;}return OK;
}void AttitudeEstimatorQ::task_main_trampoline(int argc, char *argv[])  /**运行task_main**/
{attitude_estimator_q::instance->task_main();
}void AttitudeEstimatorQ::task_main()
{#ifdef __PX4_POSIX/**加速度计的表现性能。。第一个参数是counter的类型,第二个是counter的名字**/perf_counter_t _perf_accel(perf_alloc_once(PC_ELAPSED, "sim_accel_delay"));/**mpu的表现性能**/perf_counter_t _perf_mpu(perf_alloc_once(PC_ELAPSED, "sim_mpu_delay"));/**mag的表现性能**/perf_counter_t _perf_mag(perf_alloc_once(PC_ELAPSED, "sim_mag_delay"));
#endif_sensors_sub = orb_subscribe(ORB_ID(sensor_combined));/**订阅传感器信息**/_vision_sub = orb_subscribe(ORB_ID(vehicle_vision_attitude));/**订阅视觉信息**/_mocap_sub = orb_supdbscribe(ORB_ID(att_pos_mocap));/**订阅mocap信息**/_params_sub = orb_subscribe(ORB_ID(parameter_update));/**订阅parameter信息,用于之后的parameter_update的copy**/_global_pos_sub = orb_subscribe(ORB_ID(vehicle_global_position));/**订阅位置信息**//**上面是订阅,copy部分在下面这个函数中**/update_parameters(true);hrt_abstime last_time = 0;/************poll**************//******nuttx任务使能********/px4_pollfd_struct_t fds[1] = {};fds[0].fd = _sensors_sub;fds[0].events = POLLIN;while (!_task_should_exit){int ret = px4_poll(fds, 1, 1000);if (ret < 0) {// Poll error, sleep and try againusleep(10000);PX4_WARN("POLL ERROR");continue;} else if (ret == 0) {// Poll timeout, do nothingPX4_WARN("POLL TIMEOUT");continue;}update_parameters(false); //498行// Update sensorssensor_combined_s sensors;   /**新建的sensor结构体用于装复制的传感器信息**/if (orb_copy(ORB_ID(sensor_combined), _sensors_sub, &sensors) == PX4_OK) {// Feed validator with recent sensor dataif (sensors.timestamp > 0) {_gyro(0) = sensors.gyro_rad[0];_gyro(1) = sensors.gyro_rad[1];_gyro(2) = sensors.gyro_rad[2];}if (sensors.accelerometer_timestamp_relative != sensor_combined_s::RELATIVE_TIMESTAMP_INVALID) {_accel(0) = sensors.accelerometer_m_s2[0];_accel(1) = sensors.accelerometer_m_s2[1];_accel(2) = sensors.accelerometer_m_s2[2];if (_accel.length() < 0.01f) {PX4_ERR("WARNING: degenerate accel!");continue;}}if (sensors.magnetometer_timestamp_relative != sensor_combined_s::RELATIVE_TIMESTAMP_INVALID) {_mag(0) = sensors.magnetometer_ga[0];_mag(1) = sensors.magnetometer_ga[1];_mag(2) = sensors.magnetometer_ga[2];if (_mag.length() < 0.01f) {PX4_ERR("WARNING: degenerate mag!");continue;}}_data_good = true;}// Update vision and motion capture heading// 通过uORB模型获取vision和mocap的数据(视觉和mocap)bool vision_updated = false;orb_check(_vision_sub, &vision_updated);if (vision_updated) {vehicle_attitude_s vision;  /**新建vision结构体**/if (orb_copy(ORB_ID(vehicle_vision_attitude), _vision_sub, &vision) == PX4_OK) {math::Quaternion q(vision.q);//将基于视觉获得的四元数赋给新建的math::qmath::Matrix<3, 3> Rvis = q.to_dcm();  /**基于视觉得到的转换矩阵**/math::Vector<3> v(1.0f, 0.0f, 0.4f);    /**从他给定的v可知这里的v是一个指北的向量**//**至于为什么初始给的是0.4,还有疑惑**/// Rvis is Rwr (robot respect to world) while v is respect to world.// Hence Rvis must be transposed having (Rwr)' * Vw  v是在地系下的,而dcm是b—>e,所以要转置// Rrw * Vw = vn. This way we have consistency_vision_hdg = Rvis.transposed() * v;/**转置后与v乘,就反映了视觉上的指北的向量**/// vision external heading usage (ATT_EXT_HDG_M 1)if (_ext_hdg_mode == 1) {// Check for timeouts on data 检查数据超时_ext_hdg_good = vision.timestamp > 0 && (hrt_elapsed_time(&vision.timestamp) < 500000);}}}/**基于mocap获取handing同理**/bool mocap_updated = false;orb_check(_mocap_sub, &mocap_updated);if (mocap_updated) {att_pos_mocap_s mocap;if (orb_copy(ORB_ID(att_pos_mocap), _mocap_sub, &mocap) == PX4_OK) {math::Quaternion q(mocap.q);math::Matrix<3, 3> Rmoc = q.to_dcm();math::Vector<3> v(1.0f, 0.0f, 0.4f);// Rmoc is Rwr (robot respect to world) while v is respect to world.// Hence Rmoc must be transposed having (Rwr)' * Vw// Rrw * Vw = vn. This way we have consistency_mocap_hdg = Rmoc.transposed() * v;// Motion Capture external heading usage (ATT_EXT_HDG_M 2)if (_ext_hdg_mode == 2) {// Check for timeouts on data_ext_hdg_good = mocap.timestamp > 0 && (hrt_elapsed_time(&mocap.timestamp) < 500000);}}}//下面的是自动获取磁偏角bool gpos_updated = false;orb_check(_global_pos_sub, &gpos_updated);if (gpos_updated) {//如果位置已经更新 就取出位置数据vehicle_global_position_s gpos;if (orb_copy(ORB_ID(vehicle_global_position), _global_pos_sub, &gpos) == PX4_OK){//首先检测是否配置了自动磁方位角获取,即用下面的ifif (_mag_decl_auto && gpos.eph < 20.0f && hrt_elapsed_time(&gpos.timestamp) < 1000000) {/* set magnetic declination automatically *///自动获取磁方位角,如果配置了则用当前的经纬度(longitude and latitude)通过get_mag_declination(_gpos.lat,_gpos.lon)函数获取当前位置的磁偏角update_mag_declination(math::radians(get_mag_declination(gpos.lat, gpos.lon)));}//获取机体的速度,通过速度计算机体的加速度 。//先判断位置信息是否有效if (_acc_comp && gpos.timestamp != 0 && hrt_absolute_time() < gpos.timestamp + 20000 && gpos.eph < 5.0f && _inited){/* position data is actual */Vector<3> vel(gpos.vel_n, gpos.vel_e, gpos.vel_d); //北东地系/* velocity updated */if (_vel_prev_t != 0 && gpos.timestamp != _vel_prev_t) {float vel_dt = (gpos.timestamp - _vel_prev_t) / 1e6f;  //us/* calculate acceleration in body frame *///计算e系下的运动加速度,这里的pos_acc很重要,要用于后面加速度计的校正_pos_acc = _q.conjugate_inversed((vel - _vel_prev) / vel_dt);}_vel_prev_t = gpos.timestamp;  //为迭代做准备_vel_prev = vel;}else {/**否则位置信息过时,将加速度信息清零**//* position data is outdated, reset acceleration */_pos_acc.zero();_vel_prev.zero();_vel_prev_t = 0;}}}/* time from previous iteration */hrt_abstime now = hrt_absolute_time();//下面的constrain函数用于限定作用,限定规则:return (val < min_val) ? min_val : ((val > max_val) ? max_val : val);const float dt = math::constrain((now  - last_time) / 1e6f, _dt_min, _dt_max);last_time = now;if (update(dt)) {vehicle_attitude_s att = {.timestamp = sensors.timestamp,.rollspeed = _rates(0),.pitchspeed = _rates(1),.yawspeed = _rates(2),.q = {_q(0), _q(1), _q(2), _q(3)},.delta_q_reset = {},.quat_reset_counter = 0,};/* the instance count is not used here *///最后发布给了vehicle_attitude,这也对应了最开始我们说的我们不能直接把陀螺仪的数据当成姿态信息,而应该//经过我们处理后才能使用。即vehicle_attitude的信息流为:订阅的是sensor combined,发布的是vehicle attitudeint att_inst;orb_publish_auto(ORB_ID(vehicle_attitude), &_att_pub, &att, &att_inst, ORB_PRIO_HIGH);}}#ifdef __PX4_POSIXperf_end(_perf_accel);perf_end(_perf_mpu);perf_end(_perf_mag);
#endiforb_unsubscribe(_params_sub);orb_unsubscribe(_sensors_sub);orb_unsubscribe(_global_pos_sub);orb_unsubscribe(_vision_sub);orb_unsubscribe(_mocap_sub);
}void AttitudeEstimatorQ::update_parameters(bool force)
{bool updated = force;if (!updated) //如果更新了{orb_check(_params_sub, &updated); /***检查一个主题在发布者最后更新后,有没parameter_update有人调用过orb_copy来接收如果主题在被公告前就有人订阅,那么这个API将返回“not-updated”直到主题被公告。***/}if (updated)  //如果没更新{parameter_update_s param_update;  /**建立建构体param_update,里面有更新的时间、是否更新、填充信息**/orb_copy(ORB_ID(parameter_update), _params_sub, &param_update);/**根据头文件可知parameter_update是自带的主题*//***疑问:上面的copy之前为什么没有订阅,是不是后面参数更新后还要发布出去?其实不是,订阅发生在前面的task_main函数中***/param_get(_params_handles.w_acc, &_w_accel);/**把获得的参数值赋值给后面那个参数,前面那些参数的值都在构造函数中定义了**/param_get(_params_handles.w_mag, &_w_mag);param_get(_params_handles.w_ext_hdg, &_w_ext_hdg);param_get(_params_handles.w_gyro_bias, &_w_gyro_bias);float mag_decl_deg = 0.0f;param_get(_params_handles.mag_decl, &mag_decl_deg);update_mag_declination(math::radians(mag_decl_deg));/**radians函数为取弧度,外面的函数为消除偏差的积累***/int32_t mag_decl_auto_int;param_get(_params_handles.mag_decl_auto, &mag_decl_auto_int);_mag_decl_auto = (mag_decl_auto_int != 0);int32_t acc_comp_int;param_get(_params_handles.acc_comp, &acc_comp_int);_acc_comp = (acc_comp_int != 0);param_get(_params_handles.bias_max, &_bias_max);param_get(_params_handles.ext_hdg_mode, &_ext_hdg_mode);}
}/***********init()函数作用:由加速度计和磁力计初始化旋转矩阵和四元数**************/bool AttitudeEstimatorQ::init()
{// Rotation matrix can be easily constructed from acceleration and mag field vectors// 'k' is Earth Z axis (Down) unit vector in body frame//,所以取反向Vector<3> k = -_accel;            //accel已经在task_main中订阅//k为加速度传感器测量到加速度方向向量,由于第一次测量数据时无人机一般为平稳状态无运动状态,//所以可以直接将测到的加速度视为重力加速度g,以此作为dcm旋转矩阵的第三行kk.normalize();                    //向量归一化,也就是向量除以他的长度// 'i' is Earth X axis (North) unit vector in body frame, orthogonal with 'k'// i是体坐标系下指向正北的单位向量,与k正交Vector<3> i = (_mag - k * (_mag * k));//施密特正交化,强制使i与k垂直;因向量k已归一化,故分母等于1;//这里的_mag是指北的,所以下面求得的R是默认飞机机头也是指向北i.normalize();                    //向量归一化,也就是向量除以他的长度// 'j' is Earth Y axis (East) unit vector in body frame, orthogonal with 'k' and 'i'//j是e坐标系下指向正东的单位向量在b系下的向量,与k、i正交Vector<3> j = k % i;// 填充旋转矩阵Matrix<3, 3> R;    //新建一个3*3的矩阵RR.set_row(0, i);   //set_row函数的第一个参数为第几行,将i向量填入矩阵第一行R.set_row(1, j);   //将j向量填入矩阵第二行R.set_row(2, k);   //将k向量填入矩阵第三行,注意:从这里可知该旋转矩阵为b系到n系// 将R矩阵转换为四元数_q.from_dcm(R);// Compensate for magnetic declination  补偿飞机的磁方位角,因为前面求得q是默认飞机指向北,但起飞时飞机不一定指向北Quaternion decl_rotation;decl_rotation.from_yaw(_mag_decl);/**将旋转矩阵仅仅通过yaw偏航的四元数表示**/_q = decl_rotation * _q;_q.normalize();  /**归一化**/  /**此时的q才是真正的初始的q**/if (PX4_ISFINITE(_q(0)) && PX4_ISFINITE(_q(1)) &&      /**判断是否发散**/PX4_ISFINITE(_q(2)) && PX4_ISFINITE(_q(3)) &&_q.length() > 0.95f && _q.length() < 1.05f){_inited = true;      /**初始化完成**/}else{_inited = false;     /**初始化失败**/}return _inited;
}bool AttitudeEstimatorQ::update(float dt)
{if (!_inited){if (!_data_good)   /**在前面task_main函数中如果传感器数据订阅正常,data_good就为true**/{return false;}return init();  /**没有初始化(前提:传感器数据订阅正常)就初始化**///并且注意:init在一次飞行trampoline中只执行一次,因为以后的四元数和转换矩阵由输出的角速度经过龙格库塔法求,而飞机在初始飞行时就需要通过init求转换矩阵}/**前面的init等都完成就继续往下执行**/Quaternion q_last = _q;  /**注意:此时四元数_q已经有内容了,此处的q_last的作用为给q弄一个备份,可从最后一个if看出**/// Angular rate of correction  修正角速率,下面的是重点Vector<3> corr;float spinRate = _gyro.length();  /**定义一个变量:旋转速率,length函数为平方和开方**///首先判断是使用什么mode做修正的,比如vision、mocap、acc和mag,这里我们着重分析用acc和mag做修正,另外两个同理if (_ext_hdg_mode > 0 && _ext_hdg_good){if (_ext_hdg_mode == 1){// Vision heading correction  对基于视觉的航向模式进行修正// Project heading to global frame and extract XY componentVector<3> vision_hdg_earth = _q.conjugate(_vision_hdg);/**将b系转为e系**/float vision_hdg_err = _wrap_pi(atan2f(vision_hdg_earth(1), vision_hdg_earth(0)));// Project correction to body framecorr += _q.conjugate_inversed(Vector<3>(0.0f, 0.0f, -vision_hdg_err)) * _w_ext_hdg;}if (_ext_hdg_mode == 2) {// Mocap heading correction// Project heading to global frame and extract XY componentVector<3> mocap_hdg_earth = _q.conjugate(_mocap_hdg);float mocap_hdg_err = _wrap_pi(atan2f(mocap_hdg_earth(1), mocap_hdg_earth(0)));// Project correction to body framecorr += _q.conjugate_inversed(Vector<3>(0.0f, 0.0f, -mocap_hdg_err)) * _w_ext_hdg;}}if (_ext_hdg_mode == 0 || !_ext_hdg_good) {// Magnetometer correction// Project mag field vector to global frame and extract XY componentVector<3> mag_earth = _q.conjugate(_mag);    /**将b系转为e系**///只考虑Vector<3> mag_earth中的前两维的数据mag_earth(1)和mag_earth(0)(即x、y,忽略z轴上的偏移),通//过arctan(mag_earth(1),mag_earth(0))得到的角度和前面根据经纬度获取的磁方位角做差值得到误差角度mag_err//_wrap_pi函数是用于限定结果-pi到pi的函数,大于pi则与2pi做差取补,小于-pi则与2pi做和取补//注意1:这里在修正磁力计时用到的是有gps校准时的修正办法,即下面的减去自动获取的磁偏角。没有gps的校准方法见ppt//注意2:这里校正的方法是用磁力计计算的磁偏角与gps得出来的做差,然后转换到b系。float mag_err = _wrap_pi(atan2f(mag_earth(1), mag_earth(0)) - _mag_decl);//与自动获取的磁方位角做差float gainMult = 1.0f;const float fifty_dps = 0.873f;if (spinRate > fifty_dps) {gainMult = math::min(spinRate / fifty_dps, 10.0f);}// Project magnetometer correction to body frame//下面*Vector<3>(0.0f, 0.0f, -mag_err))是因为raw本质上应该由磁力计产生的水平磁向量与gps产生的水平磁向量叉乘得到,而叉乘得到的正好向下corr += _q.conjugate_inversed(Vector<3>(0.0f, 0.0f, -mag_err)) * _w_mag * gainMult;}_q.normalize();// Accelerometer correction// Project 'k' unit vector of earth frame to body frame// Vector<3> k = _q.conjuq.conjugate_inversed(Vector<3>(0.0f, 0.0f, 1.0f));// Optimized version with dropped zeros//下面的k是n系中重力的单位向量转换到b系中,即左乘旋转矩阵得到的Vector<3> k(2.0f * (_q(1) * _q(3) - _q(0) * _q(2)),2.0f * (_q(2) * _q(3) + _q(0) * _q(1)),(_q(0) * _q(0) - _q(1) * _q(1) - _q(2) * _q(2) + _q(3) * _q(3)));//总的受到合力的方向(_accel)减去机体加速度方向(_pos_acc)得到g的方向,即总加速度(加速度获取)减去机体运动加速度获取重力加速度//重力加速度的方向是导航坐标系下的z轴,加上运动加速度之后,总加速度的方向就不是与导航坐标系的天或地平行了,所以要消除这个误差,即“_accel-_pos_acc”//这里与k差乘得到的是与重力方向的夹角sinx,约等于x,即roll和pitchcorr += (k % (_accel - _pos_acc).normalized()) * _w_accel;// Gyro bias estimationif (spinRate < 0.175f) {_gyro_bias += corr * (_w_gyro_bias * dt);//对应积分控制//对_gyro_bias做约束处理。for (int i = 0; i < 3; i++) {_gyro_bias(i) = math::constrain(_gyro_bias(i), -_bias_max, _bias_max);}}_rates = _gyro + _gyro_bias;//角速度 = 陀螺仪的测量值 + 误差校准// pi控制器的体现,对应比例部分corr += _rates;//corr为update函数中定义的变量,所以每次进入update函数中时会刷新corr变量的数据// Apply correction to state//最后就是使用修正的数据更新四元数,并把_rates和_gyro_bias置零便于下次调用时使用。_q += _q.derivative(corr) * dt;//用龙格库塔法更新四元数// Normalize quaternion_q.normalize();if (!(PX4_ISFINITE(_q(0)) && PX4_ISFINITE(_q(1)) &&PX4_ISFINITE(_q(2)) && PX4_ISFINITE(_q(3)))) {// 如果数据不合适就恢复备份的q,即q_last_q = q_last;_rates.zero();_gyro_bias.zero();return false;}return true;
}  //更新完四元数后,我们跳到update函数被调用的地方,即444行,发现后面将更新后的姿态信息发布出去了,到此整个过程结束/**偏航角改变立刻更新磁方位角**/
void AttitudeEstimatorQ::update_mag_declination(float new_declination)
{// Apply initial declination or trivial rotations without changing estimation// 忽略微小旋转(比如机体的微小震动),继续沿用之前的磁方位角if (!_inited || fabsf(new_declination - _mag_decl) < 0.0001f){_mag_decl = new_declination;}else  //转动较大时,修正姿态(q)和更新磁方位角{// Immediately rotate current estimation to avoid gyro bias growthQuaternion decl_rotation;decl_rotation.from_yaw(new_declination - _mag_decl);//偏航角生成的四元数,生成方法是令另外2个角度为0,使用欧拉角转四元数公式_q = decl_rotation * _q;//此处两个四元数相乘表示角度相加,因为在数学上q1*q2表示q1q2这个合成动作,所以此处修正了四元数_mag_decl = new_declination;//使用新的磁偏角}
}//下面的总结起来:attitude_estimator_q { start }:实例化instance,运行instance->start();//attitude_estimator_q { stop }:delete instance,指针置空;//attitude_estimator_q { status}:instance->print(),打印是否在runningint attitude_estimator_q_main(int argc, char *argv[])
{if (argc < 2)  /**命令行总的参数个数<2,由后面可知有三个参数**/{warnx("usage: attitude_estimator_q {start|stop|status}");return 1;}if (!strcmp(argv[1], "start"))  /**用户输入的第一个参数是否为start,是的话即继续执行**/{if (attitude_estimator_q::instance != nullptr) /**不为空即代表已生成了内容,所以已经启动**/{warnx("already running");return 1;}attitude_estimator_q::instance = new AttitudeEstimatorQ;/**instanc为空就申请空间,申请完成后不再为空指针**/if (attitude_estimator_q::instance == nullptr) /**再一次判断是否为空**/{warnx("alloc failed");    /**是的话即分配空间失败**/return 1;}if (OK != attitude_estimator_q::instance->start())  /**到这一步说明已经申请成功,start函数返回ok代表系统已经新建了一个进程任务,这里代表没有启动**/{delete attitude_estimator_q::instance;  /**没有启动就释放空间,重新变为空指针**/attitude_estimator_q::instance = nullptr;warnx("start failed");return 1;}return 0;}if (!strcmp(argv[1], "stop")) {if (attitude_estimator_q::instance == nullptr){warnx("not running");return 1;}delete attitude_estimator_q::instance; /**能执行这一步说明instance不为空指针,任务已经执行,然后进行删除**/attitude_estimator_q::instance = nullptr; /**恢复原样**/return 0;}if (!strcmp(argv[1], "status")){if (attitude_estimator_q::instance)   /**这里代码补全应为if (attitude_estimator_q::instance != nullptr)**/{warnx("running");return 0;}else{warnx("not running");return 1;}}warnx("unrecognized command"); /**出去start、stop、status外其他的为unrecognized command**/return 1;
}
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 2019前端面试题记录(杂文)

    session和redis 目前session直接是js变量&#xff0c;放到nodejs的进程内存中,存在问题 问题一&#xff1a;进程内存有限&#xff0c;访问量过大&#xff0c;内存爆增怎么办&#xff1f;(有可能进程崩溃) 问题二&#xff1a;正式上线后运行的是多进程&#xff0c;进程之间内存无…...

    2024/4/21 12:53:24
  2. 编写unity游戏之古迹探险

    文章目录1.一个工程的基本结构&#xff1a;2.导入资源、Prefab预制体3.地形设计4.刚体和碰撞检测机制关于Add ->Collider&#xff1a;有很多种&#xff0c;其中获得两个物体能够发生碰撞的条件&#xff1a;碰撞信息取得&#xff1a;触发检测5.unity中的四种灯光6.创建动画&a…...

    2024/4/30 20:58:54
  3. xml地图生成网址

    http://www.xml-sitemaps.com/ 这是第三方。 通过代码生成xml地图,待研究本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/942771,如需转载请自行联系原作者...

    2024/4/20 16:12:18
  4. Sherlock之Instructions指令介绍(Sherlock Version: 7.2.5.1 64-bit)

    指令集总览 1、General 1)、Comment:: 注释指令。 2)、Image Window: 创建新的图像窗口。 True: 取像之后更新图像窗口显示&#xff1b;False: 有新图像时不更新图像窗口。取像成功返回true。 3)、Return: 流程指令”返回“。从子程序插入一个返回。 4)、Subrotine: 创建一…...

    2024/4/20 16:12:15
  5. 30天入坑React ---------------day06 State

    这篇文章是30天React系列的一部分 。 在本系列中&#xff0c;我们将从非常基础开始&#xff0c;逐步了解您需要了解的所有内容&#xff0c;以便开始使用React。如果您曾经想学习React&#xff0c;那么这里就是您的最佳选择&#xff01; 下载免费的PDF State 在Github上编辑此…...

    2024/4/30 5:41:15
  6. Flink概念图

    因为网上大部分图都很渣所以自己整理了几张原创图,划清清浊 Flink v1.7 支持scala2.12版本 状态中序列化类演变 TypeSerializerSnapshot替换TypeSerializerConfigSnapshot 删除legacy mode Savepoints可用于恢复 之前&#xff0c;当使用一次精确的接收器时&#xff0c;如果在…...

    2024/4/30 21:44:13
  7. js奇技淫巧

    1、typeof 判断属性 typeof 37 number; true typeof "bla" string; true instanceof 新方法 要提前定义 更准确 var oStringObject new String("hello world"); console.log(oStringObject instanceof String); // 输出 "true&qu…...

    2024/4/30 21:47:37
  8. 广州陈兵 双眼皮 技术

    ...

    2024/4/21 12:53:21
  9. Android png转xml

    本文将介绍如何把png图片转换成svg矢量图,然后再生成xml文件。 1.打开png图片 使用Inkscape这个软件 File->Open->你的png图片 选择默认配置2.转换 选中你的图片,path->Trace Bitmap (Ctrl+Shift+B)按照图中选择,Scans要选2,不然会有很多path出来。点击ok。然后保…...

    2024/4/21 12:53:20
  10. 项目功能介绍 非常有用

    简单介绍下你做过的项目 该项目是一个B2B2C的线上电子商务项目&#xff0c;主要分为面向用户的前台系统&#xff0c;面向商家的商家平台&#xff0c;面向运营的运营管理平台。系统的前端采用Angularjs和Bootstrap框架&#xff0c;后端采用SSM框架使用Maven管理&#xff0c;全后…...

    2024/4/30 19:59:08
  11. 【SSM项目】电商平台项目第19天——秒杀解决方案

    课程目标 目标1&#xff1a;能够说出秒杀实现思路 目标2&#xff1a;实现秒杀频道首页功能 目标3&#xff1a;实现秒杀商品详细页功能 目标4&#xff1a;实现秒杀下单功能 目标5&#xff1a;实现秒杀支付功能 1.秒杀业务分析 1.1需求分析 所谓“秒杀”&#xff0c;就是网络卖家…...

    2024/4/30 20:41:04
  12. 品优购电商系统开发----秒杀解决方案(19)

    课程目标 目标1&#xff1a;能够说出秒杀实现思路 目标2&#xff1a;实现秒杀频道首页功能 目标3&#xff1a;实现秒杀商品详细页功能 目标4&#xff1a;实现秒杀下单功能 目标5&#xff1a;实现秒杀支付功能 1、秒杀业务分析 1.1、需求分析 所谓“秒杀”&#xff0c;就…...

    2024/4/21 12:53:17
  13. 双眼皮久目技术

    ...

    2024/4/30 20:31:56
  14. 超声波双眼皮与全切

    ...

    2024/4/21 12:53:14
  15. 江门双眼皮神

    ...

    2024/4/30 21:00:01
  16. 江门双眼皮大神哥

    ...

    2024/4/30 20:52:01
  17. 做个双眼皮多少钱定相信南昌同济

    ...

    2024/4/21 12:53:11
  18. angular1页面下滑

    经过&#xff1a; 当前页面调用全局组件&#xff1a;例如拍照->调起后>退出拍照&#xff0c; 结果&#xff1a; 页面最底部&#xff0c;按键下滑。像超出隐藏那样&#xff0c;怎么也画不下去 fixed的定位弹层也下去了....

    2024/4/21 12:53:11
  19. 杭州市双眼皮医院哪家最好

    ...

    2024/4/21 12:53:09
  20. 双眼皮做了会下垂吗

    ...

    2024/4/21 12:53:08

最新文章

  1. Linux专栏01:Linux发展历史及背景介绍

    博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Linux专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Linux发展历史及背景介绍 编号&#xff1a;01 文章目录 Linux发展历…...

    2024/4/30 22:08:48
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 代码随想录算法训练营day32

    1005_K次取反后最大化的数组和&#xff08;看了题解&#xff09; 题目&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i…...

    2024/4/30 13:58:00
  4. STM32-GPIO

    &#x1f913;&#x1f913;&#x1f913; 122.1 2.22.3 344.14.24.34.44.54.64.74.8 56788.18.299.19.2 STM32 第一个外设 1 对我们来说 和IO口没区别 ST公司非叫GPIO 2 2.1 第二个是超频了 F1 72M 这翻转就36 2.2 有cmos 和ttl两种数据手册里给出整个芯片最低电流为150ma 单…...

    2024/4/30 3:15:27
  5. 微信小程序的页面交互2

    一、自定义属性 &#xff08;1&#xff09;定义&#xff1a; 微信小程序中的自定义属性实际上是由data-前缀加上一个自定义属性名组成。 &#xff08;2&#xff09;如何获取自定义属性的值&#xff1f; 用到target或currentTarget对象的dataset属性可以获取数据 &#xff…...

    2024/4/30 7:10:53
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57