Alle Beiträge von Simon

Neuer 3D-Drucker

Der Artillery Genius Pro kommt hoffentlich die Woche. Er löst den etwas sperrigen und umständlichen ANET A8 ab.

Ich habe jedenfalls viel Gutes über ihn gesehen.

Update:

Da isser ja!

Artillery Genius Pro
Rückseite

Er druckt schon die ersten Testmuster – Calibrationcube und Benchy.

Schaut recht gut aus.

Mein PLA-Filament ist steinalt und nicht getrocknet. Dafür ist das was rauskommt echt gut!

Einrichtung war echt kinderleicht – Brücke aufstecken, 4 Schrauben festziehen. Filamenthalter zusammenschrauben (4 Schrauben) und aufstecken. Z-Motoren und Filamentsensor anstecken. Alles kurz überprüfen. Laufrollen spannen, die waren aber schon kräftig vorgespannt. Das sollte wohl nicht so lange lagern, aber egal. Es liegen nur 2 Ersatzrollen bei.

Dann anschalten, kurz hochfahren lassen. Temperaturen prüfen, aufheizen. Bewegungen checken, Nullen. Dann die Level-Prozedur, erst mal grob (er hat ja leider noch Stellschrauben) und dann Autolevel. Den Z-Offset noch feinjustieren. Dann am PC Cura-Profil anlegen, den Genius gibt es da schon. Den einfach Pro nennen und los geht’s.

Slicen, auf den Stick speichern. Drucken. Und dann kommt da tatsächlich was aus Plastik raus 🙂

Der Drucker ist richtig leise. Geradezu unglaublich leise. Da ist mein Office-Tintendrucker ja lauter. Ok, der ist natürlich lauter. Aber der Drucker ist etwa so leise wie mein Laptop, wenn der Lüfter rauscht. So in der Größenordnung. Dazu kommen dann leichte Klappergeräusche, wenn das Filament einzieht (retract).

Die Druckqualität ist gut. Nicht extrem oder sehr gut, aber besser als der ANET A8. Auf Z sehe ich leichte Dickenschwankungen (evtl. das alte Filament). Auf X und Y ganz schwach ein “Ringing”. Aber echt sehr schwach. Das kommt evtl. von den Riemen. Wie man die spannen soll? Kein Wort dazu in der Anleitung. Haben diverse Youtuber schon bemängelt. Die Spannung schaut ab Werk recht gut aus. Y könnte noch etwas strammer sein.

Die Haftung auf der Platte ist extrem. Also so stark, dass der Calibration-Cube nur mit Spachtel und Teppichmesser runtergeht. Da muss ich mir also auch noch was überlegen. Jetzt sind ja Flex-Beds grad in. Vielleicht klatsche ich ein Stahlblech drauf. Wo beim ANET noch das verzogene Aluteil drauf ist, hatte ich Glas draufgeklebt. Jetzt wo Glas drauf ist, muss also was anderes wieder drüber… na ja.

Jumper T16 Firmwareupdate

Ja, so ein Update ist immer eine größere Sache.

Neuer Companion, installiert mit sudo dpkg -i debfile, jetzt auf Version 2.3.14-otx.

Neue SD-Card, V0038 für T16.

Neue Firmware, die holt der Companion zum Glück automatisch. Meine Optione:n crsf flex internalmult multimod lua luac ppmus

Erst mal Firmware, SD-Card und internen Speicher sichern.

Dann in den Bootloader mit Trim Rudder/Ail nach innen beim Anschalten. Flashe Firmware. Ausmachen, SD-Card raus und updaten. Firmware, Models, Images kopiere ich rüber von der alten.

Dann starten, die Funke initialisiert sich. Kalibrieren. Und dann wieder in den Bootloader (Affengriff).

Und dann Einstellungen zurück. Kurz checken ob alle Modelle wieder da sind. Passt!

Autolaunch INAV

Test:

  • Activate AL
  • Arm
  • optionally select flight mode Loiter – after AL timeout it will transition to that mode
  • Throttle up to 100% – this will spin up the prop to pre-set AL starting speed
  • Throw, try to keep it level, not up too much

