TauLabs/PicoC: Scripting

cGiesen

Erfahrener Benutzer
#1
In diesem Thread soll es nur um die Programmierung in PicoC gehen.
Um PicoC ans Rennen zu bekommen, sei ein Blick ins Wiki gewagt: https://github.com/TauLabs/TauLabs/wiki/User-Guide:-PicoC

Dort findet Ihr auch die unterstützten Funktionen.

Was hier auch gerne gesehen wird, sind fertige Scripts. Aber bitte mit Erklärung was sie machen und welche Voraussetzungen zu erfüllen sind (z.B. Hardware, Anschlüsse etc.)

Der Vater von PicoC in Taulabs ist im übrigen ernieift, dem ich hiermit auch nochmal DANKE sagen will! Liefert er mir doch mit dieser Möglichkeit viele Möglichkeiten meine Featurerietiss auszuleben.
 
Zuletzt bearbeitet:

cGiesen

Erfahrener Benutzer
#2
@ernieift
Wie kann ich denn die Systemdaten abfragen, die mir auch im Systemhealth angezeigt werden.

Konkret:
- GPS Status (Rot/Gelb/Grün)
- Batterie (Grün/Gelb/Rot)
- Failsafe

Danke
Carsten
 
Zuletzt bearbeitet:

ernieift

Erfahrener Benutzer
#3
Ich hatte was im letzten PR für Navigation und Steuerung drin. Das Wiki ist noch nicht so weit.
Es gibt gpsposition.h und flightbatterystate.h. Für failsafe ist noch nichts drin. Ich muss immer aufpassen, den Code nicht mit Text zu überladen. Irgendwann ist der ROM am Ende. Aber der Bootloader soll ja geändert werden, dann geht auch wieder mehr.
Das Systemhealth zeigt hauptsächlich Daten aus dem SystemAlarms an. Da steht soviel drin, was kaum jemand braucht…
 

cGiesen

Erfahrener Benutzer
#4
Die beiden genannten Librarys sind tatsächlich schon im Wiki drin.
Nur helfen die mir nicht wirklich.
Mit der Anzahl der SATs kann ich ja nicht wirklich arbeiten, da müßte ich mir die Grenzen ja selber machen.
Das gleiche gilt für Batterie
Da hätte ich doch lieber die Daten aus dem Alarm, da sind eine Menge Alarme die man gut verwerten kann.
z.B. andere Farbe, wenn ich zu weit bin.
 

cGiesen

Erfahrener Benutzer
#5
Ich habe mal eine Liste der vorhandenen Alarme gemacht. Vielleicht kann so besser überlegen, welche Sinn machen und welche nicht, oder wie man einfach eine Alternative bekommen kann.

Ich habe ein Stern vor den Elementen gemacht, die ich gerne in PicoC nutzen können würde.

[TABLE="class: grid, width: 500"]
[TR]
[TD][/TD]
[TD]OutOfMemory[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD]CPUOverload[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD]StacjOverload[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD]SystemConfiguration[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD]EventSystem[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD]Telemetrie[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]*[/TD]
[TD]ManualControl[/TD]
[TD]Failsafe[/TD]
[/TR]
[TR]
[TD][/TD]
[TD]Actuator[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD]Attitude[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD]Sensors[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD]Stabilization[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]*[/TD]
[TD]Geofence[/TD]
[TD]Wenn man außerhalb des eingestellten Bereichs ist. Was macht die FC dann überhaupt? Stoppt sie?[/TD]
[/TR]
[TR]
[TD][/TD]
[TD]PathFollower[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD]PathPlanner[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]*[/TD]
[TD]Battery[/TD]
[TD]Auch hier könnte man die Spannung auswerten, dann hat man aber zwei Stellen, wo man Werte eingeben muss. Im Sinne von 'Wir machen das mal so, dass Andere das einfach P&P nutzen können, wäre das nicht so toll.[/TD]
[/TR]
[TR]
[TD]*[/TD]
[TD]FlightTime[/TD]
[TD]Wenn man Strom mißt, hat man diesen Fehler öfter, sieht ihn aber nur via GCS, die Telemetrie hat dafür gar keinen Wert wo man ihn vermitteln könnte.[/TD]
[/TR]
[TR]
[TD][/TD]
[TD]I2C[/TD]
[TD][/TD]
[/TR]
[TR]
[TD]*[/TD]
[TD]GPS[/TD]
[TD]Man könnte auch die SATs zählen, aber der Wert berücksichtigt ja mehr, z.B. die Qualität der Daten[/TD]
[/TR]
[TR]
[TD][/TD]
[TD]AltitudeHold[/TD]
[TD][/TD]
[/TR]
[TR]
[TD][/TD]
[TD]BootFault[/TD]
[TD][/TD]
[/TR]
[/TABLE]

