飞控陀螺仪,磁力计,加速计,四元数姿态结算

2023-05-16

MPU6050主要包含陀螺仪和加速度计。陀螺仪主要测量角速度,即可以测出某一时间段物体转过的角度。加速度计测量的是物体的加速度,重力加速度即物体受重力作用的情况下具有的加速度,物体静止时,加速度计测出来的加速度等于重力加速度g,约等于9.8米每平方秒,重力加速度总是竖直向下,通过计算重力加速度在X,Y的分量,则可以计算出物体相对于水平面的倾斜角度。

我们先来看看如何用欧拉角描述旋转(坐标变换):

绕Z轴旋转即滚转角,绕Y轴旋转即偏航角,绕X旋转即俯仰角。

这里需要注意绕X,Y,Z轴方向旋转的先后顺序不一样,得出余弦矩阵的顺序(也就是公式)也不一样。并且在一组旋转里X,Y,Z不可交换(Euler旋转),所以有先后顺序之分(程序中)。旋转变换有12种表示方式,分别为:XYZ、XZY、XYX、XZX、YXZ、YZX、YXY、YZY、ZXY、ZYX、ZXZ、ZYZ。这里还有一点需要注意,那就是"Gimbal Lock"。图中(ZYX,以下均为此顺序)的绕Z旋转会导致YX轴变化,但是Y影响X不会影响Z,X不会影响ZY。因此,如果旋转Y±90°,那么Z轴方向不变,但是会改变X轴方向,导致YX轴同向。此时保持Y值不变,那么改变Z或者X的效果相同。

Gimbal Lock总结就是,其源自Euler旋转原理,此原理旋转变量不可交换,所以有先后之分,所以可以改变后两个轴而第一轴方向不变,所以产生轴共线,即Gimbal Lock。

上图中得出旋转后的欧拉角公式,但是无人机的姿态结算中不能用欧拉角公式计算,一方面是因为欧拉角微分方程中包含了大量的三角运算,这给实时结算带来了一定的困难。而且当俯仰角为90度时方程式会出现神奇的“Gimbal Lock”。所以欧拉角方法只适合水平姿态变化不大的情况,而不适用于飞行器的姿态确定。

下面对四元数姿态进行结算:

  1. 重力加速度归一化。即将加速度计的三维向量(ax,ay,az)转换为单位向量,因为是单位矢量到参考性的投影,所以要把加速度计数据单位化。归一化只是改变这三个向量的长度,方向不改变,也就是只改变了相同的倍数,只是为了与单位四元数对应。ax,ay,az是机体坐标参照系上,加速度测出来的重力向量。
  2. 四元数换成方向余弦中的第三行的三个元素。将当前姿态重力在三个轴的分量分离出来,把四元数换算成方向余弦中的第三行的三个元素(vx,vy,vz)。惯性测量器件测量的都是关于b系的值。vx,vy,vz是陀螺仪的值积分后的姿态来推算出的重力向量。
  3. 向量叉积得出姿态误差。将ax,ay,az和vx,vy,vz对应的进行向量叉积(向量外积、叉乘)。分别得出ex,ey,ez。这个叉积向量仍然是位于机体坐标系,并和积分误差成正比,正好矫正陀螺。
  4. 对误差进行积分。将ax,ay,az和vx,vy,vz的误差进行积分消除误差。
  5. 进行滤波。陀螺仪测的值不断的进行更新,相应的积分误差也不断的修正,最后将积分误差反馈给陀螺仪,修正陀螺仪的值。
  6. 四元数微分方程。通过一阶龙格库塔法更新四元数。
  7. 四元数归一化。对四元数的单位化,单位化的四元数可以表示一个完整的旋转,只有单位四元数才可以表示旋转,这就是四元数表示旋转的约束条件。
  8. 四元数转欧拉角。

