- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 75

Thema: Ahnugslos zum erstem Bot

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Soltau - Niedersachsen
    Alter
    46
    Beiträge
    1.369
    aber na klar

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    15.09.2012
    Beiträge
    73
    Code:
            //Rückhub Unterdrückung durch Maximale Anzahl, oder Einseitigkeit, der Beine im Rückhub
                //sind mehr als (3-3 & 4-2 = 3 / 5-1 = 2) Beine im Rückhub, oder ist Rückhub auf 2 benachbarten Beinen (Längseitig) dann keinen Rückhub zulassen
                //es werden auch Rückhub-Kombinationen beide vorderen/hinteren Beine unterdrückt
                if (    ((Vor_Ruck_Hub[1]+Vor_Ruck_Hub[2]+Vor_Ruck_Hub[3]+Vor_Ruck_Hub[4]+Vor_Ruck_Hub[5]+Vor_Ruck_Hub[6]) >= Max_Anz_Beine_Ruckhub)
                        || (   ((y==1) && (Vor_Ruck_Hub[4]==1 || Vor_Ruck_Hub[2]==1))
                            || ((y==4) && (Vor_Ruck_Hub[1]==1 || Vor_Ruck_Hub[3]==1))
                            || ((y==3) && (Vor_Ruck_Hub[4]==1 || Vor_Ruck_Hub[6]==1))
                            || ((y==2) && (Vor_Ruck_Hub[5]==1 || Vor_Ruck_Hub[1]==1))
                            || ((y==5) && (Vor_Ruck_Hub[2]==1 || Vor_Ruck_Hub[6]==1))
                            || ((y==6) && (Vor_Ruck_Hub[5]==1 || Vor_Ruck_Hub[3]==1))
                            )
                    )
                {   Ruckhub_Unterdruckung = 1;  //keinen Rückhub zulassen
                } 
                else
                {   Ruckhub_Unterdruckung = 0;  //Rückhub zulassen
                }
            //ENDE Rückhub Unterdrückung
    
    		//----Vor_Ruck_Hub Umschalten
    		//über "Ziel_Drehwinkel_Bein" festgelegte Gradzahl wird Bein-Maximal-Auslenkung in mm berechnet (Schrittweite_MAX)
    		//aus Aktuellen Ist-Auslenkung in mm (LA_SOLL_WEG_D) wird der maximal fahrbare Weg berechnet, und bei Überschreiten von "Schrittweite_MAX" wird Vor_Ruck_Hub[y] umgeschalten
    		//dabei wird ein Vorwärts oder Rückwärts fahren beachtet
    		//unter der beachtung von "Ruckhub_Faktor" wird ein Positionsverlust, durch überschreiten des "Ziel_Drehwinkel_Bein" vermieden
    		//daher muß "Ruckhub_Faktor" alias "Winkel_Bein[0]" zuerst berechnet werden.
    		//da sich "Ziel_Drehwinkel_Bein"/"Schrittweite_MAX" durch die "Hohe_Global" ändert, ist bei änderung der Roboterhöhe eine Neuberechnung notwendig "HiMe_Hohe_geandert = Hohe_Global"
    
                HiMe_Schrittweite_Max = 0;                                                      //Muß vor dem Setzen rückgesetzt werden
    
    			if (WINKEL_Bein[y] < 0)															//wenn Bein-Winkel Negativ
    			{	if (Vor_Ruck_Hub[y] == 0)													//wenn Vorhub EIN
    				{	if (((Schrittweite_MAX + L_Bein_Vertikal_IST[y]) < (L_Bein_Vertikal_anderung*-1)) && Ruckhub_Unterdruckung == 0)		//Zielwert überschritten (bei Vorwärtsbewegung) / Nur in Rückhub gehen wenn es möglich ist
    					{	L_Bein_Vertikal_SOLL = ((Schrittweite_MAX*-1) - ((L_Bein_Vertikal_anderung + (Schrittweite_MAX + L_Bein_Vertikal_IST[y])) * Ruckhub_Faktor));   //Überschrittenen Wert (größer Schrittweite_MAX wieder abziehen)
    					    Vor_Ruck_Hub[y] = 1;			//und Vor_Ruck_Hub umschalten
                            Schrittweite_MAX_Uber[y] = 0;   //Gespeicherten erweiterten Grenzwert (durch überschreitung Istwert > Schrittweite_MAX) löschen
                            HiMe_Schrittweite_Max = 1;      //Schrittweite_Max wurde überschritten und L_Bein_Horrizontal_SOLL muß neu berechnet werden
                            if (y==6)                       //%-Wert von Synchrobein muß neu berechnet werden. %-Wert ist noch eine Rückhub Angabe. Somit würde ein Fehler auftreten, in Synchronisation der Beine (1-5)
                            {   Synchro_Bein = (((L_Bein_Vertikal_IST[6] + Schrittweite_MAX) * 100 ) / (2 * Schrittweite_MAX)) / Ruckhub_Faktor;                               //IST-Wert des SynchrobBeins
                            }
    					}
    					else
    					{	L_Bein_Vertikal_SOLL = L_Bein_Vertikal_IST[y] + L_Bein_Vertikal_anderung;                                                                       //normale Bein-Bewegung bei nicht überschritten
    					}
    				}
    				else																		//wenn Rückhub EIN
    				{	if ((Schrittweite_MAX + L_Bein_Vertikal_IST[y]) < (L_Bein_Vertikal_anderung*-1))		//Zielwert überschritten (bei Vorwärtsbewegung)
    					{	L_Bein_Vertikal_SOLL = (Schrittweite_MAX - (((L_Bein_Vertikal_anderung*-1) - (Schrittweite_MAX + L_Bein_Vertikal_IST[y])) / Ruckhub_Faktor / Synchro_Faktor))*-1;    //Überschrittenen Wert (größer Schrittweite_MAX wieder abziehen)
    						Vor_Ruck_Hub[y] = 0;                                                                                                                    //und Vor_Ruck_Hub umschalten
                            Schrittweite_MAX_Uber[y] = 0;   //Gespeicherten erweiterten Grenzwert (durch überschreitung Istwert > Schrittweite_MAX) löschen
                            HiMe_Schrittweite_Max = 1;      //Schrittweite_Max wurde überschritten und L_Bein_Horrizontal_SOLL muß neu berechnet werden
                            if (y==6)                       //%-Wert von Synchrobein muß neu berechnet werden. %-Wert ist noch eine Rückhub Angabe. Somit würde ein Fehler auftreten, in Synchronisation der Beine (1-5)
                            {   Synchro_Bein = ((L_Bein_Vertikal_IST[6] + Schrittweite_MAX) * 100 ) / (2 * Schrittweite_MAX);                               //IST-Wert des SynchrobBeins
                            }
    					}
    					else
    					{	L_Bein_Vertikal_SOLL = L_Bein_Vertikal_IST[y] + L_Bein_Vertikal_anderung;                                                                           //normale Bein-Bewegung bei nicht überschritten
    					}
    				}
    			}
    			else																			//wenn Bein-Winkel Positiv
    			{	if (Vor_Ruck_Hub[y] == 0)													//wenn Vorhub EIN
    				{	if (((Schrittweite_MAX - L_Bein_Vertikal_IST[y]) < L_Bein_Vertikal_anderung) && Ruckhub_Unterdruckung == 0)			//Zielwert überschritten (bei Rückwärtsbewegung) / Nur in Rückhub gehen wenn es möglich ist
    					{	L_Bein_Vertikal_SOLL = (Schrittweite_MAX - ((L_Bein_Vertikal_anderung - (Schrittweite_MAX - L_Bein_Vertikal_IST[y])) * Ruckhub_Faktor));    //Überschrittenen Wert (größer Schrittweite_MAX wieder abziehen)
    						Vor_Ruck_Hub[y] = 1;                                                                                                            //und Vor_Ruck_Hub umschalten
                            Schrittweite_MAX_Uber[y] = 0;   //Gespeicherten erweiterten Grenzwert (durch überschreitung Istwert > Schrittweite_MAX) löschen
                            HiMe_Schrittweite_Max = 1;      //Schrittweite_Max wurde überschritten und L_Bein_Horrizontal_SOLL muß neu berechnet werden
                            if (y==6)                       //%-Wert von Synchrobein muß neu berechnet werden. %-Wert ist noch eine Rückhub Angabe. Somit würde ein Fehler auftreten, in Synchronisation der Beine (1-5)
                            {   Synchro_Bein = (((L_Bein_Vertikal_IST[6] + Schrittweite_MAX) * 100 ) / (2 * Schrittweite_MAX)) / Ruckhub_Faktor;                               //IST-Wert des SynchrobBeins
                            }
    					}
    					else
    					{	L_Bein_Vertikal_SOLL = L_Bein_Vertikal_IST[y] + L_Bein_Vertikal_anderung;                                                                   //normale Bein-Bewegung bei nicht überschritten
    					}
    				}
    				else																		//wenn Rückhub EIN
    				{	if ((Schrittweite_MAX - L_Bein_Vertikal_IST[y]) < L_Bein_Vertikal_anderung)			//Zielwert überschritten (bei Rückwärtsbewegung)
    					{	L_Bein_Vertikal_SOLL = (Schrittweite_MAX - ((L_Bein_Vertikal_anderung - (Schrittweite_MAX - L_Bein_Vertikal_IST[y])) / Ruckhub_Faktor / Synchro_Faktor));    //Überschrittenen Wert (größer Schrittweite_MAX wieder abziehen)
    						Vor_Ruck_Hub[y] = 0;                                                                                                            //und Vor_Ruck_Hub umschalten
                            Schrittweite_MAX_Uber[y] = 0;   //Gespeicherten erweiterten Grenzwert (durch überschreitung Istwert > Schrittweite_MAX) löschen
                            HiMe_Schrittweite_Max = 1;      //Schrittweite_Max wurde überschritten und L_Bein_Horrizontal_SOLL muß neu berechnet werden
                            if (y==6)                       //%-Wert von Synchrobein muß neu berechnet werden. %-Wert ist noch eine Rückhub Angabe. Somit würde ein Fehler auftreten, in Synchronisation der Beine (1-5)
                            {   Synchro_Bein = ((L_Bein_Vertikal_IST[6] + Schrittweite_MAX) * 100 ) / (2 * Schrittweite_MAX);                               //IST-Wert des SynchrobBeins
                            }
    					}
    					else
    					{	L_Bein_Vertikal_SOLL = L_Bein_Vertikal_IST[y] + L_Bein_Vertikal_anderung;                                                                   //normale Bein-Bewegung bei nicht überschritten
    					}
    				}
    			}
    
            //Da bei einer Überschreitung von Schrittweite_MAX L_Bein_Vertikal_SOLL neu berechnet wird, ist auch eine Neuberechung von L_Bein_Horrizontal_SOLL notwendig 
            //Oder es wurde in den Kurvenlauf/Drehmodus umgeschalten und das Bein befindet sich nicht auf dem Idealen Radius (ergibt sich bei Bein 0°), sonst funktioniert die Synchronisation der Beine nicht, da Schrittweite_Max sich aus den idealen Radien ergibt.
            //Heranführen von L_Bein_Horrizontal an Offsetwert im geradeauslauf geschiet weiter oben im Programm (ca Z534)
            //im Vorhub ist aktueller R_Fussspitze zu beachten
            //im Rückhub wird auf idealen R_Fussspitze herangeführt
            if (Radius_Kurve != 0)  //nur im Kurvenlauf zu berechnen
            {   if ((HiMe_Schrittweite_Max == 1) && (Vor_Ruck_Hub[y] == 0))    //für Schrittweite_Max überschritten im Vorhub
                {   HiMe_R_Fusspitze = R_Fussspitze;
                } 
                else //für umschalten in den Drehmodus/Kurvenlauf um R_Fusspitze auf Idealwert (Bein @ 0°) heranzuführen
                {   if (Drehmodus == 1)
                    {   if (y==4 || y==5)
                        {   R_Fussspitze_Ideal = L_Bein_Horizontal_2 + L_Bein_Horrizontal_Offset; // R_Fußspitze in IST-Position zur Robotermitte (Mittlere Beine)
                        }
                        else
                        {   R_Fussspitze_Ideal = sqrt( square(L_Bein_Horizontal + L_Bein_Horrizontal_Offset) + square(L_Bein_Vertikal_rech));
                        }
                    }
                    else //wenn Kurvenlauf
                    {   if (y==2 || y==5 || y==6)	//Wenn BEIN LINKS
                        {	R_Fussspitze_Ideal = sqrt( square(Radius_Kurve + L_Bein_Horizontal_rech -L_Bein_Horrizontal_Offset) + square(L_Bein_Vertikal_rech));
                        }
                        else
                        {	R_Fussspitze_Ideal = sqrt( square(Radius_Kurve + L_Bein_Horizontal_rech + L_Bein_Horrizontal_Offset) + square(L_Bein_Vertikal_rech));
                        }
                    }
                }
    
                if ( ((HiMe_Schrittweite_Max == 1) && (Vor_Ruck_Hub[y] == 0)) || ((Vor_Ruck_Hub[y] == 1) && (R_Fussspitze != R_Fussspitze_Ideal)) )
                {   
                    if ((R_Fussspitze != R_Fussspitze_Ideal) && (Vor_Ruck_Hub[y] == 1)) //R_Fussspitze_Ideal schrittweiße heranführen um Sprung in der Bewegung zu vermeiden.
                    {   
                        HiMe_R_Fusspitze = R_Fussspitze + ((R_Fussspitze_Ideal - R_Fussspitze) * (1 - (L_Bein_Vertikal_IST_rech / Schrittweite_MAX)));
                    }
    
                    //L_Bein_Horrizontal_SOLL neu berechnen (Schrittweite_MAX wurde überschritten oder Bein befindet sich im Kurvenlauf/Drehmodus nicht auf idealen Radius)
                    if (Drehmodus == 1)
                    {   if (y==4 || y==5)   //r=185,05 @ Bein 0°
                        {   L_Bein_Horrizontal_SOLL =  sqrt( square(HiMe_R_Fusspitze) - square(L_Bein_Vertikal_SOLL)) - L_Bein_Horizontal_2;
                        }
                        else //r=201,85 @ Bein 0°
                        {   L_Bein_Horrizontal_SOLL =  sqrt( square(HiMe_R_Fusspitze) - square(L_Bein_Vertikal_rech + L_Bein_Vertikal_SOLL)) - L_Bein_Horizontal;
                        }
                    }
                    else //wenn Kurvenlauf
                    {   if (y==2 || y==5 || y==6)	//Wenn BEIN LINKS
                        {	if (Radius_Kurve < 0)
                            {   L_Bein_Horrizontal_SOLL = sqrt( square(HiMe_R_Fusspitze) - square(L_Bein_Vertikal_rech - L_Bein_Vertikal_SOLL)) + Radius_Kurve + L_Bein_Horizontal_rech;
                            }
                            else
                            {   L_Bein_Horrizontal_SOLL = Radius_Kurve - sqrt( square(HiMe_R_Fusspitze) - square(L_Bein_Vertikal_rech - L_Bein_Vertikal_SOLL)) + L_Bein_Horizontal_rech;
                            }
                        }
                        else
                        {	if (Radius_Kurve < 0)
                            {   L_Bein_Horrizontal_SOLL = (Radius_Kurve * -1) - sqrt( square(HiMe_R_Fusspitze) - square(L_Bein_Vertikal_rech + L_Bein_Vertikal_SOLL)) - L_Bein_Horizontal_rech;
                            }
                            else
                            {   L_Bein_Horrizontal_SOLL = sqrt( square(HiMe_R_Fusspitze) - square(L_Bein_Vertikal_rech + L_Bein_Vertikal_SOLL)) - Radius_Kurve  - L_Bein_Horizontal_rech;
                            }
                        }
                    }
                    HiMe_Schrittweite_Max = 0;  //berechnung erfolgt    
                }
            }
           //----ENDE Vor_Ruck_Hub
    
    	//Solllänge Bein berechnen
    	L_BEIN_SOLL = sqrt(square(L_Bein_Horrizontal_SOLL) + square(L_Bein_Vertikal_SOLL));
    	//Drehwinkel Bein berechnen		
    	WINKEL_Bein[y] = asin(L_Bein_Vertikal_SOLL / L_BEIN_SOLL) * 180/M_PI;
    
    	//berechnet die Höhe des Beins, inklusive Offset für Überlappenden Lauf
    		//die Höhe des Beins (-51mm bis 67mm Roboter Unterkante über Grund) wird für den Rückhub in einer Sinusfunktion berechnet.
    		//Bei Rückhub wird um den Wert "Synchro_Winkel" über "Zielwert_Drehwinkel_Bein" hinausgefahren
    		//Bei Vorhub wird um den Synchrowinkel Versatz die Höhe mit "Hohe_Offset" angehoben
    		//Synchrowinkel/2 bewirkt den Überlappenden Lauf
    
            if (L_Bein_Vertikal_SOLL < 0)														//WINKEL_Bein[y] immer Positiv machen
            {	L_Bein_Vertikal_SOLL_rech = L_Bein_Vertikal_SOLL * -1;
            }
            else
            {	L_Bein_Vertikal_SOLL_rech = L_Bein_Vertikal_SOLL;
            }
    
            if (Vor_Ruck_Hub[y] == 0)													//wenn Vorhub
            {   if ((L_Bein_Vertikal_SOLL_rech >= Schrittweite_MAX-(UberLauf_rech/2)) && Ruckhub_Unterdruckung == 0)	//wenn Zielwert_Drehwinkel_Bein noch nicht erreicht (ANFANG Vorhub) / wenn Rückhub gesperrt, dann kein Anheben des Beins durch Hohe_Offset
                {   HoheBein = (Hohe_Global - (Hohe_Offset * ((L_Bein_Vertikal_SOLL_rech - (Schrittweite_MAX-(UberLauf_rech/2))) / (UberLauf_rech/2))));    //wenn Bein in Bereich Überlappendenlauf kommt, um Offsetwert anheben (dieser wird Schrittweiten abhänig angepasst, geradlinig, um ein "Stampfen zu verhindern), dies ermöglich das Aus- und Ein- Schwingen des Beines, um ein Abbremsen des Roboters zu verhindern (Bein ist im Rückhub sehr schnell, und braucht etwas zur Richtungsumkehr, daher Uberlauf_rech)
                }
                else
                {	HoheBein = Hohe_Global;										//sonst Beinhöhe Global
                }
            }
            else																		//wenn Rückhub dann Beinhöhe über Sinusfunktion
            {   HoheBein = (Hohe_Global-Hohe_Offset)-(sin(((Schrittweite_MAX-L_Bein_Vertikal_SOLL_rech)*(90/Schrittweite_MAX))/180*M_PI)*(Hohe_Global-Hohe_Offset)); //(Hohe_Offset+((Hohe_Global-Hohe_Offset)-(sin((90-(WINKEL_Bein_hohe[c]/((Ziel_Drehwinkel_Bein+Synchro_Winkel)/90)))/180*M_PI)*(Hohe_Global-Hohe_Offset)))* 10) + 510;
            }
    	//ENDE Höhe Bein
    	
    	    DIAGONALE = sqrt(((HoheBein + FIX_HOHE) * (HoheBein + FIX_HOHE)) + square(L_BEIN_SOLL));       //
    	    HILF_A = ((BEIN_OS * BEIN_OS) - (BEIN_US * BEIN_US) + (DIAGONALE * DIAGONALE))/(2 * DIAGONALE);    //
    	    WINKEL_a = acos((HILF_A / BEIN_OS)) * 180/M_PI;                                            //
    	    WINKEL_OS[y] = (asin(L_BEIN_SOLL / DIAGONALE) * 180/M_PI) + WINKEL_a - 90;                //Übergabewert Servo_OS
    	    WINKEL_KNIE[y] = (asin((DIAGONALE - HILF_A) / BEIN_US) * 180/M_PI) + (90 - WINKEL_a) - 90;     //Übergabewert Servo_US	
    
    		//die errechneten Werte noch für die nächste Berechnung mit übernehmen
            L_Bein_Horrizontal_IST[y] = L_Bein_Horrizontal_SOLL; //nur wichtig bei Radiuslauf
            L_Bein_Vertikal_IST[y] = L_Bein_Vertikal_SOLL;
    }
    //ENDE--------------------------- Bein Berechnungen ----------------------------------------
    
    short int	HiMe_Hohe_geandert;					//Höhe wurde geändert, somit muss Ruckhub_Faktor und Zielwert_Drehwinkel_Bein neu berechent werden
    float       Hohe_Global_Speicher;                   //Speichert den Wert Höhe Global um ihn später wieder anfahren zu können
    
    void Hohe_geandert (void)						//Höhe wurde geändert, somit muss Ruckhub_Faktor und Zielwert_Drehwinkel_Bein neu berechent werden
    {
        //Zielwert_Drehwinkel_Bein
        //berechnet sich aus der Beinhöhe, um Kollision der Beine zu verhindern
        if (Hohe_Global > -15)												//gilt nur bei Höhe größer -15mm (bei weniger Zielwert Drehwinkel Bein = 42°)
        {    HiMe_MaxAUSLbein = L_Bein_Horrizontal_Offset * tan((42-((Hohe_Global+15)/2.05)) * M_PI/180);   //Maximalen Auslenkung aus Höhe Berechen------------------------------------->HIER kann die Automatische Auslenkung geändert werden
    
            if(HiMe_MaxAUSLbein < 36)														//Mindestwert Auslenkung ist ist 36mm
            {   HiMe_MaxAUSLbein = 36;
            }
    
            if (HiMe_MaxAUSLbein < Maxauslenkung_Bein_Eingabe)							//den kleineren der Beiden Werte als Maximalwinkel setzen
            {   Maxauslenkung_Bein = HiMe_MaxAUSLbein;
            }
            else
            {   Maxauslenkung_Bein = Maxauslenkung_Bein_Eingabe;
            }
        }
        else
        {   if(Maxauslenkung_Bein_Eingabe < 81)									//bei Höhe kleiner -15mm, dann Maximalauslenkung 42° oder kleinere Eingabe
            {   Maxauslenkung_Bein = Maxauslenkung_Bein_Eingabe;
            }
            else
            {   Maxauslenkung_Bein = 81;                             //Maximalauslenkung 42°
            }
        }
    
        //-------------------------------- Rückhubfaktor festlegen---------------------------------
        //Rückhubfaktor festlegen, bei 3-3 gibt es keinen Startwinkel (was Bein von 0° versetzt ist)
        if (Laufmodus == 33)	//bei Laufmodus 3-3 ist der Startwinkel 0°, deswegen separate Berechnung
        {	Ruckhub_Faktor = (Maxauslenkung_Bein) / (Maxauslenkung_Bein - (2*Uberlappenderlauf));
        }
        else
        {	Ruckhub_Faktor = (Maxauslenkung_Bein * Ruckhub_Geschwindigkeit) / ((Maxauslenkung_Bein - (2*Uberlappenderlauf)) - (Maxauslenkung_Bein-((Maxauslenkung_Bein+(Maxauslenkung_Bein-(Uberlappenderlauf*2)))/Ruckhub_Geschwindigkeit)));
        }
        //ENDE---------------------------- Rückhubfaktor festlegen---------------------------------
    		
        HiMe_Hohe_geandert = Hohe_Global;								    //Wert für Vergleich übernehmen
    
    }
    
    //------------------------------- Grundstellung --------------------------------------------
    //Beim erstmaligen Programmstart müssen die Beine in eine definierte Position gebracht werden.
    //Auch bei Fehlern nötig, wenn z.B. L_Bein_Vertikal oder L_Bein_Horrizontal Werte überschreiten, die Hardwaremäßig (zuviel mm) nicht ausführbar sind
    //USART-Empfang sperren, und Bewegungsinfos auf 0 setzen, Drehmodus auf 0
    //Roboterhöhe Speichern, und Roboter absenken, das Beine frei schweben
    //Sollwerte berechnen, aus LAufmosi
    //L_Bein_Horrizontal auf Offsetwert anpssen, falls Wert überlaufen war (<0 oder Doppelter Offsetwert) auf Offsetwert springen
    //L_Bein_Vertikal auf Offsetwert anpssen, falls Wert überlaufen war (<0 oder Doppelter Maximalauslenkungswert) auf Zielwert springen
    //Wenn alle 6 Beine auf Zielwerten stehen, dann Roboter_Höhe wieder auf ausgangswert anheben und Programm beenden.
    
        char Grundstellung_ausfuhren = 1;           //Grundstellung wird ausgeführt, es wird USART-Empfang und Grundstellung ignoriert
    
    void Grundstellung (void)                       //Beine in Grundstellung bringen (ist beim erstmaligen Einschlten, Laufmoduswechsel???, oder Fehlern in der Berechnung der Beine nötig)
    {   float       L_Bein_Vertikal_Grundstellung[7];       //Startwert für Bein in mm (wie L_Bein_Vertikal_IST/SOLL)
        short int   Sollpositionen_erreicht;                //L_Bein_vertikal_IST und L_Bein_Horrizontak_IST sind auf Startwerte erreicht
        int         i = 1;                                       //Hilfbit für Schleife
    
        if (Grundstellung_ausfuhren == 0)   //Roboterbewegung verhindern, durch Überspringen des USART-Empfang in Hauptschleife
        {   Roboter_bewegung_mm = 0;
            Radius_Kurve = 0;
            Drehmodus_Speicher = Drehmodus;                     //um richtigen Sollwert für Drehmodus auszuwählen. Sonst Fehler bei Drehmodus und 3-3   
            Drehmodus = 0;
            Grundstellung_ausfuhren = 1;                        //Die Beine werden in Grundstellung gebracht, und verriegeln den USART-Empfang, die Berechnung zum Drehmodus, ...?
            Hohe_Global_Speicher = Hohe_Global;                 //nach erlogten Startwert/Offsetwert anfahren, die ursprüngliche Roboter-Höhe wieder anfahren
            Sollpositionen_erreicht = 0;                        //einmalig initialisieren, pro Funktionsaufruf
    
            //alle Beine in Vorhub, für alle Laufmodi
            Vor_Ruck_Hub[1] = 0;
            Vor_Ruck_Hub[2] = 0;
            Vor_Ruck_Hub[3] = 0;
            Vor_Ruck_Hub[4] = 0;
            Vor_Ruck_Hub[5] = 0;
            Vor_Ruck_Hub[6] = 0;
        }
     
        //Roboter absetzen und Fußspitzen auf 3mm über Boden anheben, damit Beine frei zum bewegen sind.
        if (Grundstellung_ausfuhren == 1)
        {   if (Hohe_Global > (Hohe_Offset * -1))               //Roboter Höhe absenken, bis Fußspitzen 3mm über Boden schweben
            {   if (Hohe_Global <= ((Hohe_Offset * -1) + 0.1)) //Wenn Grenzwert fast erreicht, und durch rechnen nicht mehr erreicht werden kann.
                {   Hohe_Global = (Hohe_Offset * -1);
                }
                else
                {   Hohe_Global -= 0.1;                        //Höhe pro Schleifendurchgang anpassen
                }
            }
            else
            {   if (Hohe_Global >= ((Hohe_Offset * -1) - 0.1))   //Wenn Grenzwert fast erreicht, und durch rechnen nicht mehr erreicht werden kann.
                {   Hohe_Global = (Hohe_Offset * -1);
                }
                else
                {   Hohe_Global += 0.1;                        //Höhe pro Schleifendurchgang anpassen
                }
            }
    
            if (Hohe_Global == (Hohe_Offset * -1))              //Fußspitzen berühren nicht mehr den Boden und können bewegt werden
            {   Grundstellung_ausfuhren = 2;
            }
        } 
    
        //Sollposition bestimmen, Vertikal aus Laufmodi und Maximalauslenkung Bein. Horrizontal aus Offsetwert errechnen
        //L_Bein_Vertikal aus Laufmodus bestimmen. Es wird der Startwert festgelegt (Beinspreizung beginnent mit Bein6 @100%)
        //verrechnen das (100% = 1 / 50# = 0 / 0% = -1) ergeben, und mit Maxauslenkung_Bein multiplizieren
        if (Laufmodus == 33) 
        {   Ruckhub_Geschwindigkeit = 1;
            Hohe_geandert();                                    //muß ausgeführt werden, das sich Rückhubgeschwindigkeit ändert, und somit eine neue Rückhub_Faktor ergibt
    
            L_Bein_Vertikal_Grundstellung[2] = Maxauslenkung_Bein;
            L_Bein_Vertikal_Grundstellung[5] = ((0.5 - ((100*Uberlappenderlauf/Maxauslenkung_Bein)/100)) * -2) * Maxauslenkung_Bein;
            L_Bein_Vertikal_Grundstellung[6] = Maxauslenkung_Bein;
            //Bei Drehmodus müßen für Bein 1,3,4 andere Sollwerte angefahren werden.(Theoretisch auch L_Bein_Horrizontal. / und * Schrittweite_MAX)
            if (Drehmodus_Speicher == 0)    //Geradeaus
            {   L_Bein_Vertikal_Grundstellung[1] = ((0.5 - (1 - (((100/Ruckhub_Geschwindigkeit) - ((100*Uberlappenderlauf/Maxauslenkung_Bein)/Ruckhub_Geschwindigkeit))/100)))* -2) * Maxauslenkung_Bein;
                L_Bein_Vertikal_Grundstellung[3] = ((0.5 - ((100*Uberlappenderlauf/Maxauslenkung_Bein)/100)) * -2) * Maxauslenkung_Bein;
                L_Bein_Vertikal_Grundstellung[4] = Maxauslenkung_Bein; 
            } 
            else                            //Drehmodus
            {   L_Bein_Vertikal_Grundstellung[1] = ((0.5 - ((((100/Ruckhub_Geschwindigkeit) - ((100*Uberlappenderlauf/Maxauslenkung_Bein)/Ruckhub_Geschwindigkeit))/100)))* -2) * Maxauslenkung_Bein;
                L_Bein_Vertikal_Grundstellung[3] = L_Bein_Vertikal_Grundstellung[1];
                L_Bein_Vertikal_Grundstellung[4] = Maxauslenkung_Bein * -1;//0%
            }
            Max_Anz_Beine_Ruckhub = 3;         //Maximale Anzahl an Beinen die sich im Rückhub befinden dürfen. Wird in Bein_Berechnungen bei der Umschaltung Vorhub_Rückhub berücksichtigt (Ruckhub_Unterdruckung), und ist für jeden Laufmodi anders.
        }
        if (Laufmodus == 42)
        {   Ruckhub_Geschwindigkeit = 2;       //Faktor den sich das Bein bei Rückhub schneller bewegt also Vorhub
            Hohe_geandert();                                    //muß ausgeführt werden, das sich Rückhubgeschwindigkeit ändert, und somit eine neue Rückhub_Faktor ergibt
    
            L_Bein_Vertikal_Grundstellung[1] = Maxauslenkung_Bein;//((0,5 - ((((100/Ruckhub_Geschwindigkeit) - ((100*Uberlappenderlauf/Maxauslenkung_Bein)/Ruckhub_Geschwindigkeit))/100) * 0)) * -2 );
            L_Bein_Vertikal_Grundstellung[2] = ((0.5 - (1 - (((100/Ruckhub_Geschwindigkeit) - ((100*Uberlappenderlauf/Maxauslenkung_Bein)/Ruckhub_Geschwindigkeit)) * 2/100))) * -2) * Maxauslenkung_Bein;
            L_Bein_Vertikal_Grundstellung[3] = ((0.5 - (1 - (((100/Ruckhub_Geschwindigkeit) - ((100*Uberlappenderlauf/Maxauslenkung_Bein)/Ruckhub_Geschwindigkeit))/100)))* -2) * Maxauslenkung_Bein;
            L_Bein_Vertikal_Grundstellung[4] = L_Bein_Vertikal_Grundstellung[2];	//ist gleich wie Bein 2
            L_Bein_Vertikal_Grundstellung[5] = L_Bein_Vertikal_Grundstellung[3];	//ist gleich wie Bein 3
            L_Bein_Vertikal_Grundstellung[6] = Maxauslenkung_Bein;	//ist gleich wie Bein 1
    
            Max_Anz_Beine_Ruckhub = 3;         //Maximale Anzahl an Beinen die sich im Rückhub befinden dürfen. Wird in Bein_Berechnungen bei der Umschaltung Vorhub_Rückhub berücksichtigt (Ruckhub_Unterdruckung), und ist für jeden Laufmodi anders.
        }
        if (Laufmodus == 51)
        {   Ruckhub_Geschwindigkeit = 5;       //Faktor den sich das Bein bei Rückhub schneller bewegt also Vorhub
            Hohe_geandert();                                    //muß ausgeführt werden, das sich Rückhubgeschwindigkeit ändert, und somit eine neue Rückhub_Faktor ergibt
    
            L_Bein_Vertikal_Grundstellung[1] = ((0.5 - (1 - ((100/Ruckhub_Geschwindigkeit) - ((100*Uberlappenderlauf/Maxauslenkung_Bein)/Ruckhub_Geschwindigkeit))/100)) * -2) * Maxauslenkung_Bein;
            L_Bein_Vertikal_Grundstellung[2] = ((0.5 - (1 - (((100/Ruckhub_Geschwindigkeit) - ((100*Uberlappenderlauf/Maxauslenkung_Bein)/Ruckhub_Geschwindigkeit)) * 4/100))) * -2) * Maxauslenkung_Bein;
            L_Bein_Vertikal_Grundstellung[3] = ((0.5 - (1 - (((100/Ruckhub_Geschwindigkeit) - ((100*Uberlappenderlauf/Maxauslenkung_Bein)/Ruckhub_Geschwindigkeit)) * 3/100))) * -2) * Maxauslenkung_Bein;
            L_Bein_Vertikal_Grundstellung[4] = ((0.5 - (1 - (((100/Ruckhub_Geschwindigkeit) - ((100*Uberlappenderlauf/Maxauslenkung_Bein)/Ruckhub_Geschwindigkeit)) * 5/100))) * -2) * Maxauslenkung_Bein;
            L_Bein_Vertikal_Grundstellung[5] = ((0.5 - (1 - (((100/Ruckhub_Geschwindigkeit) - ((100*Uberlappenderlauf/Maxauslenkung_Bein)/Ruckhub_Geschwindigkeit)) * 2/100))) * -2) * Maxauslenkung_Bein;
            L_Bein_Vertikal_Grundstellung[6] = Maxauslenkung_Bein;	//Bein 6 ist bei 100%, deshalb ist Fahktor für Schrittweite_MAX verrechnung auch 1.
    
            Max_Anz_Beine_Ruckhub = 2;         //Maximale Anzahl an Beinen die sich im Rückhub befinden dürfen. Wird in Bein_Berechnungen bei der Umschaltung Vorhub_Rückhub berücksichtigt (Ruckhub_Unterdruckung), und ist für jeden Laufmodi anders.
        }
    
        //Beinabstände zum Roboter auf Offsetwert/Startwert herranführen
        if (Grundstellung_ausfuhren == 2)   
        {   i = 1;                                                                              //sonst wird die for Schleife beim nächsten Durchlauf nicht abgeabreitet
    
            for (i=1; i<=6 ; i++)
            {   if (L_Bein_Horrizontal_IST[i] != L_Bein_Horrizontal_Offset)                     //nur L_Bein_Horrizontal_IST herranführen wenn es eine Abweichung zu L_Bein_Horrizontal_Offset gibt, sonst als O.K. markieren 
                {   if ((L_Bein_Horrizontal_IST[i] <= 0) || (L_Bein_Horrizontal_IST[i] >= (2*L_Bein_Horrizontal_Offset)))   //Falls Horrizontaler Beinabstand kleiner 0, oder Doppelter Offsetwert ist, dann sofort auf Offsetwert / FEHLERPRÜFUNG
                    {   L_Bein_Horrizontal_IST[i] = L_Bein_Horrizontal_Offset;
                    }
                    // L_Bein_Horrizontal_IST an Offsetwert herranführen
                    if (L_Bein_Horrizontal_IST[i] <= L_Bein_Horrizontal_Offset) //Fußspitze nach Außen bewegen
                    {   if (L_Bein_Horrizontal_IST[i] >= (L_Bein_Horrizontal_Offset - 0.5))    //wenn Angleichung an Offsetwert nicht per Schleifendruchlauf angepasst werden kann
                        {   L_Bein_Horrizontal_IST[i] = L_Bein_Horrizontal_Offset;
                        }
                        else
                        {   L_Bein_Horrizontal_IST[i] += 0.5;
                        }
                        
                    }
                    else
                    {   if (L_Bein_Horrizontal_IST[i] <= (L_Bein_Horrizontal_Offset + 0.5))    //wenn Angleichung an Offsetwert nicht per Schleifendruchlauf angepasst werden kann
                        {   L_Bein_Horrizontal_IST[i] = L_Bein_Horrizontal_Offset;
                        }
                        else
                        {   L_Bein_Horrizontal_IST[i] -= 0.5;
                        }
                    }
                } 
                else
                {   Sollpositionen_erreicht |= 1<<(i-1);        //wenn L_Bein_Horrizontal_IST[i] herrangeführt dann bit markieren (0000 0000 00xx xxxx)
                }
                
                // L_Bein_Vertikal_IST an Startwert herranführen
                if (L_Bein_Vertikal_IST[i] != L_Bein_Vertikal_Grundstellung[i])                 //nur L_Bein_Vertikal_IST herranführen wenn es eine Abweichung zu L_Bein_Vertikal_Grundstellung gibt, sonst als O.K. markieren 
                {   if ((L_Bein_Vertikal_IST[i] < (Maxauslenkung_Bein * -2)) || (L_Bein_Vertikal_IST[i] > (Maxauslenkung_Bein * 2)))    //Falls Vertikale Auslenkung mehr als Doppelt so Groß ist / FEHLERPRÜFUNG
                    {   L_Bein_Vertikal_IST[i] = 0;
                    }
    
                    if (L_Bein_Vertikal_IST[i] <= L_Bein_Vertikal_Grundstellung[i])
                    {   if (L_Bein_Vertikal_IST[i] >= (L_Bein_Vertikal_Grundstellung[i] - 0.5))    //wenn Angleichung an Offsetwert nicht per Schleifendruchlauf angepasst werden kann
                        {   L_Bein_Vertikal_IST[i] = L_Bein_Vertikal_Grundstellung[i];
                        }
                        else
                        {   L_Bein_Vertikal_IST[i] += 0.5;
                        }
                    }
                    else
                    {   if (L_Bein_Vertikal_IST[i] <= (L_Bein_Vertikal_Grundstellung[i] + 0.5))    //wenn Angleichung an Offsetwert nicht per Schleifendruchlauf angepasst werden kann
                        {   L_Bein_Vertikal_IST[i] = L_Bein_Vertikal_Grundstellung[i];
                        }
                        else
                        {   L_Bein_Vertikal_IST[i] -= 0.5;
                        }
                    }
                } 
                else
                {   Sollpositionen_erreicht |= 1<<(i+7);                                            //wenn L_Bein_Vertikal_IST[i] herrangeführt dann bit markieren (00xx xxxx 0000 0000)
                }
            }
    
            if (Sollpositionen_erreicht == 0b0011111100111111)                                      //wenn alle Beine auf Startwerte herangeführt dann fertig für nächsten Schritt   0b0011111100111111 = 16191
            {   Grundstellung_ausfuhren = 3;
            }
        }
    
        //nach erlogten Startwert/Offsetwert anfahren, die ursprüngliche Roboter-Höhe wieder anfahren
        if (Grundstellung_ausfuhren == 3)
        {   if (Hohe_Global > Hohe_Global_Speicher)                 //Roboter Höhe absenken auf gespeicherten Wert (vor Grundstellung)
            {   if (Hohe_Global <= (Hohe_Global_Speicher + 0.1))   //Wenn Grenzwert fast erreicht, und durch rechnen nicht mehr erreicht werden kann.
                {   Hohe_Global = Hohe_Global_Speicher;
                }
                else
                {   Hohe_Global -= 0.1;                            //Höhe pro Schleifendurchgang anpassen
                }
            }
            else
            {   if (Hohe_Global >= (Hohe_Global_Speicher - 0.1))   //Wenn Grenzwert fast erreicht, und durch rechnen nicht mehr erreicht werden kann.
                {   Hohe_Global = Hohe_Global_Speicher;
                }
                else
                {   Hohe_Global += 0.1;                            //Höhe pro Schleifendurchgang anpassen
                }
            }
    
            if (Hohe_Global == Hohe_Global_Speicher)                //gespeicherte Höhe, von vor Grundstellungsprogrogramm ist wieder hergestellt
            {   Grundstellung_ausfuhren = 0;
            }            
        }
    }
    
    //ENDE--------------------------- Grundstellung --------------------------------------------
    - - - Aktualisiert - - -

    das waren dann alle 3 Teile

    Die Funktion "Bein Berechnungen" wird dann in der Hauptschleife 6 mal aufgerufen. Von 6 bis 1, das liegt daran das die Synchronisation der Beinspreizung (Winkel/Stellungen zu einander) vom Bein 6 aus beginnt.
    Ich weiß das man es bestimmt geordneter schreiben kann, aber für mich war das der Weg meines 1. C Projekts.

  3. #3
    HaWe
    Gast
    danke, aber - puh - das ist ja deutlich, ja sogar extrem mehr Aufwand als ich je vermutet hätte!

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    15.09.2012
    Beiträge
    73
    Die reine Beinbewegung, lokal auf ein einzelnes Bein betrachten sind nur die letzten ~20Zeilen der Funktion (Beinberechnungen). Der große Rest ist dann wann welches Bein Wo und wann sein soll.
    Bestimmt gibt es noch elegantere Wege, bloß den kenn ich auch nicht. Ich halte selbst auch nicht viel vom Abschreiben, wenn dann will allein hin bekommen. Aber irgendwo braucht man immer einen Anfang.

  5. #5
    HaWe
    Gast
    ja klar, ich finde es schon bemerkenswert wie du das gelöst hast!

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    15.09.2012
    Beiträge
    73
    Die Nabelschnur ist jetzt ab. Die Stromversorgung läuft über ein SBEC (angeblich bis 20A). Und für die Fernsteuerung habe ich einen alten Playstation Dualshock2 Controller geschlachtet. An dem ist aber auch nur noch das Gehäuße orginal. Die Stromversorgung wurde mit einen Miniakkupack (4xNimH) realsiert. Controller ist ein ATXmega128A1u, der etwas überdimensioiert ist. Datenübertragung bewälltigen 2 BTM220a.

    Hat jemand erfahrung mit den Bluetoothmodulen? Ich habe eine Verzögerung von ca. 1Sekunde (geschäzt), zwischen Eingabe an der Fernbedieung und der umsetzung im Roboter.

    Klicke auf die Grafik für eine größere Ansicht

Name:	DSC_0713.jpg
Hits:	25
Größe:	35,4 KB
ID:	31992 Klicke auf die Grafik für eine größere Ansicht

Name:	DSC_0722.jpg
Hits:	14
Größe:	27,3 KB
ID:	31993

  7. #7
    HaWe
    Gast
    welche BT Module?

Ähnliche Themen

  1. Pro-Bot 128 - Tipps zum Zusammenbau
    Von nechegris im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 5
    Letzter Beitrag: 25.02.2010, 15:21
  2. Allgemeines zum C't-Bot
    Von Jobot im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 5
    Letzter Beitrag: 03.02.2010, 19:16
  3. Backleds leuchten bei erstem Test nicht!
    Von triXzer im Forum Asuro
    Antworten: 28
    Letzter Beitrag: 23.09.2009, 20:06
  4. problem mit erstem eigenen programm
    Von rocketman123 im Forum Asuro
    Antworten: 18
    Letzter Beitrag: 03.10.2007, 18:43
  5. 3D Programm gesucht zum erstellen von Bot Modellen
    Von By0nIk im Forum Software, Algorithmen und KI
    Antworten: 7
    Letzter Beitrag: 03.04.2006, 07:11

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test