Den Rest kann man sich meiner Meinung nach sparen, es kann ja jemand widersprechen.
 
Zuletzt bearbeitet:

cGiesen

Erfahrener Benutzer
#6
@ernieift oder jemand anderes Kundiges

Kann mir mal einer ein C Beispiel gegeben, wie z.B. die GPS Position Daten abfrage?
Ich würde gerne die Anzahl der Satelliten erfragen.

Ich bin mit C so garnicht zu Hause, und brauche ein Beispiel, den Rest kann ich dann daraus ableiten.
Aber der Berühmte Anfang :(
 

ernieift

Erfahrener Benutzer
#7
Hallo Carsten,
was nützen Dir eigentlich all diese Alarme, wenn Du die LEDs nicht siehst. Die meisten sind doch schon in HoTT drin. Dazu brauchst Du nur noch (falls bei BT-Modul vorhanden) einen Lautsprecher an die Funke dranzumachen und die sagt Dir dann sogar was nicht in Ordnung ist.

* Manualcontrol: wenn failsafe, dann geht sowieso nichts mehr. Was willst Du dann anzeigen? Ausserdem kriegst Du die Info aus flightstatus.h (ControlSource)

* Geofence: ist bei James in Arbeit. Ich habe es noch nicht probiert, aber es gibt eine Warnschwelle und eine Abschaltgrenze. Bei Überschreiten der Abschaltgrenze fällt der Copter vom Himmel soweit ich weiss. Die aktuelle Entfernung hast Du im HoTT

* Battery: siehe flightbatterystate.h (z.B. EstimatedFlightTime) oder HoTT

* GPS: siehe gpsposition.h (Status), die Entfernung in 3 Achsen gibts in positionactual.h oder auch in HoTT

Derzeit kümme ich mehr darum der Copter per picoC zu steuern als den Interpreter als Relais für Anzeigen zu nehmen. Demnächst gibt es eventuell einen Flightmode PICOC. Damit kann man dann den Copter über picoC kontrollieren und eigene Wege fliegen oder Maneuver machen.
 

cGiesen

Erfahrener Benutzer
#8
Ich denke bei dem Thema auch an die, die kein HoTT haben!
Ziel ist so was ähnliches wie bei den NAZA Teilen.

Und doch, ich sehe die LEDs weil die ja sehr hell sind.

Aber kannst Du mir mal ein Beispiel geben, wegen der Syntax wie ich die Librarys nutze.
Dann mache ich es mit Deinem Weg
 

ernieift

Erfahrener Benutzer
#9
Hier mal ein Beispiel:
Code:
#include "gyros.h"
GyrosData gyros;
GyrosGet(&gyros);
/*
 * dann hast Du in gyros.x, gyros.y, gyros.z und gyros.temperature alle Daten vom jeweiligen Object.
 * und kannst damit weiterrechnen
 * Die Implementierung der UAVOs haben meist die gleiche Struktur wie im browser
 */
Damit kann man dann sowas machen:
[video=vimeo;107335180]http://vimeo.com/107335180[/video]

Mehr dazu findest Du im englischen forum. Da sind auch schon ein paar scripte dabei.
 

cGiesen

Erfahrener Benutzer
#10
Das Video hat mich schon letztens beeindruckt!

Aber kannst Du mir sagen was hier dran falsch ist?

Code:
TestValSet(1);
while (TestVal() <1111) {
     TestValSet(2);
}
TestValSet(3);
Das Script hört bei der While Schleife auf, weil der testVal wird immer nur 1!

Der Rest steht. Der Armed Zustand wird signalisiert

Edit:
Wer lesen kann ist klar im Vorteil.
TestValGet()
 
Zuletzt bearbeitet:

ernieift

Erfahrener Benutzer
#11
Und der ExitValue geht bei Deinem Script auf 1. Am besten Du machst ein Terminalfenster beim Scripte schreiben mit an. Das hilft ungemein einen Fehler zu finden ;).
 

