姿态传感器是一种用于检测和测量物体的姿态或位置的设备。它们通常使用各种传感器技术,如加速度计、陀螺仪和磁力计等,来获取物体在空间中的方向、旋转角度和位置信息。姿态传感器广泛应用于许多领域,包括航空航天、机器人技术、虚拟现实、运动追踪和医疗设备等。通过实时监测和记录物体的姿态,姿态传感器可以帮助实现精确的导航、运动控制和姿势分析等功能。
姿态传感器的工作原理取决于其具体的传感器技术。以下是几种常见的姿态传感器及其工作原理:
加速度计(Accelerometer):加速度计通过测量物体的加速度来确定其姿态。加速度计通常使用微机电系统(MEMS)技术,其中包含微小的质量和弹簧系统。当物体发生加速度变化时,质量会受到力的作用而移动,通过测量这种移动可以确定物体的加速度和姿态。
常见的三轴加速度传感器使用微电机加速度计(MEMS accelerometer)技术。它们通常包含三个独立的加速度传感器,分别测量物体在X轴、Y轴和Z轴方向上的加速度。只记得加速度测量机测量到的加速度和受力方向相反,当初使用这个是为了判断受力是超重还是失重,变化时,加速度传感器会感知到这种变化并产生相应的电信号。这些信号经过放大和处理后,可以转换为数字信号,并通过数字接口(如I2C或SPI)传输给微控制器或其他处理器。
陀螺仪(Gyroscope):陀螺仪通过测量物体的角速度来确定其姿态。陀螺仪通常使用旋转的转子或振荡器来感知角速度的变化。当物体发生旋转时,转子或振荡器会受到力的作用而发生相应的位移,通过测量这种位移可以确定物体的角速度和姿态。
这里介绍以下两个内容:地面坐标系(Earth-fixed coordinate system)是一种以地球表面为参考的坐标系,用于描述物体在地球上的位置和运动。地面坐标系通常使用经度、纬度和高度(或海拔)来表示位置。
机体坐标系(Body-fixed coordinate system)是一种以物体自身为参考的坐标系,用于描述物体内部或相对于物体的位置和方向。机体坐标系通常使用前后、左右和上下(或X、Y、Z)来表示物体的方向。
区别:
联系:
总的来说,地面坐标系和机体坐标系是两种不同的坐标系,用于描述不同的参考对象和位置关系。它们在不同的应用领域中起着重要的作用,并且在某些情况下需要进行坐标转换。
那么我们得到坐标位置是为了什么呢,主想借大学物理和高数内容介绍一下欧拉角:
欧拉角(Euler angles)是一种常用的描述物体姿态的方法。它由三个旋转角度组成,通常分别称为滚转角(roll)、俯仰角(pitch)和偏航角(yaw)。
滚转角表示物体绕其自身的X轴旋转的角度。俯仰角表示物体绕其自身的Y轴旋转的角度。偏航角表示物体绕其自身的Z轴旋转的角度。
欧拉角的旋转顺序可以有多种,最常见的是ZYX顺序,也称为航向-俯仰-滚转顺序。在这种顺序下,先绕Z轴旋转偏航角,然后绕旋转后的Y轴旋转俯仰角,最后绕旋转后的X轴旋转滚转角。
欧拉角的优点是直观且易于理解,可以直接对物体的姿态进行描述。它广泛应用于飞行器、机器人、游戏开发和计算机图形学等领域。
然而,欧拉角也存在一些问题。由于旋转顺序的选择和旋转角度的限制,欧拉角存在万向锁问题(gimbal lock),即在某些情况下,两个旋转角度会变得冗余或无法唯一确定物体的姿态。为了避免这个问题,有时候会使用四元数
(quaternions)或旋转矩阵(rotation matrices)来替代欧拉角。哈哈哈我不会四元数,就不bb了。
总的来说,欧拉角是一种常用的姿态描述方法,具有直观和易于理解的特点,但在某些情况下可能存在万向锁问题。
磁力计(Magnetometer):磁力计通过测量物体周围磁场的强度和方向来确定其姿态。磁力计利用磁敏材料的特性,当材料受到磁场作用时,其电阻或电压会发生变化。通过测量这种变化可以确定物体所处的磁场方向,从而确定其姿态。
这些传感器通常会结合在一起,形成姿态传感器系统。通过同时测量加速度、角速度和磁场等参数,姿态传感器可以计算出物体的姿态,包括方向、旋转角度和位置等信息。这些数据可以通过算法进行处理和解析,从而实现对物体姿态的准确测量和跟踪。
以下是一般的使用姿态传感器的步骤:
需要注意的是,具体使用姿态传感器的方法会因应用的不同而有所变化。例如,在航空航天领域中,可能需要更复杂的姿态控制算法和系统来实现精确的导航和飞行控制。在虚拟现实领域中,可能需要更高的实时性和精度来跟踪用户的头部和手部姿态。因此,在具体应用中,需要根据需求和要求进行相应的定制和调整。 姿态传感器在许多领域中都有广泛的应用。以下是一些姿态传感器的应用示例:
STMicroelectronics:STMicroelectronics是一家全球领先的半导体公司,提供各种姿态传感器解决方案,包括加速度计、陀螺仪和磁力计等。
InvenSense(现为TDK公司):InvenSense是一家专注于惯性传感器技术的公司,提供高性能的加速度计和陀螺仪等姿态传感器产品。
Bosch Sensortec:Bosch Sensortec是博世集团的子公司,专注于传感器技术。他们提供各种姿态传感器解决方案,包括加速度计、陀螺仪和磁力计等。
Analog Devices:Analog Devices是一家领先的半导体公司,提供各种传感器解决方案,包括姿态传感器。他们的产品范围包括加速度计、陀螺仪和磁力计等。
Honeywell(霍尼韦尔):Honeywell是一家全球知名的工业自动化和控制技术供应商,他们提供各种姿态传感器产品,包括加速度计、陀螺仪和磁力计等。
这只是一些主要的姿态传感器供应商,市场上还有许多其他供应商提供各种姿态传感器解决方案。在选择供应商时,可以根据产品性能、可靠性、技术支持和供应链等因素进行评估和比较。
这只是姿态传感器应用的一小部分示例,实际上,姿态传感器在许多其他领域中也有各种应用,如游戏控制、智能家居、运动装备等。随着技术的不断发展,姿态传感器的应用领域将继续扩大和创新。
此外,结合自己的电赛经历略述一二,向大家介绍的是MPU6050,是一款集成了三轴陀螺仪和三轴加速度计的传感器模块。它由英飞凌(InvenSense)公司开发,广泛应用于姿态测量、运动追踪和稳定控制等领域。
MPU6050内部集成了三轴陀螺仪和三轴加速度计,能够同时测量物体的旋转和线性加速度。陀螺仪用于测量物体的旋转速度和方向,而加速度计则用于测量物体的线性加速度和倾斜角度。
MPU6050采用数字输出,通过I2C总线与微控制器或其他设备进行通信。它具有高精度、低功耗和快速响应的特点,适用于需要实时姿态测量和运动追踪的应用。
除了陀螺仪和加速度计,MPU6050还提供了一些额外的功能和传感器,如温度传感器和数字运动处理器(DMP)。温度传感器可用于测量环境温度,而DMP则可以通过内部算法提供更高级的运动处理功能,如姿态解算和方向估计。
初始化MPU6050传感器:
初始化I2C总线,复位MPU6050,再次唤醒mpu6050后,设置陀螺仪传感器为±200dps,加速度传感器±2g,设置采样率50HZ,关闭中断配置INT引脚低电平有效。器件id正确后,设置pll,clksel,xz的水平轴为参考
读取传感器数据:
使用官方empl库所带的函数获取加速度值和陀螺仪值,理由欧拉公式计算得到俯仰角和偏航角(ps:需要设置延时函数如果要输到上位机,需要提供串口等接口)
解析和处理数据:
这里介绍当时使用的方法:读取数据判断是否在设置的阈值范围内,并记录最后的数据用于比较下一次的变化情况,根据自己的算法要求进行处理。要结合编码器的使用,使用了STM32正交编码器,是指在STM32系列微控制器中用于读取旋转编码器信号的硬件模块。旋转编码器是一种用于测量旋转运动的传感器,通常由两个光电传感器组成,可以测量旋转方向和速度。而STM32正交编码器模块支持两种常见的编码器类型:增量式编码器和绝对式编码器。这里吧主将自己的理解的原理放进来:编码器轴每旋转一圈,A相和B相都发出相同的脉冲个数,但是A相和B相之间存在一个90°(电气角的一周期为360”)的电气角相位差,可以根据这个相位差来判断编码器货转的方向是正转还是反转,正转时,A相超前B相90°先进行相位输出,反转时,B相超前A相90°先进行相位输出。
增量式编码器通过两个光电传感器(我使用的是光码盘和光电二极管)检测旋转编码盘上的刻度,并生成两个相位差90度的方波信号。通过检测这两个方波信号的变化,可以确定旋转方向和速度。STM32正交编码器模块可以直接读取这两个方波信号,并提供相应的硬件计数器和中断功能,使得编码器的读取和处理变得更加简单和高效。
绝对式编码器则通过在编码盘上添加更多的刻度,以实现对旋转位置的绝对测量。STM32正交编码器模块可以支持多种绝对式编码器的协议和接口,如SSI(同步串行接口)、BiSS(双向同步串行接口)和SPI(串行外设接口)等。通过读取这些接口的数据,可以准确地获取旋转位置信息。
在使用STM32正交编码器模块时,需要配置相关的寄存器和中断,以使其与编码器信号同步工作。可以根据实际需求选择不同的计数模式、计数方向和中断触发条件等。此外,还可以通过使用DMA(直接内存访问)功能,将编码器数据直接传输到内存,减轻CPU的负担。
总的来说,STM32正交编码器模块为STM32微控制器提供了方便、高效的编码器信号读取和处理功能,使得我们使用者可以更加轻松地实现旋转运动的测量和控制。通过把编码器放在pwm直流电机转轴处,把AB两相接入单片机接口可以获得具体的信息。
欸,大家可能疑惑了,我这里将姿态传感器那为什么说到了编码器了呢。hhhh,因为俺要讲如何在软件上去调试姿态传感器,那我就要再废话了,我的目标是什么呢,结合电赛,我想说小车直立行走任务分解
我们要求车模在直立的状态下以两个轮子在地面上随意行走,相比四轮着地状态,车模控制任务更为复杂。为了能够方便找到解决问题的办法,首先将复杂的问题分解成简单的问题进行讨论。
从控制角度来看,车模作为一个控制对象,它的控制输入量是两个电转动速度。车横运动控制任务可以分解成以下三个基本控制任务
(1)控制车模平衡:通过控制两个电机正反向运动保持车模直立平衡化
(2)控制车横速度:通过调节车模的倾角来实现车模速度控制,实际上还是演变成通过控制电机的转速来实现车轮速度的控制
(3)控制车模方向:通过控制两个电机之间的转动差速实现车模转
哎呀这么复杂,我们考虑的核心在哪里,哈哈就是负反馈,是否平衡是否转弯无法缺少的就是将采集到的数据比较反馈了,大家读到这里就明白我在数据处理时存储最后一次数据的用意了哈哈,最后结合pid控制。PID控制是一种常用的反馈控制算法,用于调节系统的输出以使其达到期望值。PID是Proportional-Integral-Derivative的缩写,分别代表比例、积分和微分三个控制项。
PID控制通过将比例、积分和微分项加权求和,得到最终的控制输出。权重因子可以根据系统的特性和需求进行调整,以达到最佳的控制效果。
在实际应用中,PID控制广泛用于工业自动化、机械控制、温度控制、飞行器控制等领域。通过不断调整PID参数,可以实现系统的稳定性、精度和响应速度的平衡。
总的来说,PID控制是一种简单而有效的控制算法,通过比例、积分和微分三个控制项的组合调节系统的输出,以实现期望的控制效果。 这里借用了matlab仿真进行了预测和优化,打字累了不想说了,哈哈,结合姿态传感器使用一下把哈哈哈哈哈哈 偷懒嘎嘎嘎,
含mpu6050芯片的姿态传感器模块
基于stm4与串口调试结果图
最后结合电赛,我想说,除了姿态传感器我们应该还要结合编码器,超声波测距,步进电机CDD摄像头,正交码盘的使用,pwm步进电机,我们不仅仅要考虑到以上电子相关内容,应当考虑类似的,在小车开发中,扭矩通常用于描述引擎或电动机对车轮的驱动力。较大的扭矩可以提供更大的驱动力,使车辆能够加速或克服阻力。在小车开发中,摩擦力对于车辆的制动、转弯和牵引等方面起着重要作用。合理控制摩擦力可以提高车辆的操控性和安全性。为了最大限度地利用摩擦力,需要对车辆的重心、轮胎和地面之间的摩擦系数等因素进行优化和调整。
mpu6050驱动
import machine class accel(): def __init__(self, i2c, addr=0x68): self.iic = i2c self.addr = addr self.iic.start() self.iic.writeto(self.addr, bytearray([107, 0])) self.iic.stop() def get_raw_values(self): self.iic.start() a = self.iic.readfrom_mem(self.addr, 0x3B, 14) self.iic.stop() return a def get_ints(self): b = self.get_raw_values() c = [] for i in b: c.append(i) return c def bytes_toint(self, firstbyte, secondbyte): if not firstbyte & 0x80: return firstbyte << 8 | secondbyte return - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1) def get_values(self): raw_ints = self.get_raw_values() vals = {} vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1]) vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3]) vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5]) vals["Tmp"] = self.bytes_toint(raw_ints[6], raw_ints[7]) / 340.00 + 36.53 vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9]) vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11]) vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13]) return vals # returned in range of Int16 # -32768 to 32767 def val_test(self): # ONLY FOR TESTING! Also, fast reading sometimes crashes IIC from time import sleep while 1: print(self.get_values()) sleep(0.05)
主程序
from machine import I2C,Pin i2c = I2C(scl=Pin("X9"), sda=Pin("X10")) accel = mpu6050.accel(i2c) accel_dict = accel.get_values() print(accel_dict)