程序如下:


 
 
  1. float Kp = 0.4f; // 比例增益
  2. float Ki = 0.001f; // 积分增益
  3. float exInt = 0.f; // 重力在X轴上的分量
  4. float eyInt = 0.0f;
  5. float ezInt = 0.0f;
  6. //四元数
  7. static float q0 = 1.0f;
  8. static float q1 = 0.0f;
  9. static float q2 = 0.0f;
  10. static float q3 = 0.0f;
  11. float Rot_matrix[ 3][ 3];
  12. Vector3f angle1;
  13. void IMU_Updata(Vector3f acc,Vector3f gyro,Attitude *state,float dt)
  14. {
  15. float norm;
  16. float ex,ey,ez;
  17. float halfT = dt/ 2.0f;
  18. //重力加速度在X,Y,Z方向的分量
  19. static float verxZ,veryZ,verzZ;
  20. angle1.x = 0.0f;
  21. angle1.y = 0.0f;
  22. float q0q0,q0q1,q0q2,q0q3,q1q1,q1q2,q1q3,q2q2,q2q3,q3q3;
  23. //1、获取原始值
  24. //角速度转弧速度
  25. gyro.x = gyro.x * DEG2RAD;
  26. gyro.y = gyro.y * DEG2RAD;
  27. gyro.z = gyro.z * DEG2RAD;
  28. //2、加速度计量化
  29. if((acc.x!= 0.0f)||(acc.y!= 0.0f)||(acc.z!= 0.0f))
  30. {
  31. norm = sqrtf3(acc.x , acc.y , acc.z);
  32. acc.x = acc.x /norm ;
  33. acc.y = acc.y /norm ;
  34. acc.z = acc.z /norm ;
  35. //3、叉乘
  36. ex = (acc.y * verzZ) - (veryZ * acc.z);
  37. ey = (acc.x * verzZ) - (verxZ * acc.z);
  38. ez = (acc.x * veryZ) - (verxZ * acc.y);
  39. //4、积分误差滤波
  40. gyro.x += ex * Kp + exInt;
  41. gyro.y += ey * Kp + eyInt;
  42. gyro.z += ez * Kp + ezInt;
  43. }
  44. float q0_last =q0;
  45. float q1_last =q1;
  46. float q2_last =q2;
  47. float q3_last =q3;
  48. //解四元微分方程
  49. q0 += (-q1_last*gyro.x - q2_last * gyro.y - q3_last *gyro.z)*halfT;
  50. q1 += ( q0_last*gyro.x + q3_last * gyro.y - q2_last *gyro.z)*halfT;
  51. q2 += (-q3_last*gyro.x + q0_last * gyro.y + q1_last *gyro.z)*halfT;
  52. q3 += ( q2_last*gyro.x - q1_last * gyro.y + q0_last *gyro.z)*halfT;
  53. norm = sqrtf4(q0,q1,q2,q3);
  54. q0 = q0/norm;
  55. q1 = q1/norm;
  56. q2 = q2/norm;
  57. q3 = q3/norm;
  58. q0q0 = q0 * q0;
  59. q0q1 = q0 * q1;
  60. q0q2 = q0 * q2;
  61. q0q3 = q0 * q3;
  62. q1q1 = q1 * q1;
  63. q1q2 = q1 * q2;
  64. q1q3 = q1 * q3;
  65. q2q2 = q2 * q2;
  66. q2q3 = q2 * q3;
  67. q3q3 = q3 * q3;
  68. verxZ = 2.0f * (q1q3 - q0q2);
  69. veryZ = 2.0f * (q2q3 + q0q1);
  70. verzZ = q0q0 - q1q1 - q2q2 + q3q3;
  71. Rot_matrix[ 0][ 0] = q0q0 + q1q1 - q2q2 - q3q3;
  72. Rot_matrix[ 0][ 1] = 2.0f * (q1q2 - q0q3);
  73. Rot_matrix[ 0][ 2] = 2.0f * (q1q3 + q0q2);
  74. Rot_matrix[ 1][ 0] = 2.0f * (q1q2 + q0q3);
  75. Rot_matrix[ 1][ 1] = q0q0 - q1q1 + q2q2 - q3q3;
  76. Rot_matrix[ 1][ 2] = 2.0f * (q2q3 - q0q1);
  77. Rot_matrix[ 2][ 0] = 2.0f * (q1q3 - q0q2);
  78. Rot_matrix[ 2][ 1] = 2.0f * (q2q3 + q0q1);
  79. Rot_matrix[ 2][ 2] = q0q0 - q1q1 - q2q2 + q3q3;
  80. //四元数转换为欧拉角输出
  81. state->pitch = asin(Rot_matrix[ 1][ 2]);
  82. state->roll = atan2(-Rot_matrix[ 0][ 2],Rot_matrix[ 2][ 2]);
  83. state->yaw = atan2(-Rot_matrix[ 1][ 0], Rot_matrix[ 1][ 1]);
  84. }