cGiesen

Erfahrener Benutzer
#13
Terminalfenster: gibt es eine Chance das Parallel abzugreifen? Der Upload klappt ja genialerweise auch, ohne das ich da per Uart dran muss.
Dann könnte man ein solches Fenster direkt in der GCS haben.
Noch nee Frage:
Die Textbox für den Source, ist das eine Textbox die man einfach durch ein anderes Control ersetzten kann? Ich meine mal gelesen zu haben, dass es eine mit Syntaxhighliting gibt. Ich glaube das könnte hilfreich sein.

http://qt-project.org/doc/qt-4.8/richtext-syntaxhighlighter.html
 
Zuletzt bearbeitet:

cGiesen

Erfahrener Benutzer
#17
Habe ich auch schon überlegt, aber wenn ich jetzt zusätzlich noch Debugmeldung über den UART raus schreibe, frage ich mich, was die Hardware dann damit macht?!?!?
Oder gibt es eine Möglichkeit den USB UART als Debugkanal zu nutzen?
So das wir zum Beispiel schreiben:
printd("Das geht an den Debug UART\n");

Ja ich weiß, kaum gibt man jemand den kleinen Finger ....
 

ernieift

Erfahrener Benutzer
#18
Du meinst den VCP-Port auf Debug Konsole zu stellen und darauf die picoC Errors auszugeben. Leider geht die Debug Konsole nur wenn PIOS_INCLUDE_DEBUG_CONSOLE beim Kompilieren auch gesetzt wurde. Sonst wird die nicht übersetzt/initialisiert. Eine andere Möglichkeit wäre picoC auf 2 Ports zu aktivieren. Es geht aber nur einer, weil es nur einen Puffer gibt. Dafür müsste man einen zweiten "PicoC Debug?"-Port einrichten. Zunächst würde ich erstmal den allgemeinen Bedarf abklopfen. Mach doch einfach eine issue daraus ;).
Eigentlich würde es reichen, wenn das DebugGadget dafür herhalten würde. Ist ja eine OneWay-Kommunikation. Man müsste einen Puffer von x Zeichen haben, wohin man einfach einen String schicken kann ohne auf irgendwelche Erfolgsmeldungen zu warten. Denn was passiert, wenn es keinen Link gibt? Bleibt dann Dein Script stehen und wartet…
Für einfaches Debugging habe ich bisher den TestValue genommen. Der reicht für das meiste vollkommen. Du kannst ja eh nicht wie bei einem STLink Deinen Code schrittweise testen. Übrigens geht das ja auch nicht beim Fliegen :).
Eine weitere Möglichkeit wäre eine Variable (uint8_t) dem PicoCStatus hinzuzufügen. Die könnte man mit einem Event koppeln. So ungefähr:
das PicoCGadget und das picoCModul triggert auf Änderung. Sieht das Gadget irgendwas verschieden von 0, holt es den Wert ab, schreibt ihn in ein Textfenster und danach setzt es den Wert wieder auf 0. Daraufhin triggert das Modul und kann, wenn irgendwas im Puffer ist, den nächsten Wert übertragen. Den Puffer würde ich auf max. 128 Zeichen beschränken. Die Vorgehensweise ist zwar nicht schnell, funktioniert aber auch z.B. über BT, da es ja egal ist, wohin/woher die Daten gehen/kommen.
 

cGiesen

Erfahrener Benutzer
#19
@Ernieift

Hallo Jens,