At any time, if the sticks are moved, AL will abort!

Linux Repair GRUB2 on EFI System

Da hatte ich einen Riesenschreck bekommen – von einem Tag auf den andern bootet Ubuntu nicht mehr!

Die Fehlermeldung ist reichlich obskur – Failed to open \EFI\UBUNTU\ und dann seltsame Symbole. Da ist wohl im BIOS was durcheinander geraten.

Windows konnte zum Glück noch starten.

Jedenfalls hab ich es nicht mit einfachen Mitteln (boot-repair etc) hingekriegt.

Hier die Lösung von https://askubuntu.com/questions/831216/how-can-i-reinstall-grub-to-the-efi-partition:

Hole den Ubuntu-Live-USB-Stick und boote ihn (über UEFI natürlich).

Starte “Try Ubuntu” und öffne dann ein Terminal.

Mit fdisk -l lassen sich schnell und unkompliziert die Partitionen finden.

sudo fdisk -l

sudo mount /dev/nvme1n1p4 /mnt
sudo mount /dev/nvme0n1p1 /mnt/boot/efi
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
sudo chroot /mnt
grub-install /dev/nvme0n1p1
update-grub

nvme0n1p1 ist die EFI-Systempartition.

nvme1n1p4 ist mein Ubuntu Ext4.

Update

Nach Windows-Boot kehrt das Problem zurück!

RC Car Speedometer

Basierend auf einem TTGO LoRa mit OLED 128×64 mit BN-880 GPS.

Anschluss

  • Batterie/Lipo an den unteren Bat-Connector
  • GPS an 5V/12(RX)/13(TX)/GND

Arduino mit der ESP32-Erweiterung, Board TTGO-LoRa-OLED.

Features

  • 5 Hz GPS-Datenrate
  • Die 5 höchsten Geschwindigkeiten, die höchste extra groß angezeigt
  • Satellitenanzahl-Anzeige

Hier der Code:

//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

const unsigned char ubxRate1Hz[]  = 
  { 0x06,0x08,0x06,0x00,0xE8,0x03,0x01,0x00,0x01,0x00 };
const unsigned char ubxRate5Hz[]  =
  { 0x06,0x08,0x06,0x00,200,0x00,0x01,0x00,0x01,0x00 };
const unsigned char ubxRate10Hz[]  =
  { 0x06,0x08,0x06,0x00,100,0x00,0x01,0x00,0x01,0x00 };
const unsigned char ubxRate16Hz[]  =
  { 0x06,0x08,0x06,0x00,50,0x00,0x01,0x00,0x01,0x00 };

// Disable specific NMEA sentences
const unsigned char ubxDisableGGA[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableGLL[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableGSA[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x02,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableGSV[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x03,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableRMC[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x04,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableVTG[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x05,0x00,0x00,0x00,0x00,0x00,0x01 };
const unsigned char ubxDisableZDA[]  =
  { 0x06,0x01,0x08,0x00,0xF0,0x08,0x00,0x00,0x00,0x00,0x00,0x01 };


#define Battadc 34

//OLED pins
#define OLED_SDA 4
#define OLED_SCL 15 
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define SDA 21
#define SCL 22

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);

bool enable_dbg;
bool sig_valid, sig_rxok;
float sig_speed, saved_spd;
int sig_sats;
float maxspeed[5];

// Cut out the wanted substring from a comma-separated string
static String extract_val(char *buf, int len, int cpos)
{
  String str="";
  int i,cc=0,cs=0,ce=255;
  for (i=0;i 0)
        sig_valid = true;
      Serial.println(s);
      sig_speed = s.toFloat();
      saved_spd = sig_speed;
    }
    else if (buf[2]=='G' && buf[3]=='G' && buf[4]=='A') {
      display.print(buf);
      String s = extract_val(buf, pos, 7);
      Serial.println(s);
      sig_sats = s.toInt();
    }
  }
  else if (c=='$') pos=0;
  else if (pos < sizeof(buf))
    buf[pos++] = c;
}

//Warteschleife, die ankommende Daten vom GPS Modul verarbeitet und den Status des Tasters prüft
static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (Serial2.available()) {
      char c=Serial2.read();
      parse_gps(c);
      if (enable_dbg) Serial.print(c);
      //display.print(c);
    }
    //display.display();
  } while (millis() - start < ms);
}

