加速度计-软件

注解

本节涵盖软件中的加速度计。有关加速度计的硬件指南,请参阅:加速度计 - 硬件.

加速度计是一种测量加速度的设备。

加速度计通常分为两种:单轴和三轴。单轴加速度计可测量一个空间维度上的加速度; 3轴加速度计可一次测量沿所有三个空间维度的加速度。

WPILib通过`AnalogAccelerometer`_类支持单轴加速度计。

3轴加速度计通常需要更复杂的通信协议(例如SPI或I2C)才能发送多维数据。 WPILib对以下3轴加速度计具有本机支持:

模拟加速度计

AnalogAccelerometer类(Java, C++)允许用户从连接到roboRIO的模拟输入端的单轴加速度计读取值。

// Creates an analog accelerometer on analog input 0
AnalogAccelerometer accelerometer = new AnalogAccelerometer(0);

// Sets the sensitivity of the accelerometer to 1 volt per G
accelerometer.setSensitivity(1);

// Sets the zero voltage of the accelerometer to 3 volts
accelerometer.setZero(3);

// Gets the current acceleration
double accel = accelerometer.getAcceleration();

如果用户使用3轴模拟加速度计,则可以使用三个此类的实例,每个实例一个读取一个轴。

加速度计接口

WPILib中的所有3轴加速度计均实现Accelerometer接口(Java, C++)。该接口定义了所有受支持的三轴加速度计常用的功能和设置。

Accelerometer接口可以用于获取沿每个基本方向(x,y和z)的加速度,以及设定加速度计的测量范围。

警告

并非所有的加速度计都能测量全部范围。

// Sets the accelerometer to measure between -8 and 8 G's
accelerometer.setRange(Accelerometer.Range.k8G);

ADXL345_I2C

ADXL345_I2C类(Java, C++)提供了ADXL345加速度计接入I2C通信总线的支持。

// Creates an ADXL345 accelerometer object on the MXP I2C port
// with a measurement range from -8 to 8 G's
Accelerometer accelerometer = new ADXL345_I2C(I2C.Port.kMXP, Accelerometer.Range.k8G);

ADXL345_SPI

ADXL345_SPI类(Java <https://first.wpi.edu/wpilib/allwpilib/docs/release/java/edu/wpi/first/wpilibj/ADXL345_SPI.html>`__,C ++ <https://first.wpi.edu/wpilib/allwpilib/docs/release/cpp/classfrc_1_1ADXL345__SPI.html>`__)通过SPI通信总线为ADXL345加速度计提供支持。

// Creates an ADXL345 accelerometer object on the MXP SPI port
// with a measurement range from -8 to 8 G's
Accelerometer accelerometer = new ADXL345_SPI(SPI.Port.kMXP, Accelerometer.Range.k8G);

ADXL362

ADXL362类(Java, C++)提供了ADXL362加速度计接入SPI通信总线的支持。

// Creates an ADXL362 accelerometer object on the MXP SPI port
// with a measurement range from -8 to 8 G's
Accelerometer accelerometer = new ADXL362(SPI.Port.kMXP, Accelerometer.Range.k8G);

内置加速度计

该BuiltInAccelerometer类(Java, C++),可以访问roboRIO自身内置的加速度计:

// Creates an object for the built-in accelerometer
// Range defaults to +- 8 G's
Accelerometer accelerometer = new BuiltInAccelerometer();

第三方加速度计

虽然WPILib为零件套件中或通过FIRST Choice提供的许多加速度计提供了本地支持,但FRC中普遍使用了一些流行的AHRS(姿态航向参考系统)设备,其中包括加速度计。他们通常通过供应商库进行控制,如果它们具有简单的模拟输出,则可以与AnalogAccelerometer类一起使用。

在代码中使用加速度计

注解

加速度计,顾名思义,可以测量加速度。精确的加速度计可用于通过两次积分确定位置(因为加速度是位置的二阶导数),这在很大程度上是使用陀螺仪确定航向的方式。但是,可用于FRC的加速度计并不支持这种方式。

建议在FRC中使用加速度计,来应对需要粗略测量当前加速度的任何情况。这可以包括检测与其他机器人或现场物体的碰撞,以便可以自动收回脆弱的机械装置。它们还可用于确定机器人何时在自动阶段中越过崎岖的地形(例如穿过FIRST Stronghold中的防御)。

为了检测碰撞,测量加加速度比检测加速度通常要更可靠。加加速度是加速度的导数(或变化率),它表示机器人上的力变化的速度有多快-碰撞的突然冲击会导致加加速度的急剧变化。可以通过简单地获取后续加速度测量值的差,然后除以它们之间的时间来确定加加速度:

double prevXAccel = 0;
double prevYAccel = 0;

Accelerometer accelerometer = new BuiltInAccelerometer();

@Override
public void robotPeriodic() {
    // Gets the current accelerations in the X and Y directions
    double xAccel = accelerometer.getX();
    double yAccel = accelerometer.getY();

    // Calculates the jerk in the X and Y directions
    // Divides by .02 because default loop timing is 20ms
    double xJerk = (xAccel - prevXAccel)/.02;
    double yJerk = (yAccel - prevYAccel)/.02;

    prevXAccel = xAccel;
    prevYAccel = yAccel;
}

大多数适用于FRC的合法加速度计都会产生很多噪声数据,将它们与LinearFilter类(Java, C++) 组合以减少噪声通常是一个好主意:

Accelerometer accelerometer = new BuiltInAccelerometer();

// Create a LinearDigitalFilter that will calculate a moving average of the measured X acceleration over the past 10 iterations of the main loop

LinearDigitalFilter xAccelFilter = LinearDigitalFilter.movingAverage(10);

@Override
public void robotPeriodic() {
    // Get the filtered X acceleration
    double filteredXAccel = xAccelFilter.calculate(accelerometer.getX());
}