运算宏定义如下:


 
 
  1. #define MM2M 0.001f
  2. #define DEG2RAD 0.017453292519943295769236907684886f //角度转弧度
  3. #define RAD2DEG 57.295779513082320876798154814105f //弧度转角度
  4. #define sq(a) ((a) * (a)) //平方、
  5. #define sqrtf4(a,b,c,d) __sqrtf(sq(a) + sq(b) + sq(c) + sq(d))
  6. #define sqrtf3(a,b,c) __sqrtf(sq(a) + sq(b) + sq(c))
  7. #define sqrtf2(a,b) __sqrtf(sq(a) + sq(b))

在加速度计矫正的基础上+磁力计:
在三维空间中,根据重力加速度,加速度为我们提供一个水平位置的参考,但是无法获得方向的参考,这时就需要磁力计,它能给人们提供一个正北方向的绝对参考。

在上述姿态结算的基础上进行磁力计矫正:

  1. 把磁力计的数据进行归一化处理(进行量化)。
  2. 根据当前四元数姿态值估算各重力分量vx,vy,vz,再根据vx,vy,vz预估磁场的方向wx,wy,wz。
  3. 再根据wx,wy,wz对磁力计测出的值进行误差矫正。
  4. 把加速度计和磁力计修正后的陀螺仪数据整合到四元数中。
  5. 最后进行角度运算。

 
 
  1. float KpDef = 0.5f;
  2. float KiDef = 0.025f;
  3. float q0 = 1.0f,q1 = 0.0f,q2 = 0.0f,q3 = 0.0f;
  4. float integralFBx = 0.0f,integralFBy = 0.0f,integralFBz = 0.0f;
  5. static float q0q0, q0q1, q0q2, q0q3, q1q1, q1q2, q1q3, q2q2, q2q3, q3q3;
  6. static float Rot_matrix[ 3][ 3]; //方向余弦矩阵
  7. //使用加速度传感器测量重力向量,使用磁力计测量方向
  8. void AHRS_Uptate(Vector3f acc,Vector3f gyro,Vector3i mag,Attitude *state,float dt)
  9. {
  10. q0q0 = q0 * q0;
  11. q0q1 = q0 * q1;
  12. q0q2 = q0 * q2;
  13. q0q3 = q0 * q3;
  14. q1q1 = q1 * q1;
  15. q1q2 = q1 * q2;
  16. q1q3 = q1 * q3;
  17. q2q2 = q2 * q2;
  18. q2q3 = q2 * q3;
  19. q3q3 = q3 * q3;
  20. //大地坐标系(e) --> 机体坐标系(b)
  21. Rot_matrix[ 0][ 0] = q0q0 + q1q1 - q2q2 - q3q3;
  22. Rot_matrix[ 0][ 1] = 2.f * (q1q2 + q0q3);
  23. Rot_matrix[ 0][ 2] = 2.f * (q1q3 - q0q2);
  24. Rot_matrix[ 1][ 0] = 2.f * (q1q2 - q0q3);
  25. Rot_matrix[ 1][ 1] = q0q0 - q1q1 + q2q2 - q3q3;
  26. Rot_matrix[ 1][ 2] = 2.f * (q2q3 + q0q1);
  27. Rot_matrix[ 2][ 0] = 2.f * (q1q3 + q0q2);
  28. Rot_matrix[ 2][ 1] = 2.f * (q2q3 - q0q1);
  29. Rot_matrix[ 2][ 2] = q0q0 - q1q1 - q2q2 + q3q3;
  30. float ex = 0.0f, ey = 0.0f, ez = 0.0f;
  31. float norm;
  32. if((mag.x != 0) || (mag.y != 0) || (mag.z != 0))
  33. {
  34. //磁力计量化
  35. norm = sqrtf3(mag.x,mag.y,mag.z);
  36. mag.x /= norm;
  37. mag.y /= norm;
  38. mag.z /= norm;
  39. //地球磁场的参考方向
  40. float hx = Rot_matrix[ 0][ 0] * mag.x + Rot_matrix[ 1][ 0] * mag.y + Rot_matrix[ 2][ 0] * mag.z ; //计算出x轴的方向
  41. float hy = Rot_matrix[ 0][ 1] * mag.x + Rot_matrix[ 1][ 1] * mag.y + Rot_matrix[ 2][ 1] * mag.z ; //计算出Y轴的方向
  42. float by = sqrtf2(hx,hy); //预估磁场的方向
  43. float bz = Rot_matrix[ 0][ 2] * mag.x + Rot_matrix[ 1][ 2] * mag.y + Rot_matrix[ 2][ 2] * mag.z ; //计算出Z轴方向
  44. //估计磁场的方向
  45. float wx = Rot_matrix[ 0][ 1] * by + Rot_matrix[ 0][ 2] * bz;
  46. float wy = Rot_matrix[ 1][ 1] * by + Rot_matrix[ 1][ 2] * bz;
  47. float wz = Rot_matrix[ 2][ 1] * by + Rot_matrix[ 2][ 2] * bz;
  48. //误差是估计方向和场矢量测量方向的乘积
  49. ex = mag.y * wz - mag.z * wy;
  50. ey = mag.z * wx - mag.x * wz;
  51. ez = mag.x * wz - mag.z * wx;
  52. if((acc.x != 0)||(acc.y != 0)||(acc.z != 0))
  53. {
  54. //加速度值量化
  55. norm = sqrtf3(acc.x,acc.y,acc.z);
  56. acc.x /= norm;
  57. acc.y /= norm;
  58. acc.z /= norm;
  59. //根据当前四元数的姿态值估算出各重力分量Vx,Vy,Vz
  60. float vx = Rot_matrix[ 0][ 2];
  61. float vy = Rot_matrix[ 1][ 2];
  62. float vz = Rot_matrix[ 2][ 2];
  63. //使用叉积来计算重力误差
  64. ex += acc.y * vz - acc.z * vy;
  65. ey += acc.z * vx - acc.x * vz;
  66. ez += acc.x * vy - acc.y * vx;
  67. }
  68. //只有当从加速度计或磁力计收集有效数据时才应用反馈
  69. if(ex != 0.0f && ey != 0.0f && ez != 0.0f)
  70. {
  71. //把上述计算得到的重力和磁力差进行积分运算
  72. if(KiDef > 0.0f)
  73. {
  74. integralFBx += KiDef * ex * dt;
  75. integralFBy += KiDef * ey * dt;
  76. integralFBz += KiDef * ez * dt;
  77. gyro.x += integralFBx;
  78. gyro.y += integralFBy;
  79. gyro.z += integralFBz;
  80. }
  81. else
  82. {
  83. integralFBx = 0.0f;
  84. integralFBy = 0.0f;
  85. integralFBz = 0.0f;
  86. }
  87. //把上述计算得到的重力差和磁力差进行比例运算
  88. gyro.x += KpDef * ex;
  89. gyro.y += KpDef * ey;
  90. gyro.z += KpDef * ez;
  91. }
  92. float dq0 = 0.5f*(-q1 * gyro.x - q2 * gyro.y - q3 * gyro.z);
  93. float dq1 = 0.5f*( q0 * gyro.x + q2 * gyro.z - q3 * gyro.y);
  94. float dq2 = 0.5f*( q0 * gyro.y - q1 * gyro.z + q3 * gyro.x);
  95. float dq3 = 0.5f*( q0 * gyro.z + q1 * gyro.y - q2 * gyro.x);
  96. q0 += dt * dq0;
  97. q1 += dt * dq1;
  98. q2 += dt * dq2;
  99. q3 += dt * dq3;
  100. norm = sqrtf4(q0, q1, q2, q3);
  101. q0 /= norm;
  102. q1 /= norm;
  103. q2 /= norm;
  104. q3 /= norm;
  105. Rot_matrix[ 0][ 0] = q0q0 + q1q1 - q2q2 - q3q3;
  106. Rot_matrix[ 0][ 1] = 2.f * (q1q2 + q0q3);
  107. Rot_matrix[ 0][ 2] = 2.f * (q1q3 - q0q2);
  108. Rot_matrix[ 1][ 0] = 2.f * (q1q2 - q0q3);
  109. Rot_matrix[ 1][ 1] = q0q0 - q1q1 + q2q2 - q3q3;
  110. Rot_matrix[ 1][ 2] = 2.f * (q2q3 + q0q1);
  111. Rot_matrix[ 2][ 0] = 2.f * (q1q3 + q0q2);
  112. Rot_matrix[ 2][ 1] = 2.f * (q2q3 - q0q1);
  113. Rot_matrix[ 2][ 2] = q0q0 - q1q1 - q2q2 + q3q3;
  114. //四元数转换为欧拉角输出
  115. state->pitch = asin(Rot_matrix[ 1][ 2]);
  116. state->roll = atan2(-Rot_matrix[ 0][ 2],Rot_matrix[ 2][ 2]);
  117. state->yaw = atan2(-Rot_matrix[ 1][ 0], Rot_matrix[ 1][ 1]);
  118. }
  119. }