static void sendUBX( const unsigned char *progmemBytes, size_t len )
{
  Serial2.write( 0xB5 ); // SYNC1
  Serial2.write( 0x62 ); // SYNC2

  uint8_t a = 0, b = 0;
  while (len-- > 0) {
    uint8_t c = ( *progmemBytes++ );
    a += c;
    b += a;
    Serial2.write( c );
  }

  Serial2.write( a ); // CHECKSUM A
  Serial2.write( b ); // CHECKSUM B
  delay(100);
}

static void updateRate()
{
  sendUBX(ubxRate5Hz, 10);
}

void setup() { 
  pinMode(0, INPUT_PULLUP); // button
  pinMode(SCL, INPUT_PULLUP); // I2C of GPS compass
  pinMode(SDA, INPUT_PULLUP);

  analogSetAttenuation(ADC_0db); // control sensitivity; ADC_11db, ADC_6db, ADC_2_5db, ADC_0db
  pinMode(Battadc, INPUT);
  adcAttachPin(Battadc);

  Serial.begin(115200); // debug
  Serial2.begin(9600,SERIAL_8N1,12,13); // GPS
  
  //reset OLED display via software
  pinMode(OLED_RST, OUTPUT);
  digitalWrite(OLED_RST, LOW);
  delay(20);
  digitalWrite(OLED_RST, HIGH);
  
  //initialize OLED
  Wire.begin(OLED_SDA, OLED_SCL);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
    //Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.clearDisplay();
  display.display();

  delay(2000);
  sendUBX(ubxDisableGLL, 12);
  sendUBX(ubxDisableGSA, 12);
  sendUBX(ubxDisableGSV, 12);
  sendUBX(ubxDisableRMC, 12);
  sendUBX(ubxDisableZDA, 12);
  Serial2.print("$PUBX,41,1,0007,0003,19200,0*25\r\n");
  Serial2.flush();
  delay(100);
  Serial2.end();
  Serial2.begin(19200,SERIAL_8N1,12,13);
  delay(1000);
  updateRate();
}

void loop() {
  int i;
  bool spdwritten = false;
  char tmp[32];
  float spd;
  
  smartdelay(0);
  display.clearDisplay(); // drawString(x,y,text);? or ACROBOTIC_SSD1306 with setTextXY/putString
  display.setCursor(0, 0);
  if (sig_valid) {
    spd = sig_speed;
    sig_speed = 0.0;
    // show maximum speed, with 5 places to see glitches
    display.println("Geschwindigkeit (max)");
    for (i=0; i<5; i++) {
      if (spd > maxspeed[i] && !spdwritten) {
        maxspeed[i] = spd;
        spdwritten = true;
        break;
      }
    }
    for (i=0; i<5; i++) {
      if (i==0)
        display.setTextSize(2);
      sprintf(tmp, "%4.1f km/h", maxspeed[i]);
      display.println(tmp);
      if (i==0)
        display.setTextSize(1);
    }
    // show current speed
    sprintf(tmp,"S%4.1f  Sats %3d", saved_spd, sig_sats);
    display.print(tmp);
  } else {
    display.println("No GPS fix.");
    if (sig_rxok)
      display.println("GPS RX ok");
    sprintf(tmp,"         Sats %3d", sig_sats);
    display.print(tmp);
  }
  display.display();
  int vbatt = analogRead(Battadc);

  if (digitalRead(0)==0) { // clear
    for (i=0;i<5; i++)
      maxspeed[i] = 0.0;
    display.clearDisplay();
  }
}

DJI und das leidige PAL

