From 5590208732d4008ade429ef8c9f9f4eb47dd16f2 Mon Sep 17 00:00:00 2001 From: 45coll <674148718@qq.com> Date: Tue, 9 Nov 2021 16:23:31 +0800 Subject: [PATCH] readme image --- arduino/main/Kalman.cpp | 93 + arduino/main/Kalman.h | 59 + image/gui_main.jpg | Bin 0 -> 62053 bytes .../gui/__pycache__/main_ui.cpython-37.pyc | Bin 3320 -> 6466 bytes 参考代码.cpp | 428 + 物料清单.xlsx | Bin 0 -> 16394 bytes 莱洛三角结构/动量轮8cm.dxf | 10084 ++++++++++++++++ 莱洛三角结构/时钟指针.dxf | 2404 ++++ 莱洛三角结构/时钟花纹.dxf | 4258 +++++++ 莱洛三角结构/时钟边框.dxf | 6952 +++++++++++ 莱洛三角结构/莱洛三角形10cm.dxf | 6304 ++++++++++ 11 files changed, 30582 insertions(+) create mode 100644 arduino/main/Kalman.cpp create mode 100644 arduino/main/Kalman.h create mode 100644 image/gui_main.jpg create mode 100644 参考代码.cpp create mode 100644 物料清单.xlsx create mode 100644 莱洛三角结构/动量轮8cm.dxf create mode 100644 莱洛三角结构/时钟指针.dxf create mode 100644 莱洛三角结构/时钟花纹.dxf create mode 100644 莱洛三角结构/时钟边框.dxf create mode 100644 莱洛三角结构/莱洛三角形10cm.dxf diff --git a/arduino/main/Kalman.cpp b/arduino/main/Kalman.cpp new file mode 100644 index 0000000..80c7dec --- /dev/null +++ b/arduino/main/Kalman.cpp @@ -0,0 +1,93 @@ +/* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved. + + This software may be distributed and modified under the terms of the GNU + General Public License version 2 (GPL2) as published by the Free Software + Foundation and appearing in the file GPL2.TXT included in the packaging of + this file. Please note that GPL2 Section 2[b] requires that all works based + on this software must also be made publicly available under the terms of + the GPL2 ("Copyleft"). + + Contact information + ------------------- + + Kristian Lauszus, TKJ Electronics + Web : http://www.tkjelectronics.com + e-mail : kristianl@tkjelectronics.com + */ + +#include "Kalman.h" + +Kalman::Kalman() { + /* We will set the variables like so, these can also be tuned by the user */ + Q_angle = 0.001f; + Q_bias = 0.003f; + R_measure = 0.03f; + + angle = 0.0f; // Reset the angle + bias = 0.0f; // Reset bias + + P[0][0] = 0.0f; // Since we assume that the bias is 0 and we know the starting angle (use setAngle), the error covariance matrix is set like so - see: http://en.wikipedia.org/wiki/Kalman_filter#Example_application.2C_technical + P[0][1] = 0.0f; + P[1][0] = 0.0f; + P[1][1] = 0.0f; +}; + +// The angle should be in degrees and the rate should be in degrees per second and the delta time in seconds +float Kalman::getAngle(float newAngle, float newRate, float dt) { + // KasBot V2 - Kalman filter module - http://www.x-firm.com/?page_id=145 + // Modified by Kristian Lauszus + // See my blog post for more information: http://blog.tkjelectronics.dk/2012/09/a-practical-approach-to-kalman-filter-and-how-to-implement-it + + // Discrete Kalman filter time update equations - Time Update ("Predict") + // Update xhat - Project the state ahead + /* Step 1 */ + rate = newRate - bias; + angle += dt * rate; + + // Update estimation error covariance - Project the error covariance ahead + /* Step 2 */ + P[0][0] += dt * (dt*P[1][1] - P[0][1] - P[1][0] + Q_angle); + P[0][1] -= dt * P[1][1]; + P[1][0] -= dt * P[1][1]; + P[1][1] += Q_bias * dt; + + // Discrete Kalman filter measurement update equations - Measurement Update ("Correct") + // Calculate Kalman gain - Compute the Kalman gain + /* Step 4 */ + float S = P[0][0] + R_measure; // Estimate error + /* Step 5 */ + float K[2]; // Kalman gain - This is a 2x1 vector + K[0] = P[0][0] / S; + K[1] = P[1][0] / S; + + // Calculate angle and bias - Update estimate with measurement zk (newAngle) + /* Step 3 */ + float y = newAngle - angle; // Angle difference + /* Step 6 */ + angle += K[0] * y; + bias += K[1] * y; + + // Calculate estimation error covariance - Update the error covariance + /* Step 7 */ + float P00_temp = P[0][0]; + float P01_temp = P[0][1]; + + P[0][0] -= K[0] * P00_temp; + P[0][1] -= K[0] * P01_temp; + P[1][0] -= K[1] * P00_temp; + P[1][1] -= K[1] * P01_temp; + + return angle; +}; + +void Kalman::setAngle(float angle) { this->angle = angle; }; // Used to set angle, this should be set as the starting angle +float Kalman::getRate() { return this->rate; }; // Return the unbiased rate + +/* These are used to tune the Kalman filter */ +void Kalman::setQangle(float Q_angle) { this->Q_angle = Q_angle; }; +void Kalman::setQbias(float Q_bias) { this->Q_bias = Q_bias; }; +void Kalman::setRmeasure(float R_measure) { this->R_measure = R_measure; }; + +float Kalman::getQangle() { return this->Q_angle; }; +float Kalman::getQbias() { return this->Q_bias; }; +float Kalman::getRmeasure() { return this->R_measure; }; diff --git a/arduino/main/Kalman.h b/arduino/main/Kalman.h new file mode 100644 index 0000000..7de545f --- /dev/null +++ b/arduino/main/Kalman.h @@ -0,0 +1,59 @@ +/* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved. + + This software may be distributed and modified under the terms of the GNU + General Public License version 2 (GPL2) as published by the Free Software + Foundation and appearing in the file GPL2.TXT included in the packaging of + this file. Please note that GPL2 Section 2[b] requires that all works based + on this software must also be made publicly available under the terms of + the GPL2 ("Copyleft"). + + Contact information + ------------------- + + Kristian Lauszus, TKJ Electronics + Web : http://www.tkjelectronics.com + e-mail : kristianl@tkjelectronics.com + */ + +#ifndef _Kalman_h_ +#define _Kalman_h_ + +class Kalman { +public: + Kalman(); + + // The angle should be in degrees and the rate should be in degrees per second and the delta time in seconds + float getAngle(float newAngle, float newRate, float dt); + + void setAngle(float angle); // Used to set angle, this should be set as the starting angle + float getRate(); // Return the unbiased rate + + /* These are used to tune the Kalman filter */ + void setQangle(float Q_angle); + /** + * setQbias(float Q_bias) + * Default value (0.003f) is in Kalman.cpp. + * Raise this to follow input more closely, + * lower this to smooth result of kalman filter. + */ + void setQbias(float Q_bias); + void setRmeasure(float R_measure); + + float getQangle(); + float getQbias(); + float getRmeasure(); + +private: + /* Kalman filter variables */ + float Q_angle; // Process noise variance for the accelerometer + float Q_bias; // Process noise variance for the gyro bias + float R_measure; // Measurement noise variance - this is actually the variance of the measurement noise + + float angle; // The angle calculated by the Kalman filter - part of the 2x1 state vector + float bias; // The gyro bias calculated by the Kalman filter - part of the 2x1 state vector + float rate; // Unbiased rate calculated from the rate and the calculated bias - you have to call getAngle to update the rate + + float P[2][2]; // Error covariance matrix - This is a 2x2 matrix +}; + +#endif diff --git a/image/gui_main.jpg b/image/gui_main.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5a29c2b86337d9aec7acd39fdfab5fd650220d45 GIT binary patch literal 62053 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 Fe*@d566XK_ literal 0 HcmV?d00001 diff --git a/python_gui/gui/__pycache__/main_ui.cpython-37.pyc b/python_gui/gui/__pycache__/main_ui.cpython-37.pyc index e77607ba7bd8f0bd6b483e4efadf4da0508a5d4a..fc03c1b41e3b82c9bf12d10a6a95f830d63f219d 100644 GIT binary patch literal 6466 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 delta 1540 zcmZWoOKcle6n$?zjvap{iDSo~G+#T8$9C%Y(^g1)qyXxsK;2NJdSj+Mi_U0jqwyF~ zWXVWKut7rbB#;V-v4mg)MX;)>t`J*TvGR%yZM^}pV;Amy9>zdy&GmWbo^$V=JL4Z} zf2Eb9Xf#CN!|Kmy-=scJew1F8zx!p2Zuo}8kjHdL+HpW}CtwGiMYhV~EWsjtSxSt; z$O}aRP{N5aW%eD*ln92f`ae41f_mv8 z8M)(SK$vmI%diEu&d!Ww*OYPA*@lPDuuTtd*g<2{*z(TXwq&G@9q+u$LLMee=%DR< zDcRwO7+JUNHf&{wMaHsg$->;bh{1we%8D)J0Od|?DF<4}ds~`m_dvS`nVefO=irw1 zTpeyH3-KuSVc8zC;R5YppS8*HR+a|HIMGO(%pOl(iRTdT4-LvTe6bKq>u?TXX9DxJhx(;-@wEshAj-+72fv(t8;4d?mKMSwKao-?5*AIgT`|6>1)fK>%ASe<9YSRX&bAE!`&k zL9C(1XoM=_`X{E~6rs!T#b1TuS)noRTRq?}#h;SCCj8_0)z!dIVwCycmS#`a2sr_M z5?8l^9usx^LbEty#Ip|Z&(;d(7GcQgTc7`S@5?{#-=5IJ!4eP;Ke_Y3dH2y*AI|8O zuiAL56})Km2Cp6U-cS|(MDpqtZ)N}6jOw!vaS03J_S?3lb^E4fcdRP1BGeF7AhhA? z#~~0Jq|01Sy;#AgDsunQ&rN>FDsc5>2tgXW%zsan3-ijJauR&}W{(Zb&XZx3!y8TF GzP|x4&4nib diff --git a/参考代码.cpp b/参考代码.cpp new file mode 100644 index 0000000..59e36bd --- /dev/null +++ b/参考代码.cpp @@ -0,0 +1,428 @@ + +#include +#include +#include // Source: https://github.com/TKJElectronics/KalmanFilter +#define gyroZ_OFF -0.22 + +//#define stable_angle 178.2 +//#define stable_angle 58.8 + +//#define stable_angle 301.75 +#define stable_angle 60.0 +Kalman kalmanZ; + +/* IMU Data */ +double accX, accY, accZ; +double gyroX, gyroY, gyroZ; +int16_t tempRaw; + +double gyroZangle; // Angle calculate using the gyro only +double compAngleZ; // Calculated angle using a complementary filter +double kalAngleZ; // Calculated angle using a Kalman filter + +uint32_t timer; +uint8_t i2cData[14]; // Buffer for I2C data + +/********************************************************************************/ +#include +//#include "common/foc_utils.h" +#define swing_up_voltage 1.5 //V +#define balance_voltage 10 //V +#define min_voltage 9.5 //V +/* + #define PID_P 0 // + #define PID_I 0 // + #define PID_D 1 // + #define LQR_K1 1 // + #define LQR_K2 0 // + #define LQR_K3 0.0 // +*/ +float PID_P = 1; // +float PID_I = 0; // +float PID_D = 0; // +/* +//稳定器参数 +float LQR_K1 = 50; //摇摆到平衡 +float LQR_K2 = 2; // +float LQR_K3 = 0.30; // + +float LQR_K1_1 = 50; //平衡态 +float LQR_K2_1 = 2; // +float LQR_K3_1 = 0.15; // +*/ +//倒立摆参数 +float LQR_K1 = 200; //摇摆到平衡 +float LQR_K2 = 40; // +float LQR_K3 = 0.30; // + +float LQR_K1_1 = 200; //平衡态 +float LQR_K2_1 = 15; // +float LQR_K3_1 = 0.15; // + +/* +float LQR_K1 = 200; // +float LQR_K2 = 40; // +float LQR_K3 = 0.30; // +*/ +/*单角度稳定 + +float LQR_K1 = 80; //平衡完成 +float LQR_K2 = 15; // +float LQR_K3 = 0.15; // +*/ +float OFFSET = 0; +bool stable = 0, battery_low = 0; +uint32_t last_unstable_time; +//output=LQR_K1*PID+LQR_K2*p_vel + LQR_K3 * m_vel + +MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C); +PIDController angle_pid = PIDController(PID_P, PID_I, PID_D, balance_voltage * 0.7, 20000); +LowPassFilter lpf_throttle{0.00}; +// BLDC motor init +BLDCMotor motor = BLDCMotor(5); +// driver instance +BLDCDriver3PWM driver = BLDCDriver3PWM(9, 10, 11, 8, 3); +double rotationshift(double origin, double theta, double shift, bool y); +double acc2rotation(double x, double y); +float controllerLQR(float p_angle, float p_vel, float m_vel); +float constrainAngle(float x); + +// instantiate the commander +Commander command = Commander(Serial); +//void onp(char *cmd) { command.scalar(&PID_P, cmd); } +//void oni(char *cmd) { command.scalar(&PID_I, cmd); } +//void ond(char *cmd) { command.scalar(&PID_D, cmd); } +void onj(char *cmd) { command.scalar(&LQR_K1, cmd); } +void onk(char *cmd) { command.scalar(&LQR_K2, cmd); } +void onl(char *cmd) { command.scalar(&LQR_K3, cmd); } + +/********************************************************************************/ +void setup() +{ + Serial.begin(115200); + Wire.begin(); + + Wire.setClock(400000UL); // Set I2C frequency to 400kHz + Serial.println(((analogRead(A3) / 41.5))); + i2cData[0] = 7; // Set the sample rate to 1000Hz - 8kHz/(7+1) = 1000Hz + i2cData[1] = 0x00; // Disable FSYNC and set 260 Hz Acc filtering, 256 Hz Gyro filtering, 8 KHz sampling + i2cData[2] = 0x00; // Set Gyro Full Scale Range to ±250deg/s + i2cData[3] = 0x00; // Set Accelerometer Full Scale Range to ±2g + while (i2cWrite(0x19, i2cData, 4, false)) + ; // Write to all four registers at once + while (i2cWrite(0x6B, 0x01, true)) + ; // PLL with X axis gyroscope reference and disable sleep mode + + while (i2cRead(0x75, i2cData, 1)) + ; + if (i2cData[0] != 0x68) + { // Read "WHO_AM_I" register + Serial.print(F("Error reading sensor")); + while (1) + ; + } + + delay(100); // Wait for sensor to stabilize + + /* Set kalman and gyro starting angle */ + while (i2cRead(0x3B, i2cData, 6)) + ; + accX = (int16_t)((i2cData[0] << 8) | i2cData[1]); + accY = (int16_t)((i2cData[2] << 8) | i2cData[3]); + accZ = (int16_t)((i2cData[4] << 8) | i2cData[5]); + + // Source: http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf eq. 25 and eq. 26 + // atan2 outputs the value of -π to π (radians) - see http://en.wikipedia.org/wiki/Atan2 + // It is then converted from radians to degrees + // Eq. 25 and 26 + + double pitch = acc2rotation(accX, accY); + + kalmanZ.setAngle(pitch); + gyroZangle = pitch; + + timer = micros(); + + pinMode(4, OUTPUT); + digitalWrite(4, 1); + sensor.init(&Wire); + motor.linkSensor(&sensor); + // driver + driver.voltage_power_supply = 12; + driver.init(); + + // link the driver and the motor + motor.linkDriver(&driver); + + // aligning voltage + motor.voltage_sensor_align = 3; + + // choose FOC modulation (optional) + //motor.foc_modulation = FOCModulationType::SinePWM; + motor.foc_modulation = FOCModulationType::SpaceVectorPWM; + + // set control loop type to be used + motor.controller = MotionControlType::torque; + //motor.controller = TorqueControlType::voltage; + + motor.voltage_limit = balance_voltage; + + motor.useMonitoring(Serial); + // initialize motor + motor.init(); + // align encoder and start FOC + //motor.initFOC(4.5,Direction::CW); + //motor.initFOC(4.05, Direction::CCW); + motor.initFOC(); + //motor.initFOC(2.6492,Direction::CW); + //command.add('p', onp, "p"); + //command.add('i', oni, "i"); + //command.add('d', ond, "d"); + command.add('j', onj, "newj:"); + command.add('k', onk, "newk:"); + command.add('l', onl, "newl:"); + + digitalWrite(4, 0); +} +long loop_count = 0; +float target_voltage; +void loop() +{ + + motor.loopFOC(); + + if (loop_count++ == 10) + { + /* Update all the values */ + while (i2cRead(0x3B, i2cData, 14)) + ; + accX = (int16_t)((i2cData[0] << 8) | i2cData[1]); + accY = (int16_t)((i2cData[2] << 8) | i2cData[3]); + accZ = (int16_t)((i2cData[4] << 8) | i2cData[5]); + tempRaw = (int16_t)((i2cData[6] << 8) | i2cData[7]); + gyroX = (int16_t)((i2cData[8] << 8) | i2cData[9]); + gyroY = (int16_t)((i2cData[10] << 8) | i2cData[11]); + gyroZ = (int16_t)((i2cData[12] << 8) | i2cData[13]); + ; + + double dt = (double)(micros() - timer) / 1000000; // Calculate delta time + timer = micros(); + + // Source: http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf eq. 25 and eq. 26 + // atan2 outputs the value of -π to π (radians) - see http://en.wikipedia.org/wiki/Atan2 + // It is then converted from radians to degrees + // Eq. 25 and 26 + + double pitch = acc2rotation(accX, accY); + double gyroZrate = gyroZ / 131.0; // Convert to deg/s + + kalAngleZ = kalmanZ.getAngle(pitch, gyroZrate + gyroZ_OFF, dt); + + gyroZangle += (gyroZrate + gyroZ_OFF) * dt; + //gyroXangle += kalmanX.getRate() * dt; // Calculate gyro angle using the unbiased rate + //gyroYangle += kalmanY.getRate() * dt; + + compAngleZ = 0.93 * (compAngleZ + (gyroZrate + gyroZ_OFF) * dt) + 0.07 * pitch; + + // Reset the gyro angle when it has drifted too much + if (gyroZangle < -180 || gyroZangle > 180) + gyroZangle = kalAngleZ; + + /* Print Data */ +#if 0 // Set to 1 to activate + Serial.print(accX); Serial.print("\t"); + Serial.print(accY); Serial.print("\t"); + Serial.print(accZ); Serial.print("\t"); + + Serial.print(gyroX); Serial.print("\t"); + Serial.print(gyroY); Serial.print("\t"); + Serial.print(gyroZ); Serial.print("\t"); + + Serial.print("\t"); +#endif +#if 0 + Serial.print(pitch); + Serial.print("\t"); + Serial.print(gyroZangle); + Serial.print("\t"); + Serial.print(compAngleZ); + Serial.print("\t"); + Serial.print(kalAngleZ); + Serial.print("\t"); + + //Serial.print("\r\n"); +#endif + // calculate the pendulum angle + //LQR_K1 = analogRead(A3) / 10.0; + digitalWrite(3, 1); + //float pendulum_angle = constrainAngle(rotationshift(kalAngleZ * 3, 180.0, -180.0+OFFSET, 0.0) / 57.29578 + M_PI); + //float pendulum_angle = constrainAngle((kalAngleZ - stable_angle ) / 57.29578); + float pendulum_angle = constrainAngle((fmod(kalAngleZ * 3, 360.0) / 3.0 - stable_angle) / 57.29578); + if (abs(pendulum_angle) < 0.6) // if angle small enough stabilize 0.5~30°,1.5~90° + { + //target_voltage = controllerLQR(pendulum_angle, g.gyro.z, motor.shaftVelocity()); + + target_voltage = controllerLQR(angle_pid(pendulum_angle), gyroZrate / 57.29578, motor.shaftVelocity()); + + //digitalWrite(4, 1); + } + else // else do swing-up + { // sets 1.5V to the motor in order to swing up + target_voltage = -_sign(gyroZrate) * swing_up_voltage; + digitalWrite(4, 0); + } + + // set the target voltage to the motor + if (accZ < -13000 && ((accX * accX + accY * accY) > (14000 * 14000))) + { + motor.move(0); + } + else + { + motor.move(lpf_throttle(target_voltage)); + } + command.run(); + // restart the counter + loop_count = 0; + //Serial.print("kangle:"); + driver.voltage_power_supply = analogRead(A3) / 41.5; + //Serial.println(driver.voltage_power_supply); + if ((analogRead(A3) / 41.5) < min_voltage && !battery_low) + { + battery_low = 1; + Serial.println("battery_low!!"); + while (battery_low) + { + motor.loopFOC(); + motor.move(0); + if (millis() % 500 < 250) + digitalWrite(4, 1); + else + digitalWrite(4, 0); + } + } + //Serial.print(",fangle:"); + //Serial.print(constrainAngle(rotationshift(kalAngleZ * 3, 180.0, -180.0+OFFSET, 0.0) / 57.29578 + M_PI)); + + //Serial.println(fmod(kalAngleZ * 3, 360.0) / 3.0); + //Serial.print(",pid:"); + //Serial.println(accX); + //Serial.print(angle_pid(pendulum_angle)); + //Serial.print(",voltage:"); + //Serial.print(target_voltage); + //Serial.print(",lpf_throttle:"); + //Serial.println(lpf_throttle(target_voltage)); + //Serial.print(",E_gle:"); + //Serial.print(sensor.getAngle()); + //Serial.print(",vel:"); + //Serial.println(sensor.getVelocity()); + } + + + + +} + +// function constraining the angle in between -pi and pi, in degrees -180 and 180 +float constrainAngle(float x) +{ + x = fmod(x + M_PI, _2PI); + if (x < 0) + x += _2PI; + return x - M_PI; +} +// LQR stabilization controller functions +// calculating the voltage that needs to be set to the motor in order to stabilize the pendulum +float controllerLQR(float p_angle, float p_vel, float m_vel) +{ + // if angle controllable + // calculate the control law + // LQR controller u = k*x + // - k = [40, 7, 0.3] + // - k = [13.3, 21, 0.3] + // - x = [pendulum angle, pendulum velocity, motor velocity]' + if (abs(p_angle) > 0.05) + { + last_unstable_time = millis(); + stable = 0; + digitalWrite(4, 0); + } + if ((millis() - last_unstable_time) > 1000) + { + stable = 1; + digitalWrite(4, 1); + } + + //Serial.println(stable); + float u; + if (!stable) + { + u = LQR_K1 * p_angle + LQR_K2 * p_vel + LQR_K3 * m_vel; + } + else + { + //u = LQR_K1 * p_angle + LQR_K2 * p_vel + LQR_K3 * m_vel; + u = LQR_K1_1 * p_angle + LQR_K2_1 * p_vel + LQR_K3_1 * m_vel; + } + + // limit the voltage set to the motor + if (abs(u) > motor.voltage_limit * 0.7) + u = _sign(u) * motor.voltage_limit * 0.7; + + return u; +} +/* mpu6050加速度转换为角度 + acc2rotation(ax, ay) + acc2rotation(az, ay) */ +double acc2rotation(double x, double y) +{ + if (y < 0) + { + return atan(x / y) / 1.570796 * 90 + 180; + } + else if (x < 0) + { + return (atan(x / y) / 1.570796 * 90 + 360); + } + else + { + return (atan(x / y) / 1.570796 * 90); + } +} + +/* mpu6050加速度转换为角度 + rotationshift(original angle,+θ,shiftθ,0 is normal,1 is reverse) + rotationshift(0,30)=30 + rotationshift(20,30)=50 + rotationshift(0,30,1)=330 + rotationshift(20,30,1)=310 + rotationshift(0,0,-180,0)=-180 +*/ +double rotationshift(double origin, double theta, double shift = 0, bool y = false) +{ + static float origin_old; + if (abs(origin - origin_old) > 0.1) + origin_old += _sign(origin - origin_old) * 0.01; + else + origin_old = origin; + + if (y == 0) + { + if (origin + theta > 360) + return origin + theta - 360 + shift; + else + { + return origin + theta + shift; + } + } + else + { + + if (-(origin + theta) + 360 < 0) + return -(origin + theta) + 360 + 360 + shift; + else + { + return -(origin + theta) + 360 + shift; + } + } +} diff --git a/物料清单.xlsx b/物料清单.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c5e90b7dedba23a8704c68977897f28fcd8b6d21 GIT binary patch literal 16394 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