运算宏定义如下:


 
 
  1. #define MM2M 0.001f
  2. #define DEG2RAD 0.017453292519943295769236907684886f // 角度转弧度
  3. #define RAD2DEG 57.295779513082320876798154814105f // 弧度转角度
  4. #define sq(a) ((a) * (a)) //平方、
  5. #define sqrtf4(a,b,c,d) __sqrtf(sq(a) + sq(b) + sq(c) + sq(d))
  6. #define sqrtf3(a,b,c) __sqrtf(sq(a) + sq(b) + sq(c))
  7. #define sqrtf2(a,b) __sqrtf(sq(a) + sq(b))

以上仅为本人的理解,仅供参考,如有细节上的错误希望大神指点指点!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

飞控陀螺仪,磁力计,加速计,四元数姿态结算 的相关文章

  • 关于我使用的安卓View Binding方式

    方案有 xff1a ButterKnife findViewById View Binding 下面看下View Binding在下面的场景怎么使用 Activities Fragments Inflate Bind RecyclerVie
  • SpringBoot

    resources application properties xff1a Spring Boot应用的配置文件 xff1b 可以修改一些默认设置 xff1b server port 61 8081 改变默认端口号 使用SpringMVC
  • [转]机器学习之第一天

    一 机器学习简介 xff08 一 xff09 简单介绍 1 人工智能之父 图灵 图灵测试 xff08 1950 xff09 2 马文 李 闵斯基 xff1a 把人工智能推向了全世界 xff1b 3 人工智能 xff08 1950 xff09
  • [转]【微服务架构

    GitLab 新建 myshop 项目 使用 ssh 克隆到本地 将代码复制进 myshop 提交到本地仓库 提交到远程仓库 从 GitLab 拉取源代码到 Docker 容器中 生成 SSH KEY ssh keygen t rsa C
  • [转]Spring Cloud Netflix服务搭建详解(一):服务的注册与发现

    文章目录 简介导航 xff1a 创建统一的依赖管理 概述创建依赖管理项目服务注册与发现 概述创建服务注册中心Applicationapplication yml操作界面创建服务提供者 概述POMApplicationapplication
  • [转]Spring Cloud Netflix服务搭建详解(二):熔断器和Zuul网关

    文章目录 使用熔断器防止服务雪崩 概述Ribbon 中使用熔断器和熔断器仪表盘 在 pom xml 中增加依赖启动类上增加 64 EnableHystrix 注解在 Service 中增加 64 HystrixCommand 注解测试熔断器
  • [转]Spring Cloud Netflix服务搭建详解(三):分布式配置中心和服务监控追踪

    文章目录 分布式配置中心 分布式配置中心服务端 创建项目pom文件Applicationapplication yml测试附 xff1a HTTP 请求地址和资源文件映射分布式配置中心客户端 概述Applicationapplication
  • SSM众筹网站手写分页,同步

    jsp main jsp 发出请求 lt a href 61 34 APP PATH user index do 34 gt lt i class 61 34 glyphicon glyphicon user 34 gt lt i gt 用
  • 【java毕业设计】基于Spring Boot+mysql的音乐网站与分享平台系统设计与实现(程序源码)-音乐网站与分享平台

    基于Spring Boot 43 mysql的音乐网站与分享平台系统设计与实现 xff08 程序源码 43 毕业论文 xff09 大家好 xff0c 今天给大家介绍基于Spring Boot 43 mysql的音乐网站与分享平台系统设计与实
  • spring boot + vue + 图片验证码 登录实例( 从菜鸟到小白 )

    spring boot 实现验证数据库登录 43 图片验证码登录 1 先创建个数据库 数据库大概就是这个样子 xff08 表名先叫 user xff09 2 在项目里面写好dao entity 等等一系列东西 我这里就不一一列出来了 xff
  • SSM众筹网站手写分页,异步

    jsp main jsp 发出请求 lt a href 61 34 APP PATH user toIndex do 34 gt lt i class 61 34 glyphicon glyphicon user 34 gt lt i gt
  • 模糊查询-注意事项

    1 动态查询语句 2 SQL中占位符不能在单引号中 xff0c 否则 xff0c 会以 进行查询数据 39 param 39 39 39 3 SQL中不能使用加号进行字符串拼接 xff0c 加号是用来做运算的 39 39 43 39 D 3
  • 克龙表达式

    Cron表达式详解 1 基本格式 用空格分开的7个部分 xff0c 按顺序依次为 秒 xff1a 0 59 分钟 xff1a 0 59 小时 xff1a 0 23 日期 xff1a 1 31 xff0c 但是需要考虑月的实际天数 day o
  • The method xxx of type xxx must override a superclass method

    原因是1 5及以下不认识 64 override 修改编译版本为1 6及以上 步骤1 2 步骤2 3
  • 删除Activiti表单

    DROP TABLE IF EXISTS ACT RE DEPLOYMENT DROP TABLE IF EXISTS ACT GE PROPERTY DROP TABLE IF EXISTS ACT HI ACTINST DROP TAB
  • 表单重置的2种方式

    1 34 resetBtn 34 click function 34 advertForm 34 0 reset 2 34 resetBtn 34 click function document getElementById 34 adve
  • mybatis的一些笔记

    目录 结论 xff1a mybatis是与数据库交互的框架 MyBatis 01 HelloWorld MyBatis 02 config MyBatis 03 mapper sql映射文件的增删改查 1 单个参数 xff1a mybati
  • SpringMVC笔记

    目录 QuickStart 重要注解 64 RequestMapping 1 把数据封装到bean中且bean中有引用类型user name的值与bean 的参数必须完全一致 xff0c 自动封装 xff0c 引用的类型用 级联user u
  • 解决ubuntu下c++标准库缺少conio.h

    该头文件是用于检测键盘输入的 xff0c 在windows下 xff0c c 43 43 标准库是自带的 xff0c 但是在Linux下没有该头文件 xff0c 可以通过手动的方式进行添加 步骤如下 xff1a 1 打开终端 xff0c s
  • 重装系统之gpt分区与mbr分区

    重装ubunutu系统时往往会碰到不能将系统装在所选分区的 情况 xff0c 一般是因为硬盘原本分区不是gpt分区 重装windows系统时往往会碰到不能将系统装在所选分区的 情况 xff0c 一般是因为硬盘原本分区不是mbr分区 gpt