Die DJI-FPV-Brille erzeugt bei schwachem Signal sehr wohl einen “Black-Screen”, dabei zeigt die Brille eine Sekunde lang das DJI-Logo.

Das passiert nur mit PAL.

Mit Signal-Format NTSC wird das Bild nur zu Rauschen und kommt auch sofort wieder.

Konsequenz: Die meisten Flugobjekte habe ich gerade auf NTSC umgestellt.

Ubuntu auf dem Laptop

Meine Spezial-Tastenkürzel

Laptop Lautsprecher an bei gestecktem Kopfhörer (Strg+Shift+S):

sh -c 'amixer -c 0 sset Speaker on && amixer -c 0 sset Speaker 100%'

Display heller bzw. dunkler (Strg+Shift+Cursor auf/ab):

sh -c 'gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.gnome.SettingsDaemon.Power.Screen.StepUp'

sh -c 'gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.gnome.SettingsDaemon.Power.Screen.StepDown'

Bildwiederholrate per command-line ändern (Strg+Shift+D/F) – das ist etwas unintuitiv:

#sh -c '/home/simon/set-wayland-cfg.sh 1920x1080@60.000499725341797 1'
#sh -c '/home/simon/set-wayland-cfg.sh 1920x1080@240.00050354003906 1'

#!/bin/bash
set -xeu -o pipefail
resolution="$1"
scale="$2"
function get_serial() {
   serial="$(gdbus call --session --dest org.gnome.Mutter.DisplayConfig \
   --object-path /org/gnome/Mutter/DisplayConfig \
   --method org.gnome.Mutter.DisplayConfig.GetResources | awk '{print $2}' | tr -d ',')"
   echo $serial
}
serial=$(get_serial)
gdbus call --session --dest org.gnome.Mutter.DisplayConfig \
   --object-path /org/gnome/Mutter/DisplayConfig \
   --method org.gnome.Mutter.DisplayConfig.ApplyMonitorsConfig \
   $serial 1 "[(0, 0, $scale, 0, true, [('eDP-1', '$resolution', [] )] )]" "[]"

Automatisierung

Der Killer-LAN kommt nicht aktiv aus dem suspend: Fix: Script in /usr/lib/systemd/system-sleep

#script restorelan

#!/bin/sh
if [ "${1}" == "pre" ]; then
   # Do the thing you want before suspend here, e.g.:
   echo "we are suspending at $(date)…" > /tmp/systemd_suspend_test
elif [ "${1}" == "post" ]; then
   # Do the thing you want after resume here, e.g.:
   echo "…and we are back from $(date)" >> /tmp/systemd_suspend_test
   modprobe -r alx
   modprobe alx
fi

Mit PulseEffects kann ich den Frequenzgang der Laptop-Quäken tunen:

Und den Equalizer bei eingesteckten Kopfhörern automatisch abschalten:

#starte gnome-session-properties und dann dieses Skript in Autostart eintragen: /home/simon/phoneeq.sh

#!/bin/bash
acpi_listen | while IFS= read -r line;
do
     if [ "$line" = "jack/headphone HEADPHONE plug" ]
     then
        dconf write /com/github/wwmm/pulseeffects/sinkinputs/equalizer/state false
        notify-send "headphones connected. Sound is flat."
     elif [ "$line" = "jack/headphone HEADPHONE unplug" ]
     then
        dconf write /com/github/wwmm/pulseeffects/sinkinputs/equalizer/state true
        notify-send "headphones disconnected. Sound is equalized."
     fi
done

Linux-Welt

dconf ist wohl sowas wie die Registry.

modprobe lädt/entlädt Kernel-Module. Dazu passen lsmod und modinfo.

lsusb -t zeigt z.B. angeschlossene USB-Geräte und die Datenrate. War interessant, weil ein USB3-Stick zu langsam war. Nach einem Reboot wurde er dann korrekt erkannt.

gdbus dient zum Zugriff auf laufende Programme, Treiber, etc. Stichwort D-Bus.

