Платы CopterControl, CC3D, LibrePilot, Revolution от OpenPilot
Помогите с кодом. Собрал прошивку на линуксе.
Теперь хочу добавить в нее термокомпенсацию.
--- a/flight/Modules/Attitude/attitude.c
+++ b/flight/Modules/Attitude/attitude.c
@@ -215,11 +215,18 @@ static void updateSensors(AttitudeRawData * attitudeRaw)
return;
}
+ // use temp sensor
+ float compensation = (gyro[0] - GYRO_NEUTRAL) * 0.1;
+ // write a value to monitor in the GSC
+ attitudeRaw->magnetometers[0] = compensation * 100;
// First sample is temperature
- attitudeRaw->gyros[ATTITUDERAW_GYROS_X] = -(gyro[1] - GYRO_NEUTRAL) * gyroGain;
- attitudeRaw->gyros[ATTITUDERAW_GYROS_Y] = (gyro[2] - GYRO_NEUTRAL) * gyroGain;
- attitudeRaw->gyros[ATTITUDERAW_GYROS_Z] = -(gyro[3] - GYRO_NEUTRAL) * gyroGain;
+ float tc1 = 1.0;
+ float tc2 = 0.5;
+ float tc3 = 1.0;
+ attitudeRaw->gyros[0] = -(gyro[1] - GYRO_NEUTRAL - compensation * tc1) * gyroGain;
+ attitudeRaw->gyros[1] = (gyro[2] - GYRO_NEUTRAL - compensation * tc2) * gyroGain;
+ attitudeRaw->gyros[2] = -(gyro[3] - GYRO_NEUTRAL - compensation * tc3) * gyroGain;
int32_t x = 0;
int32_t y = 0;
Но мой синтаксис отличается от Dmitry(HikeR)
Вот мой, я закоментил гиры и добавил термокопенсацию ручками. Ссори я ламер в программировании.
/**
* Get an update from the sensors
* @param[in] attitudeRaw Populate the UAVO instead of saving right here
* @return 0 if successfull, -1 if not
*/
static int32_t updateSensors(AccelsData * accels, GyrosData * gyros)
{
struct pios_adxl345_data accel_data;
float gyro[4];
// Only wait the time for two nominal updates before setting an alarm
if(xQueueReceive(gyro_queue, (void * const) gyro, UPDATE_RATE * 2) == errQUEUE_EMPTY) {
AlarmsSet(SYSTEMALARMS_ALARM_ATTITUDE, SYSTEMALARMS_ALARM_ERROR);
return -1;
}
// Do not read raw sensor data in simulation mode
if (GyrosReadOnly() || AccelsReadOnly())
return 0;
// No accel data available
if(PIOS_ADXL345_FifoElements() == 0)
return -1;
// First sample is temperature
//gyros->x = -(gyro[1] - GYRO_NEUTRAL) * gyroGain;
//gyros->y = (gyro[2] - GYRO_NEUTRAL) * gyroGain;
//gyros->z = -(gyro[3] - GYRO_NEUTRAL) * gyroGain;
static void updateSensors(AttitudeRawData * attitudeRaw)
return;
}
// use temp sensor
float compensation = (gyro[0] - GYRO_NEUTRAL) * 0.1;
// write a value to monitor in the GSC
attitudeRaw->magnetometers[0] = compensation * 100;
// First sample is temperature
float tc1 = 1.0;
float tc2 = 0.5;
float tc3 = 1.0;
attitudeRaw->gyros[0] = -(gyro[1] - GYRO_NEUTRAL - compensation * tc1) * gyroGain;
attitudeRaw->gyros[1] = (gyro[2] - GYRO_NEUTRAL - compensation * tc2) * gyroGain;
attitudeRaw->gyros[2] = -(gyro[3] - GYRO_NEUTRAL - compensation * tc3) * gyroGain;
int32_t x = 0;
int32_t y = 0;
int32_t z = 0;
uint8_t i = 0;
uint8_t samples_remaining;
Теперь прошивка не собирается.
А где скачать оригинал прошивки (закомпиленый вариант термокомпенсации)? Точнее ткните в пост/ссылку, плиз 😃.
А где скачать оригинал прошивки (закомпиленый вариант термокомпенсации)? Точнее ткните в пост/ссылку, плиз 😃.
Теперь прошивка не собирается.
в файле патча знак “минус” в начале строки означает удаленную строчку, знак “плюс” — добавленную. у вас же какой-то ужас получился, это раз.
в текущей прошивке значения акселя, гироскопа и магнетометра из одного объекта attitudeRaw разнесли по трем отдельным, это два. причем магнетометр в CopterControl-е теперь вобще не используется (экономия памяти), поэтому оперативно следить за значением компенсации сходу не получится.
просто “на посмотреть” можно сделать так:
вместо этого кусочка
// First sample is temperature
gyros->x = -(gyro[1] - GYRO_NEUTRAL) * gyroGain;
gyros->y = (gyro[2] - GYRO_NEUTRAL) * gyroGain;
gyros->z = -(gyro[3] - GYRO_NEUTRAL) * gyroGain;
вставить такой
// First sample is temperature
float compensation = (gyro[0] - GYRO_NEUTRAL) * 0.1;
float tc1 = 1.0;
float tc2 = 0.5;
float tc3 = 1.0;
attitudeRaw->gyros[0] = -(gyro[1] - GYRO_NEUTRAL - compensation * tc1) * gyroGain;
attitudeRaw->gyros[1] = (gyro[2] - GYRO_NEUTRAL - compensation * tc2) * gyroGain;
attitudeRaw->gyros[2] = -(gyro[3] - GYRO_NEUTRAL - compensation * tc3) * gyroGain;
и ничего больше не менять (кроме подбора коэффициентов tc(1,2,3) и пересборки/перезаливки).
Спасибо Дмитрий, попробую сегодня.
Не получаеться
стандартный конфиг, вывод
root@debian:/home/pnm/1/OpenPilot# make coptercontrolmake[1]: Nothing to be done for `first'.
- OpenPilot UAVObject Generator -
Done: processed 59 XML files and generated 59 objects with no ID collisions. Total size of the data fields is 2016 bytes.
generating flight code
FWINFO build/fw_coptercontrol/fw_coptercontrol.bin.firmwareinfo.c
root@debian:/home/pnm/1/OpenPilot#
Изменил,
// First sample is temperature
// gyros->x = -(gyro[1] - GYRO_NEUTRAL) * gyroGain;
// gyros->y = (gyro[2] - GYRO_NEUTRAL) * gyroGain;
// gyros->z = -(gyro[3] - GYRO_NEUTRAL) * gyroGain;
float compensation = (gyro[0] - GYRO_NEUTRAL) * 0.1;
float tc1 = 1.0;
float tc2 = 0.5;
float tc3 = 1.0;
attitudeRaw->gyros[0] = -(gyro[1] - GYRO_NEUTRAL - compensation * tc1) * gyroGain;
attitudeRaw->gyros[1] = (gyro[2] - GYRO_NEUTRAL - compensation * tc2) * gyroGain;
attitudeRaw->gyros[2] = -(gyro[3] - GYRO_NEUTRAL - compensation * tc3) * gyroGain;
int32_t x = 0;
int32_t y = 0;
вывод
root@debian:/home/pnm/1/OpenPilot# make coptercontrolmake[1]: Nothing to be done for `first'.
- OpenPilot UAVObject Generator -
Done: processed 59 XML files and generated 59 objects with no ID collisions. Total size of the data fields is 2016 bytes.
generating flight code
CC flight/Modules/Attitude/attitude.c
../Modules/Attitude/attitude.c: In function 'updateSensors':
../Modules/Attitude/attitude.c:291:2: error: 'attitudeRaw' undeclared (first use in this function)
../Modules/Attitude/attitude.c:291:2: note: each undeclared identifier is reported only once for each function it appears in
make[1]: *** [/home/pnm/1/OpenPilot/build/fw_coptercontrol/attitude.o] Error 1
make: *** [fw_coptercontrol_opfw] Error 2
root@debian:/home/pnm/1/OpenPilot#
Вот так прокатило
gyros->x = -(gyro[1] - GYRO_NEUTRAL - compensation * tc1) * gyroGain;
gyros->y = (gyro[2] - GYRO_NEUTRAL - compensation * tc2) * gyroGain;
gyros->z = -(gyro[3] - GYRO_NEUTRAL - compensation * tc3) * gyroGain;
Короче залил я прошивку))) Снес bootloader, rescue не видит плату. Без JTAG не восстановить bootloader?
можно восстановить через компорт …
нужен или аппаратный порт с переходником ±12=>3.3 вольта или USB=>COM желательно на FT232 или CP210х … на всяких PL23хх ака шнурки от моболок успех негарантирован …
wiki.openpilot.org/…/Firmware+Recovery+on+Windows
можно восстановить через компорт …
нужен или аппаратный порт с переходником ±12=>3.3 вольта или USB=>COM желательно на FT232 или CP210х … на всяких PL23хх ака шнурки от моболок успех негарантирован …
wiki.openpilot.org/…/Firmware+Recovery+on+Windows
Есть PL23, попробую на выходных.
error: ‘attitudeRaw’ undeclared
мой косяк, сам ведь и писал что этого объекта больше нет.
Снес bootloader
зачем???
зачем???
После загрузки прошивки, плата не загрузилась.
при загрузке даже кривой-косой прошивки бутлоадер невозможно испортить (если только в прошивка специально не делает чего-то подобного). попробуйте в Rescue режим входить сразу после перезапуска GCS подключая плату только после запроса.
Подглядел код revo
bma180
imu3000
hmc5883
bmp085 😦
Подглядел код revo
bma180
imu3000
hmc5883
bmp085
А можно перевод для тупых 😉)) Можно субтитрами 😉
аксель BMA180
Гиры imu3000
магнитометр hmc5883
баро bmp 085
как то так…
по ходу всё по i2c, почему барометр такой? х.з. наверно от платок к CC остались?
На CC с роду не было барометра…
Серег, у некоторых был… Даже работало. И сонар был…
На CC
имеется ввиду прям на плате? Ну ладно заливать то 😃 Отдельно ставили умельцы.
Конечно вне платы)))))) два порта стоит - что хочешь то и подключай… только еще же и код надо дописать…
CopterControl Mag & Prescure платка внешняя называлась, так в продажу и не попала из за проблем с i2c единственное что делали - высоту показывала, ну и сонар подключался, был программный модуль Altitude сейчас даже в ветке next его уже нет 😦
при загрузке даже кривой-косой прошивки бутлоадер невозможно испортить (если только в прошивка специально не делает чего-то подобного). попробуйте в Rescue режим входить сразу после перезапуска GCS подключая плату только после запроса.
Все верно, откатился на последную, но пока не отсоедил провода, прошивка не заливалась.