mirror of
https://github.com/okalachev/flix.git
synced 2026-06-28 14:06:32 +00:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c68be57e15 | |||
| 16567cdb44 | |||
| 385226bc97 | |||
| e7e57d1020 | |||
| 213b9788a9 | |||
| 69fb5d30f6 | |||
| e59a190c1c | |||
| 207c0e41f7 | |||
| d7d79ff03f | |||
| 6725f1d3de |
@@ -76,11 +76,6 @@ jobs:
|
|||||||
run: sudo apt-get install -y libsdl2-dev
|
run: sudo apt-get install -y libsdl2-dev
|
||||||
- name: Build simulator
|
- name: Build simulator
|
||||||
run: make build_simulator
|
run: make build_simulator
|
||||||
- name: Run simulator
|
|
||||||
env:
|
|
||||||
GAZEBO_MODEL_PATH: ${{ github.workspace }}/gazebo/models
|
|
||||||
GAZEBO_PLUGIN_PATH: ${{ github.workspace }}/gazebo/build
|
|
||||||
run: timeout --preserve-status 120 gzserver --verbose gazebo/flix.world || [ $? -eq 143 ]
|
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: gazebo-plugin-binary
|
name: gazebo-plugin-binary
|
||||||
|
|||||||
Vendored
+3
-45
@@ -17,21 +17,7 @@
|
|||||||
"forcedInclude": [
|
"forcedInclude": [
|
||||||
"${workspaceFolder}/.vscode/intellisense.h",
|
"${workspaceFolder}/.vscode/intellisense.h",
|
||||||
"~/.arduino15/packages/esp32/hardware/esp32/3.3.6/cores/esp32/Arduino.h",
|
"~/.arduino15/packages/esp32/hardware/esp32/3.3.6/cores/esp32/Arduino.h",
|
||||||
"~/.arduino15/packages/esp32/hardware/esp32/3.3.6/variants/d1_mini32/pins_arduino.h",
|
"~/.arduino15/packages/esp32/hardware/esp32/3.3.6/variants/d1_mini32/pins_arduino.h"
|
||||||
"${workspaceFolder}/flix/cli.ino",
|
|
||||||
"${workspaceFolder}/flix/control.ino",
|
|
||||||
"${workspaceFolder}/flix/estimate.ino",
|
|
||||||
"${workspaceFolder}/flix/flix.ino",
|
|
||||||
"${workspaceFolder}/flix/imu.ino",
|
|
||||||
"${workspaceFolder}/flix/led.ino",
|
|
||||||
"${workspaceFolder}/flix/log.ino",
|
|
||||||
"${workspaceFolder}/flix/mavlink.ino",
|
|
||||||
"${workspaceFolder}/flix/motors.ino",
|
|
||||||
"${workspaceFolder}/flix/rc.ino",
|
|
||||||
"${workspaceFolder}/flix/time.ino",
|
|
||||||
"${workspaceFolder}/flix/wifi.ino",
|
|
||||||
"${workspaceFolder}/flix/parameters.ino",
|
|
||||||
"${workspaceFolder}/flix/safety.ino"
|
|
||||||
],
|
],
|
||||||
"compilerPath": "~/.arduino15/packages/esp32/tools/esp-x32/2511/bin/xtensa-esp32-elf-g++",
|
"compilerPath": "~/.arduino15/packages/esp32/tools/esp-x32/2511/bin/xtensa-esp32-elf-g++",
|
||||||
"cStandard": "c11",
|
"cStandard": "c11",
|
||||||
@@ -64,21 +50,7 @@
|
|||||||
"forcedInclude": [
|
"forcedInclude": [
|
||||||
"${workspaceFolder}/.vscode/intellisense.h",
|
"${workspaceFolder}/.vscode/intellisense.h",
|
||||||
"~/Library/Arduino15/packages/esp32/hardware/esp32/3.3.6/cores/esp32/Arduino.h",
|
"~/Library/Arduino15/packages/esp32/hardware/esp32/3.3.6/cores/esp32/Arduino.h",
|
||||||
"~/Library/Arduino15/packages/esp32/hardware/esp32/3.3.6/variants/d1_mini32/pins_arduino.h",
|
"~/Library/Arduino15/packages/esp32/hardware/esp32/3.3.6/variants/d1_mini32/pins_arduino.h"
|
||||||
"${workspaceFolder}/flix/flix.ino",
|
|
||||||
"${workspaceFolder}/flix/cli.ino",
|
|
||||||
"${workspaceFolder}/flix/control.ino",
|
|
||||||
"${workspaceFolder}/flix/estimate.ino",
|
|
||||||
"${workspaceFolder}/flix/imu.ino",
|
|
||||||
"${workspaceFolder}/flix/led.ino",
|
|
||||||
"${workspaceFolder}/flix/log.ino",
|
|
||||||
"${workspaceFolder}/flix/mavlink.ino",
|
|
||||||
"${workspaceFolder}/flix/motors.ino",
|
|
||||||
"${workspaceFolder}/flix/rc.ino",
|
|
||||||
"${workspaceFolder}/flix/time.ino",
|
|
||||||
"${workspaceFolder}/flix/wifi.ino",
|
|
||||||
"${workspaceFolder}/flix/parameters.ino",
|
|
||||||
"${workspaceFolder}/flix/safety.ino"
|
|
||||||
],
|
],
|
||||||
"compilerPath": "~/Library/Arduino15/packages/esp32/tools/esp-x32/2511/bin/xtensa-esp32-elf-g++",
|
"compilerPath": "~/Library/Arduino15/packages/esp32/tools/esp-x32/2511/bin/xtensa-esp32-elf-g++",
|
||||||
"cStandard": "c11",
|
"cStandard": "c11",
|
||||||
@@ -112,21 +84,7 @@
|
|||||||
"forcedInclude": [
|
"forcedInclude": [
|
||||||
"${workspaceFolder}/.vscode/intellisense.h",
|
"${workspaceFolder}/.vscode/intellisense.h",
|
||||||
"~/AppData/Local/Arduino15/packages/esp32/hardware/esp32/3.3.6/cores/esp32/Arduino.h",
|
"~/AppData/Local/Arduino15/packages/esp32/hardware/esp32/3.3.6/cores/esp32/Arduino.h",
|
||||||
"~/AppData/Local/Arduino15/packages/esp32/hardware/esp32/3.3.6/variants/d1_mini32/pins_arduino.h",
|
"~/AppData/Local/Arduino15/packages/esp32/hardware/esp32/3.3.6/variants/d1_mini32/pins_arduino.h"
|
||||||
"${workspaceFolder}/flix/cli.ino",
|
|
||||||
"${workspaceFolder}/flix/control.ino",
|
|
||||||
"${workspaceFolder}/flix/estimate.ino",
|
|
||||||
"${workspaceFolder}/flix/flix.ino",
|
|
||||||
"${workspaceFolder}/flix/imu.ino",
|
|
||||||
"${workspaceFolder}/flix/led.ino",
|
|
||||||
"${workspaceFolder}/flix/log.ino",
|
|
||||||
"${workspaceFolder}/flix/mavlink.ino",
|
|
||||||
"${workspaceFolder}/flix/motors.ino",
|
|
||||||
"${workspaceFolder}/flix/rc.ino",
|
|
||||||
"${workspaceFolder}/flix/time.ino",
|
|
||||||
"${workspaceFolder}/flix/wifi.ino",
|
|
||||||
"${workspaceFolder}/flix/parameters.ino",
|
|
||||||
"${workspaceFolder}/flix/safety.ino"
|
|
||||||
],
|
],
|
||||||
"compilerPath": "~/AppData/Local/Arduino15/packages/esp32/tools/esp-x32/2511/bin/xtensa-esp32-elf-g++.exe",
|
"compilerPath": "~/AppData/Local/Arduino15/packages/esp32/tools/esp-x32/2511/bin/xtensa-esp32-elf-g++.exe",
|
||||||
"cStandard": "c11",
|
"cStandard": "c11",
|
||||||
|
|||||||
@@ -47,14 +47,6 @@ See the [user builds gallery](docs/user.md):
|
|||||||
|
|
||||||
<a href="docs/user.md"><img src="docs/img/user/user.jpg" width=500></a>
|
<a href="docs/user.md"><img src="docs/img/user/user.jpg" width=500></a>
|
||||||
|
|
||||||
### PCB
|
|
||||||
|
|
||||||
The official PCB *(Flix2)* is in development now. Follow the [project's channel](https://t.me/opensourcequadcopter) to track the progress.
|
|
||||||
|
|
||||||
Outdoor flights demo video of the current prototype:
|
|
||||||
|
|
||||||
<a href="https://youtu.be/KXlNmvUTi4g"><img width=300 src="https://i3.ytimg.com/vi/KXlNmvUTi4g/maxresdefault.jpg"></a>
|
|
||||||
|
|
||||||
## Simulation
|
## Simulation
|
||||||
|
|
||||||
The simulator is implemented using Gazebo and runs the original Arduino code:
|
The simulator is implemented using Gazebo and runs the original Arduino code:
|
||||||
@@ -81,7 +73,7 @@ Additional articles:
|
|||||||
|-|-|:-:|:-:|
|
|-|-|:-:|:-:|
|
||||||
|Microcontroller board|ESP32 Mini.<br>ESP32-S3/ESP32-C3 boards are also supported.|<img src="docs/img/esp32.jpg" width=100>|1|
|
|Microcontroller board|ESP32 Mini.<br>ESP32-S3/ESP32-C3 boards are also supported.|<img src="docs/img/esp32.jpg" width=100>|1|
|
||||||
|IMU (and barometer¹) board|GY‑91, MPU-9265 (or other MPU‑9250/MPU‑6500 board)<br>ICM20948V2 (ICM‑20948)<br>GY-521 (MPU-6050)|<img src="docs/img/gy-91.jpg" width=90 align=center><br><img src="docs/img/icm-20948.jpg" width=100><br><img src="docs/img/gy-521.jpg" width=100>|1|
|
|IMU (and barometer¹) board|GY‑91, MPU-9265 (or other MPU‑9250/MPU‑6500 board)<br>ICM20948V2 (ICM‑20948)<br>GY-521 (MPU-6050)|<img src="docs/img/gy-91.jpg" width=90 align=center><br><img src="docs/img/icm-20948.jpg" width=100><br><img src="docs/img/gy-521.jpg" width=100>|1|
|
||||||
|*Boost converter (optional, for more stable power supply)*|*5V output*|<img src="docs/img/buck-boost.jpg" width=100>|1|
|
|Boost converter (optional, for more stable power supply)|5V output|<img src="docs/img/buck-boost.jpg" width=100>|1|
|
||||||
|Motor|8520 3.7V brushed motor.<br>Motor with exact 3.7V voltage is needed, not ranged working voltage (3.7V — 6V).<br>Make sure the motor shaft diameter and propeller hole diameter match!|<img src="docs/img/motor.jpeg" width=100>|4|
|
|Motor|8520 3.7V brushed motor.<br>Motor with exact 3.7V voltage is needed, not ranged working voltage (3.7V — 6V).<br>Make sure the motor shaft diameter and propeller hole diameter match!|<img src="docs/img/motor.jpeg" width=100>|4|
|
||||||
|Propeller|55 mm or 65 mm|<img src="docs/img/prop.jpg" width=100>|4|
|
|Propeller|55 mm or 65 mm|<img src="docs/img/prop.jpg" width=100>|4|
|
||||||
|MOSFET (transistor)|100N03A or [analog](https://t.me/opensourcequadcopter/33)|<img src="docs/img/100n03a.jpg" width=100>|4|
|
|MOSFET (transistor)|100N03A or [analog](https://t.me/opensourcequadcopter/33)|<img src="docs/img/100n03a.jpg" width=100>|4|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
Do the following:
|
Do the following:
|
||||||
|
|
||||||
* **Check ESP32 core is installed**. Check if the version matches the one used in the [tutorial](usage.md#building-the-firmware).
|
* **Check ESP32 core is installed**. Check if the version matches the one used in the [tutorial](usage.md#building-the-firmware).
|
||||||
* **Check libraries**. Install all the required libraries from the tutorial. Make sure there are no MPU-9250 or other peripherals libraries that may conflict with the ones used in the tutorial.
|
* **Check libraries**. Install all the required libraries from the tutorial. Make sure there are no MPU9250 or other peripherals libraries that may conflict with the ones used in the tutorial.
|
||||||
* **Check the chosen board**. The correct board to choose in Arduino IDE for ESP32 Mini is *WEMOS D1 MINI ESP32*.
|
* **Check the chosen board**. The correct board to choose in Arduino IDE for ESP32 Mini is *WEMOS D1 MINI ESP32*.
|
||||||
|
|
||||||
## The drone doesn't fly
|
## The drone doesn't fly
|
||||||
|
|||||||
+1
-1
@@ -329,7 +329,7 @@ To setup ESP-NOW communication:
|
|||||||
espnow 7a:c8:e3:eb:bf:e9 &PiuSysxP9+$L&5E
|
espnow 7a:c8:e3:eb:bf:e9 &PiuSysxP9+$L&5E
|
||||||
```
|
```
|
||||||
|
|
||||||
Run this line as a console command on each drone you want to bind to this proxy board. [The maximum number](https://github.com/espressif/esp-idf/blob/e95cab4be8fd293e3f3323181e7a2280874da6f7/components/esp_wifi/include/esp_now.h#L32-L33) of simultaneously connected drones is 20 (unencrypted) io 6 (encrypted).
|
Run this line as a console command on each drone you want to bind to this proxy board.
|
||||||
|
|
||||||
3. Set the `WIFI_MODE` parameter to `3` on the drone:
|
3. Set the `WIFI_MODE` parameter to `3` on the drone:
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
// Implementation of command line interface
|
// Implementation of command line interface
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "flix.h"
|
||||||
#include "pid.h"
|
#include "pid.h"
|
||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
@@ -76,7 +78,7 @@ void pause(float duration) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void doCommand(String str, bool echo = false) {
|
void doCommand(String str, bool echo) {
|
||||||
// parse command
|
// parse command
|
||||||
String command, arg0, arg1;
|
String command, arg0, arg1;
|
||||||
splitString(str, command, arg0, arg1);
|
splitString(str, command, arg0, arg1);
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
// Wi-Fi
|
||||||
|
#define WIFI_ENABLED 1
|
||||||
|
#define WIFI_SSID "flix"
|
||||||
|
#define WIFI_PASSWORD "flixwifi"
|
||||||
|
#define WIFI_UDP_PORT 14550
|
||||||
|
#define WIFI_UDP_REMOTE_PORT 14550
|
||||||
|
#define WIFI_UDP_REMOTE_ADDR "255.255.255.255"
|
||||||
|
|
||||||
|
// Motors
|
||||||
|
#define MOTOR_0_PIN 12 // rear left
|
||||||
|
#define MOTOR_1_PIN 13 // rear right
|
||||||
|
#define MOTOR_2_PIN 14 // front right
|
||||||
|
#define MOTOR_3_PIN 15 // front left
|
||||||
|
#define PWM_FREQUENCY 78000
|
||||||
|
#define PWM_RESOLUTION 10
|
||||||
|
#define PWM_STOP 0
|
||||||
|
#define PWM_MIN 0
|
||||||
|
#define PWM_MAX 1000000 / PWM_FREQUENCY
|
||||||
|
|
||||||
|
// Control
|
||||||
|
#define PITCHRATE_P 0.05
|
||||||
|
#define PITCHRATE_I 0.2
|
||||||
|
#define PITCHRATE_D 0.001
|
||||||
|
#define PITCHRATE_I_LIM 0.3
|
||||||
|
#define ROLLRATE_P PITCHRATE_P
|
||||||
|
#define ROLLRATE_I PITCHRATE_I
|
||||||
|
#define ROLLRATE_D PITCHRATE_D
|
||||||
|
#define ROLLRATE_I_LIM PITCHRATE_I_LIM
|
||||||
|
#define YAWRATE_P 0.3
|
||||||
|
#define YAWRATE_I 0.0
|
||||||
|
#define YAWRATE_D 0.0
|
||||||
|
#define YAWRATE_I_LIM 0.3
|
||||||
|
#define ROLL_P 6
|
||||||
|
#define ROLL_I 0
|
||||||
|
#define ROLL_D 0
|
||||||
|
#define PITCH_P ROLL_P
|
||||||
|
#define PITCH_I ROLL_I
|
||||||
|
#define PITCH_D ROLL_D
|
||||||
|
#define YAW_P 3
|
||||||
|
#define PITCHRATE_MAX radians(360)
|
||||||
|
#define ROLLRATE_MAX radians(360)
|
||||||
|
#define YAWRATE_MAX radians(300)
|
||||||
|
#define TILT_MAX radians(30)
|
||||||
|
#define RATES_D_LPF_ALPHA 0.2 // cutoff frequency ~ 40 Hz
|
||||||
|
|
||||||
|
// Estimation
|
||||||
|
#define WEIGHT_ACC 0.003
|
||||||
|
#define RATES_LFP_ALPHA 0.2 // cutoff frequency ~ 40 Hz
|
||||||
|
|
||||||
|
// MAVLink
|
||||||
|
#define SYSTEM_ID 1
|
||||||
|
|
||||||
|
// Safety
|
||||||
|
#define RC_LOSS_TIMEOUT 1
|
||||||
|
#define DESCEND_TIME 10
|
||||||
@@ -3,38 +3,16 @@
|
|||||||
|
|
||||||
// Flight control
|
// Flight control
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "flix.h"
|
||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
#include "quaternion.h"
|
#include "quaternion.h"
|
||||||
#include "pid.h"
|
#include "pid.h"
|
||||||
#include "lpf.h"
|
#include "lpf.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
#define PITCHRATE_P 0.05
|
extern const int RAW = 0, ACRO = 1, STAB = 2, AUTO = 3; // flight modes
|
||||||
#define PITCHRATE_I 0.2
|
|
||||||
#define PITCHRATE_D 0.001
|
|
||||||
#define PITCHRATE_I_LIM 0.3
|
|
||||||
#define ROLLRATE_P PITCHRATE_P
|
|
||||||
#define ROLLRATE_I PITCHRATE_I
|
|
||||||
#define ROLLRATE_D PITCHRATE_D
|
|
||||||
#define ROLLRATE_I_LIM PITCHRATE_I_LIM
|
|
||||||
#define YAWRATE_P 0.3
|
|
||||||
#define YAWRATE_I 0.0
|
|
||||||
#define YAWRATE_D 0.0
|
|
||||||
#define YAWRATE_I_LIM 0.3
|
|
||||||
#define ROLL_P 6
|
|
||||||
#define ROLL_I 0
|
|
||||||
#define ROLL_D 0
|
|
||||||
#define PITCH_P ROLL_P
|
|
||||||
#define PITCH_I ROLL_I
|
|
||||||
#define PITCH_D ROLL_D
|
|
||||||
#define YAW_P 3
|
|
||||||
#define PITCHRATE_MAX radians(360)
|
|
||||||
#define ROLLRATE_MAX radians(360)
|
|
||||||
#define YAWRATE_MAX radians(300)
|
|
||||||
#define TILT_MAX radians(30)
|
|
||||||
#define RATES_D_LPF_ALPHA 0.2 // cutoff frequency ~ 40 Hz
|
|
||||||
|
|
||||||
const int RAW = 0, ACRO = 1, STAB = 2, AUTO = 3; // flight modes
|
|
||||||
int mode = STAB;
|
int mode = STAB;
|
||||||
bool armed = false;
|
bool armed = false;
|
||||||
|
|
||||||
@@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
// Attitude estimation using gyro and accelerometer
|
// Attitude estimation using gyro and accelerometer
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "flix.h"
|
||||||
#include "quaternion.h"
|
#include "quaternion.h"
|
||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
#include "lpf.h"
|
#include "lpf.h"
|
||||||
+95
@@ -0,0 +1,95 @@
|
|||||||
|
// Copyright (c) 2023 Oleg Kalachev <okalachev@gmail.com>
|
||||||
|
// Repository: https://github.com/okalachev/flix
|
||||||
|
|
||||||
|
// All-in-one header file
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "vector.h"
|
||||||
|
#include "quaternion.h"
|
||||||
|
|
||||||
|
extern float t, dt;
|
||||||
|
extern float loopRate;
|
||||||
|
extern float controlRoll, controlPitch, controlYaw, controlThrottle, controlMode;
|
||||||
|
extern Vector gyro, acc;
|
||||||
|
extern Vector rates;
|
||||||
|
extern Quaternion attitude;
|
||||||
|
extern bool landed;
|
||||||
|
extern int mode;
|
||||||
|
extern bool armed;
|
||||||
|
extern Quaternion attitudeTarget;
|
||||||
|
extern Vector ratesTarget, ratesExtra, torqueTarget;
|
||||||
|
extern float thrustTarget;
|
||||||
|
extern float motors[4];
|
||||||
|
|
||||||
|
void print(const char* format, ...);
|
||||||
|
void pause(float duration);
|
||||||
|
void doCommand(String str, bool echo = false);
|
||||||
|
void handleInput();
|
||||||
|
void control();
|
||||||
|
void interpretControls();
|
||||||
|
void controlAttitude();
|
||||||
|
void controlRates();
|
||||||
|
void controlTorque();
|
||||||
|
void desaturate(float& a, float& b, float& c, float& d);
|
||||||
|
const char *getModeName();
|
||||||
|
void estimate();
|
||||||
|
void applyGyro();
|
||||||
|
void applyAcc();
|
||||||
|
void applyLevel();
|
||||||
|
void setupIMU();
|
||||||
|
void configureIMU();
|
||||||
|
void readIMU();
|
||||||
|
void rotateIMU(Vector& data);
|
||||||
|
void calibrateGyroOnce();
|
||||||
|
void calibrateAccel();
|
||||||
|
void calibrateAccelOnce();
|
||||||
|
void printIMUCalibration();
|
||||||
|
void printIMUInfo();
|
||||||
|
void setupLED();
|
||||||
|
void setLED(bool on);
|
||||||
|
void blinkLED();
|
||||||
|
void prepareLogData();
|
||||||
|
void logData();
|
||||||
|
void printLogHeader();
|
||||||
|
void printLogData();
|
||||||
|
void processMavlink();
|
||||||
|
void sendMavlink();
|
||||||
|
void sendMessage(const void *msg);
|
||||||
|
void receiveMavlink();
|
||||||
|
void printWiFiInfo();
|
||||||
|
void configWiFi(int mode, const char *first, const char *second);
|
||||||
|
void handleMavlink(const void *_msg);
|
||||||
|
void mavlinkPrint(const char* str);
|
||||||
|
void sendMavlinkPrint();
|
||||||
|
void setupMotors();
|
||||||
|
int getDutyCycle(float value);
|
||||||
|
void sendMotors();
|
||||||
|
bool motorsActive();
|
||||||
|
void testMotor(int n);
|
||||||
|
void setupParameters();
|
||||||
|
int parametersCount();
|
||||||
|
const char *getParameterName(int index);
|
||||||
|
float getParameter(int index);
|
||||||
|
float getParameter(const char *name);
|
||||||
|
bool setParameter(const char *name, const float value);
|
||||||
|
void syncParameters();
|
||||||
|
void printParameters();
|
||||||
|
void resetParameters();
|
||||||
|
void setupRC();
|
||||||
|
bool readRC();
|
||||||
|
void normalizeRC();
|
||||||
|
void calibrateRC();
|
||||||
|
void calibrateRCChannel(int *channel, uint16_t in[16], uint16_t out[16], const char *str);
|
||||||
|
void printRCCalibration();
|
||||||
|
void setupPower();
|
||||||
|
void failsafe();
|
||||||
|
void rcLossFailsafe();
|
||||||
|
void descend();
|
||||||
|
void autoFailsafe();
|
||||||
|
void step();
|
||||||
|
void computeLoopRate();
|
||||||
|
void setupWiFi();
|
||||||
|
void sendWiFi(const uint8_t *buf, int len);
|
||||||
|
int receiveWiFi(uint8_t *buf, int len);
|
||||||
+2
-8
@@ -3,17 +3,11 @@
|
|||||||
|
|
||||||
// Main firmware file
|
// Main firmware file
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
#include "quaternion.h"
|
#include "quaternion.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "flix.h"
|
||||||
extern float t, dt;
|
|
||||||
extern float controlRoll, controlPitch, controlYaw, controlThrottle, controlMode;
|
|
||||||
extern Vector gyro, acc;
|
|
||||||
extern Vector rates;
|
|
||||||
extern Quaternion attitude;
|
|
||||||
extern bool landed;
|
|
||||||
extern float motors[4];
|
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
// Board's LED control
|
// Board's LED control
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
#define BLINK_PERIOD 500000
|
#define BLINK_PERIOD 500000
|
||||||
|
|
||||||
#ifndef LED_BUILTIN
|
#ifndef LED_BUILTIN
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
// In-RAM logging
|
// In-RAM logging
|
||||||
|
|
||||||
|
#include "flix.h"
|
||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
template <typename T> // Using template to make the filter usable for scalar and vector values
|
template <typename T> // Using template to make the filter usable for scalar and vector values
|
||||||
class LowPassFilter {
|
class LowPassFilter {
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -3,18 +3,22 @@
|
|||||||
|
|
||||||
// MAVLink communication
|
// MAVLink communication
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
#include <MAVLink.h>
|
#include <MAVLink.h>
|
||||||
|
#include "config.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
extern const int RAW, ACRO, STAB, AUTO;
|
||||||
extern float controlTime;
|
extern float controlTime;
|
||||||
extern float voltage;
|
extern float voltage;
|
||||||
|
extern uint16_t channels[16];
|
||||||
|
|
||||||
int mavlinkSysId = 1;
|
int mavlinkSysId = 1;
|
||||||
Rate telemetryFast(10);
|
Rate telemetryFast(10);
|
||||||
Rate telemetrySlow(2);
|
Rate telemetrySlow(2);
|
||||||
|
|
||||||
bool mavlinkConnected = false;
|
bool mavlinkConnected = false;
|
||||||
String mavlinkPrintBuffer;
|
static String mavlinkPrintBuffer;
|
||||||
|
|
||||||
void processMavlink() {
|
void processMavlink() {
|
||||||
sendMavlink();
|
sendMavlink();
|
||||||
@@ -41,7 +45,7 @@ void sendMavlink() {
|
|||||||
MAV_VTOL_STATE_UNDEFINED, landed ? MAV_LANDED_STATE_ON_GROUND : MAV_LANDED_STATE_IN_AIR);
|
MAV_VTOL_STATE_UNDEFINED, landed ? MAV_LANDED_STATE_ON_GROUND : MAV_LANDED_STATE_IN_AIR);
|
||||||
sendMessage(&msg);
|
sendMessage(&msg);
|
||||||
|
|
||||||
uint16_t voltages[] = {(uint16_t)(voltage * 1000), UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX};
|
uint16_t voltages[] = {voltage * 1000, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX};
|
||||||
uint16_t voltagesExt[] = {0, 0, 0, 0};
|
uint16_t voltagesExt[] = {0, 0, 0, 0};
|
||||||
float remaining = constrain(mapf(voltage, 3.4, 4.2, 0, 1), 0, 1);
|
float remaining = constrain(mapf(voltage, 3.4, 4.2, 0, 1), 0, 1);
|
||||||
mavlink_msg_battery_status_pack(mavlinkSysId, MAV_COMP_ID_AUTOPILOT1, &msg, 0, MAV_BATTERY_FUNCTION_ALL,
|
mavlink_msg_battery_status_pack(mavlinkSysId, MAV_COMP_ID_AUTOPILOT1, &msg, 0, MAV_BATTERY_FUNCTION_ALL,
|
||||||
@@ -211,6 +215,7 @@ void handleMavlink(const void *_msg) {
|
|||||||
armed = motors[0] > 0 || motors[1] > 0 || motors[2] > 0 || motors[3] > 0;
|
armed = motors[0] > 0 || motors[1] > 0 || motors[2] > 0 || motors[3] > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO:
|
||||||
if (msg.msgid == MAVLINK_MSG_ID_LOG_REQUEST_DATA) {
|
if (msg.msgid == MAVLINK_MSG_ID_LOG_REQUEST_DATA) {
|
||||||
mavlink_log_request_data_t m;
|
mavlink_log_request_data_t m;
|
||||||
mavlink_msg_log_request_data_decode(&msg, &m);
|
mavlink_msg_log_request_data_decode(&msg, &m);
|
||||||
@@ -224,6 +229,7 @@ void handleMavlink(const void *_msg) {
|
|||||||
sendMessage(&msg);
|
sendMessage(&msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// Handle commands
|
// Handle commands
|
||||||
if (msg.msgid == MAVLINK_MSG_ID_COMMAND_LONG) {
|
if (msg.msgid == MAVLINK_MSG_ID_COMMAND_LONG) {
|
||||||
@@ -241,7 +247,7 @@ void handleMavlink(const void *_msg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m.command == MAV_CMD_COMPONENT_ARM_DISARM) {
|
if (m.command == MAV_CMD_COMPONENT_ARM_DISARM) {
|
||||||
if (m.param1 == 1 && controlThrottle > 0.05) return; // don't arm if throttle is not low
|
if (m.param1 && controlThrottle > 0.05) return; // don't arm if throttle is not low
|
||||||
accepted = true;
|
accepted = true;
|
||||||
armed = m.param1 == 1;
|
armed = m.param1 == 1;
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,9 @@
|
|||||||
|
|
||||||
// PWM control for motors
|
// PWM control for motors
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include "config.h"
|
||||||
|
#include "flix.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
float motors[4]; // normalized motor thrusts in range [0..1]
|
float motors[4]; // normalized motor thrusts in range [0..1]
|
||||||
@@ -14,7 +17,7 @@ int pwmStop = 0;
|
|||||||
int pwmMin = 0;
|
int pwmMin = 0;
|
||||||
int pwmMax = -1; // -1 means duty cycle mode
|
int pwmMax = -1; // -1 means duty cycle mode
|
||||||
|
|
||||||
const int MOTOR_REAR_LEFT = 0, MOTOR_REAR_RIGHT = 1, MOTOR_FRONT_RIGHT = 2, MOTOR_FRONT_LEFT = 3;
|
extern const int MOTOR_REAR_LEFT = 0, MOTOR_REAR_RIGHT = 1, MOTOR_FRONT_RIGHT = 2, MOTOR_FRONT_LEFT = 3;
|
||||||
|
|
||||||
void setupMotors() {
|
void setupMotors() {
|
||||||
print("Setup Motors\n");
|
print("Setup Motors\n");
|
||||||
@@ -4,15 +4,32 @@
|
|||||||
// Parameters storage in flash memory
|
// Parameters storage in flash memory
|
||||||
|
|
||||||
#include <Preferences.h>
|
#include <Preferences.h>
|
||||||
|
#include "flix.h"
|
||||||
|
#include "pid.h"
|
||||||
|
#include "lpf.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
extern int channelZero[16], channelMax[16];
|
extern float channelZero[16], channelMax[16];
|
||||||
extern int rollChannel, pitchChannel, throttleChannel, yawChannel, armedChannel, modeChannel;
|
extern float rollChannel, pitchChannel, throttleChannel, yawChannel, armedChannel, modeChannel;
|
||||||
|
extern float tiltMax;
|
||||||
|
extern int flightModes[3];
|
||||||
|
extern PID rollPID, pitchPID, yawPID;
|
||||||
|
extern PID rollRatePID, pitchRatePID, yawRatePID;
|
||||||
|
extern Vector maxRate;
|
||||||
|
extern Vector imuRotation;
|
||||||
|
extern Vector accBias, accScale;
|
||||||
|
extern float accWeight, levelWeight;
|
||||||
|
extern LowPassFilter<Vector> gyroBiasFilter, ratesFilter, voltageFilter;
|
||||||
extern int rcRxPin, voltagePin;
|
extern int rcRxPin, voltagePin;
|
||||||
|
extern int motorPins[4];
|
||||||
|
extern int pwmFrequency, pwmResolution, pwmStop, pwmMin, pwmMax;
|
||||||
extern int wifiMode, wifiLongRange, udpLocalPort, udpRemotePort, espnowChannel;
|
extern int wifiMode, wifiLongRange, udpLocalPort, udpRemotePort, espnowChannel;
|
||||||
|
extern int mavlinkSysId;
|
||||||
|
extern Rate telemetrySlow, telemetryFast;
|
||||||
extern float rcLossTimeout, descendTime;
|
extern float rcLossTimeout, descendTime;
|
||||||
|
extern int voltagePin;
|
||||||
extern float voltageScale;
|
extern float voltageScale;
|
||||||
extern LowPassFilter<float> voltageFilter;
|
extern const int MOTOR_REAR_LEFT, MOTOR_REAR_RIGHT, MOTOR_FRONT_RIGHT, MOTOR_FRONT_LEFT;
|
||||||
|
|
||||||
Preferences storage;
|
Preferences storage;
|
||||||
|
|
||||||
@@ -28,7 +45,7 @@ struct Parameter {
|
|||||||
void setValue(const float value) { if (integer) *i = value; else *f = value; };
|
void setValue(const float value) { if (integer) *i = value; else *f = value; };
|
||||||
};
|
};
|
||||||
|
|
||||||
Parameter parameters[] = {
|
static Parameter parameters[] = {
|
||||||
// control
|
// control
|
||||||
{"CTL_R_RATE_P", &rollRatePID.p},
|
{"CTL_R_RATE_P", &rollRatePID.p},
|
||||||
{"CTL_R_RATE_I", &rollRatePID.i},
|
{"CTL_R_RATE_I", &rollRatePID.i},
|
||||||
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "Arduino.h"
|
||||||
|
#include "flix.h"
|
||||||
#include "lpf.h"
|
#include "lpf.h"
|
||||||
|
|
||||||
class PID {
|
class PID {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
|
|
||||||
class Quaternion : public Printable {
|
class Quaternion : public Printable {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
#include <SBUS.h>
|
#include <SBUS.h>
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
SBUS rc(Serial1);
|
static SBUS rc(Serial1);
|
||||||
int rcRxPin = -1; // -1 means disabled
|
int rcRxPin = -1; // -1 means disabled
|
||||||
|
|
||||||
uint16_t channels[16]; // raw rc channels
|
uint16_t channels[16]; // raw rc channels
|
||||||
@@ -3,8 +3,12 @@
|
|||||||
|
|
||||||
// Fail-safe functions
|
// Fail-safe functions
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "flix.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
extern float controlTime;
|
extern float controlTime;
|
||||||
extern float controlRoll, controlPitch, controlThrottle, controlYaw;
|
extern const int AUTO, STAB;
|
||||||
|
|
||||||
float rcLossTimeout = 1;
|
float rcLossTimeout = 1;
|
||||||
float descendTime = 10;
|
float descendTime = 10;
|
||||||
@@ -3,6 +3,9 @@
|
|||||||
|
|
||||||
// Time related functions
|
// Time related functions
|
||||||
|
|
||||||
|
#include "Arduino.h"
|
||||||
|
#include "flix.h"
|
||||||
|
|
||||||
float t = NAN; // current time, s
|
float t = NAN; // current time, s
|
||||||
float dt; // time delta with the previous step, s
|
float dt; // time delta with the previous step, s
|
||||||
float loopRate; // Hz
|
float loopRate; // Hz
|
||||||
+6
-6
@@ -7,24 +7,24 @@
|
|||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <ESP32_NOW_Serial.h>
|
#include <ESP32_NOW_Serial.h>
|
||||||
|
#include "flix.h"
|
||||||
|
|
||||||
const float ONE_G = 9.80665;
|
const float ONE_G = 9.80665;
|
||||||
extern float t;
|
|
||||||
|
|
||||||
float mapf(float x, float in_min, float in_max, float out_min, float out_max) {
|
inline float mapf(float x, float in_min, float in_max, float out_min, float out_max) {
|
||||||
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool invalid(float x) {
|
inline bool invalid(float x) {
|
||||||
return !isfinite(x);
|
return !isfinite(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool valid(float x) {
|
inline bool valid(float x) {
|
||||||
return isfinite(x);
|
return isfinite(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wrap angle to [-PI, PI)
|
// Wrap angle to [-PI, PI)
|
||||||
float wrapAngle(float angle) {
|
inline float wrapAngle(float angle) {
|
||||||
angle = fmodf(angle, 2 * PI);
|
angle = fmodf(angle, 2 * PI);
|
||||||
if (angle > PI) {
|
if (angle > PI) {
|
||||||
angle -= 2 * PI;
|
angle -= 2 * PI;
|
||||||
@@ -35,7 +35,7 @@ float wrapAngle(float angle) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Trim and split string by spaces
|
// Trim and split string by spaces
|
||||||
void splitString(String& str, String& token0, String& token1, String& token2) {
|
inline void splitString(String& str, String& token0, String& token1, String& token2) {
|
||||||
str.trim();
|
str.trim();
|
||||||
if (str.isEmpty()) return;
|
if (str.isEmpty()) return;
|
||||||
char chars[str.length() + 1];
|
char chars[str.length() + 1];
|
||||||
|
|||||||
+4
-2
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
class Vector : public Printable {
|
class Vector : public Printable {
|
||||||
public:
|
public:
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
@@ -136,5 +138,5 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Vector operator * (const float a, const Vector& b) { return b * a; }
|
inline Vector operator * (const float a, const Vector& b) { return b * a; }
|
||||||
Vector operator + (const float a, const Vector& b) { return b + a; }
|
inline Vector operator + (const float a, const Vector& b) { return b + a; }
|
||||||
|
|||||||
@@ -9,21 +9,24 @@
|
|||||||
#include <MacAddress.h>
|
#include <MacAddress.h>
|
||||||
#include <ESP32_NOW_Serial.h>
|
#include <ESP32_NOW_Serial.h>
|
||||||
#include <Preferences.h>
|
#include <Preferences.h>
|
||||||
|
#include "config.h"
|
||||||
|
#include "flix.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
extern Preferences storage; // use the main preferences storage
|
extern Preferences storage; // use the main preferences storage
|
||||||
|
extern bool mavlinkConnected;
|
||||||
|
|
||||||
const int W_DISABLED = 0, W_AP = 1, W_STA = 2, W_ESPNOW = 3;
|
extern const int W_DISABLED = 0, W_AP = 1, W_STA = 2, W_ESPNOW = 3;
|
||||||
int wifiMode = W_AP;
|
int wifiMode = W_AP;
|
||||||
|
|
||||||
int wifiLongRange = 0;
|
int wifiLongRange = 0;
|
||||||
int udpLocalPort = 14550;
|
int udpLocalPort = 14550;
|
||||||
int udpRemotePort = 14550;
|
int udpRemotePort = 14550;
|
||||||
IPAddress udpRemoteIP = "255.255.255.255";
|
static IPAddress udpRemoteIP = "255.255.255.255";
|
||||||
WiFiUDP udp;
|
static WiFiUDP udp;
|
||||||
|
|
||||||
ESPNOWSerial espnow(NULL, 0, WIFI_IF_AP);
|
static ESPNOWSerial espnow(NULL, 0, WIFI_IF_AP);
|
||||||
ESPNOWSerial espnowBroadcast(ESP_NOW.BROADCAST_ADDR, 0, WIFI_IF_AP);
|
static ESPNOWSerial espnowBroadcast(ESP_NOW.BROADCAST_ADDR, 0, WIFI_IF_AP);
|
||||||
int espnowChannel = 6;
|
int espnowChannel = 6;
|
||||||
|
|
||||||
void setupWiFi() {
|
void setupWiFi() {
|
||||||
@@ -33,14 +36,10 @@ void setupWiFi() {
|
|||||||
if (wifiMode == W_AP) {
|
if (wifiMode == W_AP) {
|
||||||
WiFi.softAP(storage.getString("WIFI_AP_SSID", "flix").c_str(), storage.getString("WIFI_AP_PASS", "flixwifi").c_str());
|
WiFi.softAP(storage.getString("WIFI_AP_SSID", "flix").c_str(), storage.getString("WIFI_AP_PASS", "flixwifi").c_str());
|
||||||
udp.begin(udpLocalPort);
|
udp.begin(udpLocalPort);
|
||||||
}
|
} else if (wifiMode == W_STA) {
|
||||||
|
|
||||||
if (wifiMode == W_STA) {
|
|
||||||
WiFi.begin(storage.getString("WIFI_STA_SSID", "").c_str(), storage.getString("WIFI_STA_PASS", "").c_str());
|
WiFi.begin(storage.getString("WIFI_STA_SSID", "").c_str(), storage.getString("WIFI_STA_PASS", "").c_str());
|
||||||
udp.begin(udpLocalPort);
|
udp.begin(udpLocalPort);
|
||||||
}
|
} else if (wifiMode == W_ESPNOW) {
|
||||||
|
|
||||||
if (wifiMode == W_ESPNOW) {
|
|
||||||
WiFi.mode(WIFI_AP);
|
WiFi.mode(WIFI_AP);
|
||||||
WiFi.setChannel(espnowChannel);
|
WiFi.setChannel(espnowChannel);
|
||||||
espnow.addr(MacAddress(storage.getString("ESPNOW_PEER_MAC", "FF:FF:FF:FF:FF:FF").c_str()));
|
espnow.addr(MacAddress(storage.getString("ESPNOW_PEER_MAC", "FF:FF:FF:FF:FF:FF").c_str()));
|
||||||
+15
-1
@@ -10,9 +10,23 @@ list(APPEND CMAKE_CXX_FLAGS "${GAZEBO_CXX_FLAGS}")
|
|||||||
|
|
||||||
set(FLIX_SOURCE_DIR ../flix)
|
set(FLIX_SOURCE_DIR ../flix)
|
||||||
include_directories(${FLIX_SOURCE_DIR})
|
include_directories(${FLIX_SOURCE_DIR})
|
||||||
|
set(FLIX_SOURCE_DIR ../flix)
|
||||||
|
include_directories(${FLIX_SOURCE_DIR})
|
||||||
|
set(FLIX_SOURCES
|
||||||
|
${FLIX_SOURCE_DIR}/cli.cpp
|
||||||
|
${FLIX_SOURCE_DIR}/control.cpp
|
||||||
|
${FLIX_SOURCE_DIR}/estimate.cpp
|
||||||
|
${FLIX_SOURCE_DIR}/safety.cpp
|
||||||
|
${FLIX_SOURCE_DIR}/log.cpp
|
||||||
|
${FLIX_SOURCE_DIR}/mavlink.cpp
|
||||||
|
${FLIX_SOURCE_DIR}/motors.cpp
|
||||||
|
${FLIX_SOURCE_DIR}/parameters.cpp
|
||||||
|
${FLIX_SOURCE_DIR}/rc.cpp
|
||||||
|
${FLIX_SOURCE_DIR}/time.cpp
|
||||||
|
)
|
||||||
|
|
||||||
set(CMAKE_BUILD_TYPE RelWithDebInfo)
|
set(CMAKE_BUILD_TYPE RelWithDebInfo)
|
||||||
add_library(flix SHARED simulator.cpp)
|
add_library(flix SHARED simulator.cpp ${FLIX_SOURCES})
|
||||||
target_link_libraries(flix ${GAZEBO_LIBRARIES} ${SDL2_LIBRARIES})
|
target_link_libraries(flix ${GAZEBO_LIBRARIES} ${SDL2_LIBRARIES})
|
||||||
target_include_directories(flix PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
target_include_directories(flix PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
target_compile_options(flix PRIVATE -Wno-address-of-packed-member) # disable unneeded mavlink warnings
|
target_compile_options(flix PRIVATE -Wno-address-of-packed-member) # disable unneeded mavlink warnings
|
||||||
|
|||||||
@@ -18,19 +18,6 @@
|
|||||||
#include "Arduino.h"
|
#include "Arduino.h"
|
||||||
#include "flix.h"
|
#include "flix.h"
|
||||||
|
|
||||||
#include "cli.ino"
|
|
||||||
#include "control.ino"
|
|
||||||
#include "estimate.ino"
|
|
||||||
#include "safety.ino"
|
|
||||||
#include "log.ino"
|
|
||||||
#include "lpf.h"
|
|
||||||
#include "mavlink.ino"
|
|
||||||
#include "motors.ino"
|
|
||||||
#include "parameters.ino"
|
|
||||||
#include "power.ino"
|
|
||||||
#include "rc.ino"
|
|
||||||
#include "time.ino"
|
|
||||||
|
|
||||||
using ignition::math::Vector3d;
|
using ignition::math::Vector3d;
|
||||||
using namespace gazebo;
|
using namespace gazebo;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|||||||
+1
-6
@@ -11,12 +11,7 @@
|
|||||||
#include <sys/poll.h>
|
#include <sys/poll.h>
|
||||||
#include <gazebo/gazebo.hh>
|
#include <gazebo/gazebo.hh>
|
||||||
|
|
||||||
// Mocks
|
int wifiMode = 1; // mock
|
||||||
int wifiMode = 1;
|
|
||||||
int wifiLongRange = 0;
|
|
||||||
// int espnowChannel = 6;
|
|
||||||
const int W_DISABLED = 0, W_AP = 1, W_STA = 2, W_ESPNOW = 3;
|
|
||||||
|
|
||||||
int udpLocalPort = 14580;
|
int udpLocalPort = 14580;
|
||||||
int udpRemotePort = 14550;
|
int udpRemotePort = 14550;
|
||||||
const char *udpRemoteIP = "255.255.255.255";
|
const char *udpRemoteIP = "255.255.255.255";
|
||||||
|
|||||||
Reference in New Issue
Block a user