Für Audio gibt es auch zig Tools. pavucontrol, pulseeffects, pa-info, pactl, pacmd, paplay, parecord, alsamixer, amixer… da hab ich JACK noch gar nicht erwähnt…

Strom sparen

Powertop: gemessen – bringt nix im idle

sudo powertop --auto-tune

Reduce power per script: bringt nix im idle

sudo pm-powersave true

gnome-settings: Energie sparen-Profil auswählen. Bringt 1/2 W im idle.

Display-Refreshrate auf 60Hz und dunkel stellen. Bringt nix.

Fazit: Laptop bleibt leise und kühl. Auch wenig anspruchsvolle Spiele halten den Lüfter noch leise. Auch ohne die Optionen oben und im Energie-Modus Ausgewogen ist beim Shellshock-Zocken der Laptop sparsam. Nur die Framerate muss man begrenzen.

Kompatibilität

Es laufen viele Programme: Die ganzen inav, betaflight, blheli-Konfiguratoren, OpenTX-Companion, Steam-Spiele, Skype (auch im Chromium-Browser).

Der nvidia-Originaltreiber unterstützt “PRIME” (Optimus), damit bleibt der Laptop kühl und suspend klappt ohne Absturz. Ein bisschen scary ist das Vergeben eines “Passworts” für den SecureBoot. Das braucht Linux offenbar, um sich Zugriff auf die Hardware zu verschaffen. Das Passwort wird beim Reboot einmalig zum “Enroll MOK” abgefragt. Fertig.

Netflix und Amazon-Prime spielen ihre Medien ab.

In Firefox kann ich mein Profil importieren, Mailvelope läuft.

VLC spielt alle lokalen Medien ab.

Der HP-Drucker läuft einfach (und tatsächlich auch schneller als unter Windows, wo er ewig wartet bis er druckt).

Das Hersteller-Bildschirm-Farbprofil (ICC) lässt sich importieren.

Dark Mode: Ich nehme Qgir-dark, dazu Schriften auf 0,9 skaliert. Im gedit muss man in den Einstellungen (Schrift und Farbe) separat den dark-mode aktivieren.

Für die fehlenden Tastaturleds nehme ich Lock Key, das blendet in der Infoleiste die zwei Symbole für Caps- und Numlock ein.

SD-Card-Reader, Webcam, Ton, Mikrofon, kurzum, die Laptop-Hardware wird fast vollständig unterstützt. Ausnahmen: Externes Headset/Mikro, Tastatur-RGB-Beleuchtung und Spezialtasten (Helligkeit, Wifi, Lüfter). Der/die Lüfter lassen sich nicht direkt ansteuern. Die drei Energieoptionen (Leistung, Ausgewogen, Sparsam) funktionieren aber.

Dateien kopieren ist deutlich langsamer als unter Windows (es heißt, NTFS wäre ein reverse-engineered Treiber in Linux und daher nicht performant…).

grub knallt sich leider vor den Windows-Bootloader. Aber ich boote eh fast nur Linux. Ich hab’s noch nicht geschafft, Ubuntu aus dem Windows-Loader zu starten.

Wenn’s irgendwie mal komisch läuft, mach nen Neustart. In der Hinsicht läuft Windows “runder”. Linux wirkt auch mehr zusammengeschustert. Aber Ubuntu macht auf dieser Maschine Spaß. Ich habe das Gefühl, volle Kontrolle über das System zu haben.

Hin und wieder bleibt (wohl beim/nach dem Zocken) irgendwas “hängen” bzw läuft im Hintergrund (gnome-shell), da dreht der Lüfter auf. Da hilft dann nur neu anmelden oder Neustart.

Der alte VAIO lief ebenso sehr gut mit Ubuntu. Da haperte es auch mit den Spezialtasten (gibt aber einen Hack). Auf dem Gigabyte habe ich einfach andere Tastenkürzel aktiviert.

Update