mal ein paar Fagen:
1. gibt es einen internenen Timer, der einfach durchläuft und denn ich abfragen kann?
Ich möchte eine blinkende LED realisieren und mach das üblichweise in dem ich die Millisekunden abfrage und auf einer der Stellen auf gerade oder ungerade Zahl prüfe.
Erl.: time()
2. FligthMode
Gibt es eine Liste welche Nummer welcher Flightmode ist? Ist diese Liste konstant, oder werden die Nummern häufiger mal neu vergeben? So wie bei den Modulen?
3. Kann ich FlightMode auch ohne die Struktur erreiche?
Geht ja mit Armend auch
4. System.Config Error
wie kann ich diesen Status abfragen? Wenn ich zum Beispiel Autotune als FlightMode bei Armend gewählt habe, kann ich warten bis der Arzt kommt. In diesem Fall möchte ich z.B. blinken.

Ja, WIR sehen das alles auf unserer Funke. Ich würde das aber gerne machen, wie bei der NAZA auch. Eine Rückmeldung die ich von meinen Kollegen oft bekomme!



 
Zuletzt bearbeitet:

ernieift

Erfahrener Benutzer
#20
Hallo Carsten,
1. Hast du ja schon gefunden.
2. Hier mal die aktuelle Liste. Die ergibt sich aus der XML-Datei und ändert sich natürlich auch. Um nicht im shared-Ordner nachsehen zu müssen, kannst Du auch einfach in der gcs zählen.
Code:
typedef enum
{
 FLIGHTSTATUS_ARMED_DISARMED=0,
 FLIGHTSTATUS_ARMED_ARMING=1,
 FLIGHTSTATUS_ARMED_ARMED=2
} FlightStatusArmedOptions;

typedef enum {
 FLIGHTSTATUS_FLIGHTMODE_MANUAL=0,
 FLIGHTSTATUS_FLIGHTMODE_ACRO=1,
 FLIGHTSTATUS_FLIGHTMODE_LEVELING=2,
 FLIGHTSTATUS_FLIGHTMODE_VIRTUALBAR=3,
 FLIGHTSTATUS_FLIGHTMODE_STABILIZED1=4,
 FLIGHTSTATUS_FLIGHTMODE_STABILIZED2=5,
 FLIGHTSTATUS_FLIGHTMODE_STABILIZED3=6,
 FLIGHTSTATUS_FLIGHTMODE_AUTOTUNE=7,
 FLIGHTSTATUS_FLIGHTMODE_ALTITUDEHOLD=8,
 FLIGHTSTATUS_FLIGHTMODE_VELOCITYCONTROL=9,
 FLIGHTSTATUS_FLIGHTMODE_POSITIONHOLD=10,
 FLIGHTSTATUS_FLIGHTMODE_RETURNTOHOME=11,
 FLIGHTSTATUS_FLIGHTMODE_PATHPLANNER=12,
 FLIGHTSTATUS_FLIGHTMODE_TABLETCONTROL=13
} FlightStatusFlightModeOptions;

typedef enum {
 FLIGHTSTATUS_CONTROLSOURCE_GEOFENCE=0,
 FLIGHTSTATUS_CONTROLSOURCE_FAILSAFE=1,
 FLIGHTSTATUS_CONTROLSOURCE_TRANSMITTER=2,
 FLIGHTSTATUS_CONTROLSOURCE_TABLET=3
} FlightStatusControlSourceOptions;
3. Nein. Geht mit "void FlightStatusGet(FlightStatusData *);" eigentlich ganz gut.

4. Config-Error wird intern gebildet. Da läuft ein Modul, das ständig einen Haufen Sachen prüft. Als Ergebnis gibt es nur die Alarm-LED. Davon habe ich aber (noch) keine Kopie in picoC gebildet. Allein der allgemeine Alarm bringt Dich ja auch nicht weiter. Ich habe aber keine Ahnung, wie das bei NAZA funktioniert.

schöne Feiertage noch
Jörg

PS: mit time() kriegst Du die Zeit. Um dem System nicht zuviel CPU-% zu klauen, solltest Du besser delay() oder sync() benutzen und einfach zählen.
 
Zuletzt bearbeitet:
FPV1

Banggood

Oben Unten