随机推荐

  • Debian的GNOME汉化(美化)简易教程(转)

    Debian的GNOME汉化 美化 简易教程 转 64 more 64 Debian的GNOME汉化 美化 简易教程 fcitx开机启动 tahoma英文显示 simsun中文显示 openoffice字体调整 这是我自己汉化GNOME的心
  • Centos8 系统下安装jdk1.8

    查看是否已经安装java java version 检查 yum 中有没有 java1 8 包 yum list java 1 8 安装jdk yum install java 1 8 0 openjdk y
  • 3.3:如何在Python中创建文件?

    一 在Python中创建文件的主要步骤包括 1 使用open 函数打开一个文件对象 2 使用文件对象的write 方法向文件中写入内容 3 关闭文件对象 以释放文件资源 二 open 函数有三个参数 1 文件0名 需要创建的文件的名称和路径
  • Android设置暗码简要流程

    设置暗码 1 Phone对暗码的简要处理流程 路径 packages services Telephony src com android phone SpecialCharSequenceMgr java phone中对暗码的处理 spa
  • [教程]Ubuntu20.04安装Node.js

    前言 这两天在装一个工具软件的时候 xff0c 要求先安装Node js xff0c 我也不懂这是用来干什么的 xff0c 只知道跟JavaScript有关 不懂没关系 xff0c 装就完事了 xff0c 管它呢 本文将介绍3种在Ubunt
  • Ubuntu使用管理员(root)身份登录系统

    Ubuntu使用管理员 xff08 root xff09 身份登录系统 一 Ubuntu安装好后 xff0c Ubuntu系统默认root用户是不能登录的 xff0c 密码也是空的 如果想要使用root用户登录 xff0c 必须先为root
  • Android使用代码进行界面布局和改变图标、标题、名称、主界面

    一 代码进行界面布局 lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt 二 Android Studio改变图标 标题 名称 主界面 注意 xff1a 64 表示是在哪个目录或者是
  • Linux(Ubuntu)系统如何安装Python

    Linux 系统是为编程而生的 xff0c 因此绝大多数的 Linux 发行版 xff08 Ubuntu CentOS 等 xff09 都默认自带了 Python 有的 Linux 发行版甚至还会自带两个版本的 Python xff0c 例
  • 如何用python实现多线程爬虫

    当单线程python爬虫已经不能满足企业需求时 xff0c 很多程序员会进行改代码或者增加服务器数量 xff0c 这样虽说也能达到效果 xff0c 但是对于人力物力也是一笔不小的消耗 如果是技术牛点的 xff0c 正常都会自己重新改写多线程
  • ## Hive分析疫情数据

    拿到的数据部分如下 xff1a 4月27日 黑龙江 境外输入 不详 0 45 0 黑龙江卫健委 https m thepaper cn newsDetail forward 7160075 4月27日 内蒙古 境外输入 不详 0 8 0 央
  • python --根据windows窗口名称、进程pid打开窗口(pygetwindow详解)

    pygetwindow详解 简介 pygetwindow是一个Python库 xff0c 用于获取 操作和管理当前打开的窗口 它提供了一些常用的窗口操作方法 xff0c 包括获取窗口句柄 xff0c 获取窗口位置和大小 xff0c 移动和调
  • Redhat Linux advance Server V2.1无法进入桌面(转)

    Redhat Linux advance Server V2 xff11 无法进入桌面 转 64 more 64 在本地调试安装了个Redhat Linux advance Server V2 1 xff0c 一共有5张光盘 xff0c 我
  • Mac上类似于xshell的远程工具:finalshell 和 royal tsx

    FinalShell 国产 国产 国产 自己研发的 是一体化的的服务器 网络管理软件 不仅是ssh客户端 还是功能强大的开发 运维工具 充分满足开发 运维需求 特色功能 免费海外服务器远程桌面加速 ssh加速 本地化命令输入框 支持自动补全
  • css查找元素注意事项

    一 CSS ID 选择器查找元素 1 注意 xff1a 如果元素的ID不唯一 xff0c 或者是动态的 或者name以及linktext属性值也不唯一 我们就需要考虑用Xpath来查找元素了 xff0c 然后再对元素执行操作 不管用什么方式
  • OS2.3.7:多生产者,多消费者问题

    文章目录 0 问题描述1 问题分析2 实现3 总结 0 问题描述 桌子上有一只盘子 xff0c 每次只能向其中放入一个水果 爸爸专向盘子中放苹果 xff0c 妈妈专向盘子中放橘子 xff0c 儿子专等着吃盘子中的橘子 xff0c 女儿专等着
  • java 方法名类名命名规范

    一 命名规范 1 项目名全部小写 2 包名全部小写 3 类名首字母大写 xff0c 如果类名由多个单词组成 xff0c 每个单词的首字母都要大写 大驼峰 xff0c 如 xff1a public class MyFirstClass 4 变
  • Qt arm环境安装

    一 相关工作准备 Qt opensource 和 Qt everywhere 下载 链接 版本为5 9 8 arm linux gcc下载 链接 版本为4 8 3 tslib 下载 链接 版本为1 21 ps 可以不安装Qt opensou
  • STM32驱动ST7789V2 tft屏幕

    一 简介 本次教程使用的是1 54寸240 240像素的tft屏幕 xff0c 其接口协议为SPI协议 在使用的过程中仅需要四根数据即可驱动点亮屏幕 然后硬件使用的是STM32F103C8T6核心板 xff0c 用的是SPI2 一般购买屏幕
  • linux设置复杂度策略、登录超时处理功能

    1 在字符终端下 xff0c 实现某一用户连续错误登陆N次后 xff0c 就锁定该用户X分钟 pam tally2 执行 vi etc pam d login 在 PAM 1 0 下新起一行 xff0c 加入 auth required p
  • 飞控陀螺仪,磁力计,加速计,四元数姿态结算

    MPU6050主要包含陀螺仪和加速度计 陀螺仪主要测量角速度 xff0c 即可以测出某一时间段物体转过的角度 加速度计测量的是物体的加速度 xff0c 重力加速度即物体受重力作用的情况下具有的加速度 xff0c 物体静止时 xff0c 加速