Mittlerweile habe ich einiges erlebt.

  • NVM config im UEFI wird von Windows zerstört, so dass Grub nicht mehr startet.
  • Beim Taskwechsel auf einen laufenden Chrome mit Skype-Videofonie kann es manchmal das gesamte System in den Orkus reißen.
  • Standby wacht nach kurzer Zeit wieder auf. Hatte ich aber auch unter Windows, aber gefühlt nicht so häufig.
  • Ich kriege kein USB in VirtualBox mit Win10-Gast durchgereicht.
  • Der Desktop ist fast nutzlos.
  • Es ist ein Krampf, Programme in den Launcher zu hieven (wenn sie sich nicht per Rechtsklick einhängen lassen).
  • Es gibt zu viele Möglichkeiten Programme zu verwalten (snap, apt, dpkg, appimage, etc).
  • Finden, aus welchem System ein Programm stammt? Deinstallieren? Wo denkst du hin? Lösch es einfach (bleibt halt weiß Gott was zurück)…
  • USB-SD-etc kann das System aufhängen (schlechte SD-Karte, wackeliges Kabel, und so Zeug). Unter Windows leider auch nix Neues…
  • Updates kommen sehr häufig.

Manches davon ist leider echt nervig – und ich habe für all das noch keine brauchbare Lösungen ergoogeln können…

AppImage zu Launcher: hier

Jumper T-lite

Ich habe mir die kleine T-lite besorgt.

Das interne Modul muss mit serial multi geflasht werden (ich habe die only CC2500 bestellt, aber auch da muss die Multi-Firmware rein).

Damit man die Modelle am PC managen kann, braucht es die aktuelle Nightly vom Companion.

Dazu habe ich noch das “Klonen” ausprobiert. Dazu stellt man in einem Dummymodell das Multi auf FrSkyRX und Subtyp auf CloneRX. Dann Bind-Mode. Jetzt bindet man einfach mit der original Taranis und schon klont das Multi die ID. Top!

Für alle Modelle muss man dann aber Clone D8/D16 auswählen.

Und die Schalter sind weniger, d.h. Schalter sind auch umzubelegen.

XJB145 Tune

Für die Kollegen:

Ich hab schnell mal die PIDs vom XJB145 (auf Betaflight 3.5) optimiert. Die PIDtoolbox macht’s möglich!

# diff

# masterset 
gyro_lowpass_hz = 120
set dyn_notch_quality = 15
set dyn_notch_width_percent = 30
set rc_smoothing_type = FILTER
set blackbox_p_ratio = 64
set small_angle = 180
set pid_process_denom = 2
set debug_mode = GYRO_SCALED

# profile
profile 0
set dterm_notch_hz = 234
set dterm_notch_cutoff = 200
set iterm_rotation = OFF
set smart_feedforward = ON
set iterm_relax = RP
set p_pitch = 55
set i_pitch = 40
set d_pitch = 23
set p_roll = 45
set i_roll = 40
set d_roll = 21
set p_yaw = 45
set i_yaw = 90
set f_yaw = 90
set abs_control_gain = 5

# rateprofile
rateprofile 0
#set thr_mid = 0
#set thr_expo = 30
#set roll_expo = 20
#set pitch_expo = 20
#set roll_srate = 80
#set pitch_srate = 80
set tpa_rate = 20
set tpa_breakpoint = 1050

Yaw ist etwas zickig – egal wie ich P und I rauf und runter setze, es schießt immer schnell ein und erreicht dann erst flach den Setpoint. Könnte natürlich auch was mit den anderen Optionen zu tun haben. Aber ich finde, er fliegt auch so super.

Hier noch die alten PIDs, leicht zu hoch, aber noch unkritisch (Filter auf default):

set dterm_notch_cutoff = 0
set iterm_rotation = OFF
set smart_feedforward = ON
set iterm_relax = RP
set p_pitch = 57
set i_pitch = 40
set d_pitch = 24
set f_pitch = 60
set p_roll = 55
set i_roll = 40
set d_roll = 24
set f_roll = 60
set p_yaw = 65
set i_yaw = 60
set f_yaw = 60
set abs_control_gain = 5