Liste der Anhänge anzeigen (Anzahl: 8)
Roboterbasis mit Mecanum Wheels
Moin!
Zum Jahresende finde ich wenigstens mal die Zeit, noch so diverse halbfertige Projekte zu bearbeiten, die ich noch in der Pipeline habe ... :-) Ein bißchen weitergekommen bin ich in den letzten Tagen mit folgendem:
Neben den Allseitenrädern, mit denen ich bisher schon ein wenig experimentiert habe, gibt es ja noch die sog. Mecanum Wheels. Ich habe mir kürzlich einen Satz 100 mm Mecanum Wheels direkt vom chinesischen Hersteller nexusrobot besorgt, um auch diesen Radtyp mal praktisch kennenzulernen. Die Räder machen einen sehr guten Eindruck.
Anhang 29536 Anhang 29537
Ich habe Adapternaben zum Verbinden der Räder mit vier Getriebemotoren, die ich noch rumliegen hatte, angefertig:
Anhang 29538 Anhang 29539 Anhang 29540
Die Motoren mit den Rädern wurden ihrerseits an einer einfachen Rahmenkonstruktion aus Aluminium-Strangprofilen befestigt. Somit war auf ziemlich simple Art eine mobile Basis mit Mecanum Wheels schnell fertiggestellt:
Anhang 29541 Anhang 29542 Anhang 29543
Der nächste Schritt besteht nun darin, die Motorachsen mit Drehencodern auszustatten und geeignete Motortreiber aufzubauen, um die erforderliche Drehzahlregelung für die vier Achsen umzusetzen.
Auf meiner Homepage gibt's noch ein paar Bilder mehr.
Fortsetzung folgt ... :-)
Gruß
Malte
Liste der Anhänge anzeigen (Anzahl: 5)
Mal ein kurzes Update ...
Ich habe mittlerweile die Elektronik für die Getriebemotoren fertig. Jeder Motor bekommt eine Platine mit eigenem mega168. Die AVRs werden als I2C Slaves von dem übergeordneten Master-Controller angesprochen, optional ggf. über einen PCA9600. Ein AS5048A (magnetischer Drehencoder) misst die Stellung des Motorabtriebs. Das klappt bei dem Motor sehr gut, weil der Abtrieb auf der Rückseite des Getriebekastens rausguckt. Dort befindet sich der Magnet für den Encoder, die Platine mit dem Encoder und dem Rest der Elektronik ist über Sechskantbolzen in den Befestigungslöchern der Getrieberückwand verschraubt. Dadurch ist die Platine genau ausgerichtet. Motortreiber ist ein - eventuell etwas unterdimensionierter - DRV8801. Der lokale AVR wird dann später auf dieser Grundlage eine Drehzahlregelung für das jeweilige Rad durchführen. Die Regelung zu implementieren ist jetzt der nächste Schritt. Hier ein paar Bilder:
Anhang 29821 Anhang 29822 Anhang 29823
Anhang 29824 Anhang 29825
Fortsetzung folgt!
Gruß
Malte
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
Zitat:
In Bezug auf Daisy-Chain würde ich dir empfehlen pro Platine zwei Datenstecker vorzusehen, dann kann man einen Stecker als Eingang und einen als Ausgang verwenden. Ist ein wenig angenehmer beim verkabeln.
Ich habe ja einen Stecker für Flachbandkabel-Quetschverbinder vorgesehen. Ein Flachbandkabel mit mehreren Buchsen schleift die Signale ja quasi auch einfach nur durch. Insofern braucht man für Daisy Chain nichtmal mehr als eine Buchse pro Slave.
Ich habe mir mittlerweile mal ein paar Sprungantworten des Antriebs angeguckt. Ich habe dazu die PWM in Schritten von 16 von 15 bis 255 (8 bit PWM) erhöht und rückwärts wieder erniedrigt. Währenddessen habe ich die Drehzahl in einem Intervall von 2.048 ms aufgezeichnet. Die Treppe habe ich viele Male wiederholt und dann samplegenau gemittelt. Das Video nur zur Anschauung, hat ansonsten keinen Erklärungswert.
http://youtu.be/izpkCuhH2BE
Abgesehen von einer Schwelle am unteren Ende des Drehzahlbereiches verhält sich das Ding recht linear - besser als ich erwartet habe. Ich habe die Ausgleichsvorgänge nach einem Sprung mal als PT1-Glied gefittet (f(t) = k*(1-e-t/τ)), auch das kommt sehr gut hin. Schaut man sich die Zeitkonstanten über sämtliche Sprünge an, sind sie einigermaßen im selben Bereich, wiederum abgesehen vom ersten Schritt nach der Schwelle, aber das ist ja auch nicht weiter überraschend. Folgend mal als Bild (die x-Achse ist etwas wild, aber man sieht wohl was es bedeutet). Die mit höherer Auflösung gezeigten Sprungantworten sind beliebige Beispiele.
Anhang 29857
Jetzt muss ich mal überlegen wie ich weitermache. Ein wenig (wirklich nur ein wenig) mehr Erfahrung habe ich mit Temperaturregelungen, die Regelstrecken mit denen ich da bisher zu tun hatte, konnte man enigermaßen als PT2 modellieren, was eine Parametrisierung über die klassischen Einstellregeln erlaubt hat (wobei ich dann immer auch noch per Hand nachgetuned habe). Da das PT1 natürlich keine Verzugszeit hat, die bei den Einstellregeln (ich kenne nur Chien/Hrones/Reswick und Ziegler/Nichols wie hier beschrieben) aber immer im Nenner steht, kann man diese nicht sinnvoll verwenden. Vielleicht ist das mal ein Anlass, ein ordentliches Modell in Matlab zu basteln.
Gruß
Malte
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,
ich habe den Regelkreis jetzt doch mal als ganz simples Modell in Matlab nachgebaut. Falls jemand Interesse hat, hier der Code. Das ist ausdrücklich kein guter Matlab-Code!
Code:
clear
if 1
% sprünge
soll = [zeros(1, 100) ...
ones(1, 200)*20 ...
zeros(1, 100) ...
ones(1, 200)*-40 ...
zeros(1, 100) ...
ones(1, 200)*60 ...
zeros(1, 100) ...
ones(1, 200)*80 ...
zeros(1, 100)];
else
% rampen
soll = [-80:2:80 ...
-80:1:80 ...
-80:0.5:80 ...
-80:0.25:80];
end
% streckeneigenschaften
v = 0.38;
T1 = 13;
% PID parameter
Kp = 6;
Ki = 0.35;
Kd = 0;
Ta = 1; % entspr. 2.048 ms
% init
y = 0;
eSum = 0;
eOld = 0;
yOld = 0;
for i = 1:length(soll)
w = soll(i);
%% PID
e = w - y;
eSum = eSum + e;
P = Kp*e;
I = Ki * Ta * eSum;
D = Kd/Ta*(e - eOld);
u = P+I+D;
eOld = e;
u(u>208) = 208; % max. stellwert
u(u<-208) = -208;
%% PT1 strecke
y = yOld + 1/T1 * (v * u - yOld);
yOld = y;
%% doku
y_(i) = y;
u_(i) = u;
w_(i) = w;
e_(i) = e;
P_(i) = P;
I_(i) = I;
D_(i) = D;
end
% darstellung
disp(['Summenfehler: ' num2str(eSum)])
subplot(2, 1, 1)
plot(soll, 'LineWidth', 2)
hold on
plot(y_, 'r', 'LineWidth', 2)
set(gca, 'XLim', [0 length(y_)])
xlabel('Zeit [Ticks]')
ylabel('Drehzahl')
legend('soll', 'ist')
subplot(2, 1, 2)
plot(P_, 'LineWidth', 2)
hold on
plot(I_, 'g', 'LineWidth', 2)
plot(u_, 'r', 'LineWidth', 2)
set(gca, 'XLim', [0 length(y_)])
xlabel('Zeit [Ticks]')
ylabel('Wert')
legend('P', 'I', 'Stellwert')
Die Abhängigkeit der Drehzahl von der PWM wurde wie oben gesagt als PT1 angenommen, für Zeitkonstante und Streckenverstärkung wurden die empirisch ermittelten Werte verwendet. Um die Nichtlinearität durch die Schwelle wegzubekommen habe ich den PWM Wert einfach verschoben, die tatsächliche Aktivierung von 47 bis 255 sieht der Regler als 0 bis 208. Ich habe dann per Hand mit den Parametern gespielt, bis das Regelverhalten gut aussah. Es stellte sich schnell heraus, dass der D-Anteil keine wesentliche Verbesserung des Regelverhaltens bringt, ich habe ihn dann rausgeschmissen. Es war wohl nicht anders zu erwarten als dass der PID sehr gut mit einer perfekt linearen Regelstrecke funktioniert, die Frage ist also, wie gut das Ganze dann noch am realen Objekt funktioniert. Auch den Vergleich mit dem Modell finde ich dann nochmal spannend. Hier mal zwei Bilder des Regelverhaltens, einmal Sollwertsprünge, einmal Rampen:
Anhang 29864 Anhang 29865
Fortsetzung folgt ... :-)
Gruß
Malte
Liste der Anhänge anzeigen (Anzahl: 2)
Hab da wirklich gerade nochmal ein wenig mit herumgespielt und an den Reglerparametern gedreht. Hab auch mal einen Anti-Windup für den Integratoranteil wie bei mir eingebaut. Mir ist auch aufgefallen, warum du keinen D-Anteil brauchst: du hast deinen Regler auf Drehzahlebene aufgebaut, ich hingegen auf Positionsebene. Jedenfalls hab ich jetzt folgende Parameter verwendet:
Kp=50
Ki=3
Kd=1
Der Regler funktioniert jetzt schön zackig und ohne Überschwinger :)
Anhang 29867 Anhang 29868
Hier nochmal der ganze Code:
Code:
clear all;
close all;
clc;
if 0
% sprünge
soll = [zeros(1, 100) ...
ones(1, 200)*20 ...
zeros(1, 100) ...
ones(1, 200)*-40 ...
zeros(1, 100) ...
ones(1, 200)*60 ...
zeros(1, 100) ...
ones(1, 200)*80 ...
zeros(1, 100)];
else
% rampen
soll = [-80:2:80 ...
-80:1:80 ...
-80:0.5:80 ...
-80:0.25:80];
end
% streckeneigenschaften
v = 0.38;
T1 = 13;
% PID parameter
Kp = 50;
Ki = 3;
Kd = 1;
Ta = 1; % entspr. 2.048 ms
% init
u=0;
y = 0;
eSum = 0;
eOld = 0;
yOld = 0;
for i = 1:length(soll)
w = soll(i);
%% PID
e = w - y;
if abs(u)<208 %Anti-Windup, Integrator abschalten wenn Ausgang in Begrenzung
eSum = eSum + e;
end
P = Kp*e;
I = Ki * Ta * eSum;
D = Kd/Ta*(e - eOld);
u = P+I+D;
eOld = e;
u(u>208) = 208; % max. stellwert
u(u<-208) = -208;
%% PT1 strecke
y = yOld + 1/T1 * (v * u - yOld);
yOld = y;
%% doku
y_(i) = y;
u_(i) = u;
w_(i) = w;
e_(i) = e;
P_(i) = P;
I_(i) = I;
D_(i) = D;
end
% darstellung
disp(['Summenfehler: ' num2str(eSum)])
subplot(2, 1, 1)
plot(soll, 'LineWidth', 2)
hold on
plot(y_, 'r', 'LineWidth', 2)
set(gca, 'XLim', [0 length(y_)])
xlabel('Zeit [Ticks]')
ylabel('Drehzahl')
legend('soll', 'ist')
subplot(2, 1, 2)
plot(P_, 'LineWidth', 2)
hold on
plot(I_, 'g', 'LineWidth', 2)
plot(u_, 'r', 'LineWidth', 2)
set(gca, 'XLim', [0 length(y_)])
xlabel('Zeit [Ticks]')
ylabel('Wert')
legend('P', 'I', 'Stellwert')
Liste der Anhänge anzeigen (Anzahl: 6)
Moin!
Weiter oben hatte ich ja schonmal angedeutet einen Arm für die Mecanum Wheel Plattform aufbauen zu wollen, sodass dann ein ähnliches System entsteht wie der Kuka youBot. Die Idee ergab sich auch daraus, dass sich die Antriebsmodule, die ich aufgebaut habe, auch ganz gut als Stellmotoren verwenden ließen. Ich hatte eine Positionsregelung nur mal auf die Schnelle "zusammengehauen", die eigentlich direkt ganz gut lief.
Die ersten drei Freiheitsgrade des Arms habe ich jetzt zumindest mechanisch mal aufgabaut. Es soll im Endeffekt ein 5-Achs Arm werden, für die zwei noch verbleibenden Achsen werde ich kleinere Getriebemotoren verwenden. Die ersten beiden Achsen werden direkt von den Getriebemotoren gebildet bzw angetrieben. Das wäre für die dritte Achse nicht so günstig gewesen, weil der relativ schwere Motor dann über den Hebelarm die zweite Achse deutlich belastet hätte. Deswegen verwende ich einen Zahnriemen, um Antrieb und Drehachse zu trennen. Um die zweite Achse zu entlasten, wurde der Getriebemotor außerdem so angeordnet, dass er als Gegengewicht dient: der eigentliche Motor für die dritte Achse liegt hinter dem Lagerpunkt der zweiten Achse.
Der Unterarm ist erstmal nur eine Art Platzhalter, aber an dem Bauprinzip werden ich festhalten. Was nicht so bleiben kann wie es jetzt ist, ist die Verbindung des Unterarms mit seiner Welle. Das ist aktuell eine einfache Verschraubung ohne jeden Verdrehungsschutz. Bei Belastung löst sich je nach Richtung - erwartungsgemäß - eine der Schrauben. Ich werde zunächst mal versuchen, ob ich mit einer großen Unterlegscheibe und einer gekonterten Verschraubung an diese Stelle die nötige Verbindungsstabilität erreichen kann.
Hier ein paar Bilder vom aktuellen Stand:
Anhang 30044 Anhang 30046 Anhang 30050
Anhang 30047 Anhang 30049 Anhang 30048
Gruß
Malte
Liste der Anhänge anzeigen (Anzahl: 1)
Wunderbar! Mit diesen Formeln kann man auch Kreise fahren usw.
Wer ein Mecanum-Gefährt mit 3 (gleichen) Rädern ansteuern möchte der findet übrigens in der Abhandlung "Maschinenbau im RoboCup - Spielfreies Mecanum-Wheel" die entsprechenden Formeln (Seite 10f).
Edit: Habs auch mal angehängt: Anhang 30625