Стабилизация Активная - часть II

 
1 70 71 72 73 74 88
RU shadowjack #19.02.2012 00:22  @Non-conformist#18.02.2012 23:59
+
-
edit
 

shadowjack

втянувшийся
Non-conformist> Скомпилилось. Скорость записи 10922. Чтение - та же картина, что я описывал выше: бесконечный столбец, убегающий вверх:
Прогони 2 раза пожалуйста и выложи оба получившихся файла.
 
UA Non-conformist #19.02.2012 00:44  @shadowjack#19.02.2012 00:22
+
-
edit
 

Non-conformist

аксакал

Прогнал.
Прикреплённые файлы:
1111.txt (скачать) [12,3 кБ, 36 загрузок]
 
2222.txt (скачать) [19,8 кБ, 54 загрузки]
 
 
Skype: a_schabanow  
UA Non-conformist #19.02.2012 00:44  @Non-conformist#19.02.2012 00:44
+
-
edit
 

Non-conformist

аксакал

Третий до кучки.
Прикреплённые файлы:
3333.txt (скачать) [16,1 кБ, 50 загрузок]
 
 
Skype: a_schabanow  
KZ Xan #19.02.2012 09:50  @Non-conformist#18.02.2012 23:04
+
-
edit
 

Xan

координатор

Non-conformist> Разговор немого с глухим, короче. Непродуктивно работаем...

Ну так поставьте себе обоим одинаковые инструменты, чтоб исходники давали одинаковые ошибки.
И их не надо было бы описывать.
 9.09.0
UA Non-conformist #19.02.2012 10:25  @Xan#19.02.2012 09:50
+
-
edit
 

Non-conformist

аксакал

Так у shadowjack компьютер c Ардуиной не хочет работать. Твой вариант слишком банален. Неинтересно. ))
Skype: a_schabanow  
UA Non-conformist #19.02.2012 14:09  @Ckona#18.02.2012 20:10
+
-
edit
 

Non-conformist

аксакал

Non-conformist>> Первоначальная задача - получить непадающую палку.
Ckona> Это тоже расширенная задача. Я бы простейшую задачу обозначил так: "Ящик, который пускает ток по достижении пороговых величин, измеряя угловые скорости и вычисляя углы, по двум координатам."

Алексей, ты почитай, о чём пишет француз kas по приведённой чуть выше ссылке. Ведь он говорит ровно о том же, что и ты. Только у него не общие формально-логические рассуждения, а подробнейший рассказ ПРАКТИЧЕСКОГО экспериментатора. Вот что ценно!

Первая задача (крупная) - получение УГЛОВ из данных гироскопа И АКСЕЛЕРОМЕТРА. Эта связка позволяет уверенно вычислять пространственное положение как движущегося, так и неподвижного объекта. Это первая крупная задача на нашем пути. Она подразделяется на несколько более мелких - вычисление стартовых (нулевых) координат, и ещё несколько таких же мелких, но необходимых шагов.

Потом он детально описывает следующие крупные задачи, которые в свою очередь делятся на мелкие шаги. Всё сопровождается кусками конкретного ардуинского кода.

ПОЧИТАЙ, ведь человек именно что в открытую делится своим УСПЕШНЫМ опытом постройки одноосевого балансера. Глупо пренебрегать такой информацией...
Skype: a_schabanow  
UA Non-conformist #19.02.2012 15:29  @Non-conformist#19.02.2012 14:09
+
-
edit
 

Non-conformist

аксакал

Если у кого-то из заинтересованных лиц ВДРУГ появится желание конструктивно пообщаться на актуальные темы в режиме онлайн - милости просим, мой Скайп-адрес прямо под аватаром. Думаю, что иной раз полчаса живого общения могут уверенно заменить неделю-другую форумной переписки.
Skype: a_schabanow  
UA Non-conformist #19.02.2012 17:58  @Non-conformist#19.02.2012 15:29
+
-
edit
 

Non-conformist

аксакал

Повторил эксперимент с ронянием акселерометра - поднимал над головой, ронял, и ловил у пола. Действительно, показания всех трёх осей схлопываются в ноль.
Прикреплённые файлы:
1111.png (скачать) [14,8 кБ, 9 загрузок]
 
 
Skype: a_schabanow  
UA Non-conformist #19.02.2012 19:15  @Non-conformist#19.02.2012 17:58
+
-
edit
 

Non-conformist

аксакал

Попробую привлечь внимание общественности к первоисточнику. Может, проблема чисто языковая...


Часть Первая

"Я был очарован роботами-балансерами на протяжение ряда лет. Мой первый опыт 2008 года (ссылка) - робот, использующий инфракрасный сенсор для поддержания неизменной дистанции до подстилающей поверхности. С тех пор все попытки создать робота, который для самобалансирования использовал бы инерциальные датчики, неизменно оканчивались провалом. Пришлось много чего прочитать, прежде чем я понял свои основные ошибки (сервы непрерывного вращения (без мёртвой зоны? - прим. перев.), физическое положение сенсора относительно ЦТ, целочисленная математика, общий источник питания и тому подобное). Я начал всё с чистого листа - и вот я здесь. ))

В этой ветке я намерен пошагово описать свой проект и тем самым сделать попытку помочь новичкам сэкономить их время и силы в борьбе за равновесие. Описание своих проектов и желание поделиться своими наработками с другими - наилучший способ учиться самому. Следующая ступень совершенствования - двенадцатибитный АЦП, энкодеры, радиоуправление. Оставайтесь с нами! ))


ЧАСТ ПЕРВАЯ
Сенсоры (подключение и софт)

Эпиграф: Я ничего не изобретал. Я много читал и действовал методом проб и ошибок.

Это (фото) - Инерциальный Измерительный Блок с пятью степенями свободы от СпаркФан. Маленькая плата-носитель имеет в своём составе двухосевой гироскоп IDG-500 и трёхосевой акселерометр ADXL335. С их даташитами можно ознакомиться здесь (ссылки).

Для нашей задачи нам нужно всего три канала: два акселерометрических и один гироскопический. Моя модель ИИБ более старая (ADXL330/IDG-300), т.к. я бил баклуши слишком долго - целых два года.

Подключение ИИБ простое и понятное (следует список цветных проводов и их описание).

Fixed timed loop (затрудняюсь перевести - прим. перев.)
Длительность главного цикла (main loop duration) имеет критическое значение для фильтрации и ПИД-модуля.

_______________

int STD_LOOP_TIME = 9;
int lastLoopTime = STD_LOOP_TIME;
int lastLoopUsefulTime = STD_LOOP_TIME;
unsigned long loopStartTime = 0;

void loop() {

// your code ...


// *********************** loop timing control **************************
lastLoopUsefulTime = millis()-loopStartTime;
if(lastLoopUsefulTime<STD_LOOP_TIME) delay(STD_LOOP_TIME-lastLoopUsefulTime);
lastLoopTime = millis() - loopStartTime;
loopStartTime = millis();
}
________________

Этот цикл запускается сто раз в секунду. Мотор привода получает обновлённые значения ШИМ каждые десять миллисекунд. Диаграммы цикла можно легко посмотреть с помощью любого виртуального осциллографа, просто манипулируя значением Digital Output в цикле: (изображение экрана вирт. осциллографа). Или даже проще - добавить блок serialOut_timing() в цикл, и наблюдая за циклом с помощью монитора компорта.

________________

void serialOut_timing() {
static int skip=0;
if(skip++==5) { // display every 500 ms (at 100 Hz)
skip = 0;
Serial.print(lastLoopUsefulTime); Serial.print(",");
Serial.print(lastLoopTime); Serial.print("\n");
}
}
________________

В мониторе вы должны увидеть следующую строчку:
2,10
Первая цифра - реальное время, которое потребовалось процессору, чтобы выполнить цикл. Число после запятой - время окончания цикла, включая изменяемую добавленную задержку.


В следующей части вы увидите: сбор данных, настройка нуля и масштабирование.

Данная презентация занимает у меня довольно много времени. Английский не является моим родным языком (вы, видимо, заметили французский акцент в моих текстах). )) Я продолжу, если уважаемая публика обнаружит существенный интерес к предмету повествования. Да, если я слишком быстр или напротив скучен - дайте мне знать! ))"
Skype: a_schabanow  
Это сообщение редактировалось 20.02.2012 в 21:08
KZ Xan #19.02.2012 20:58  @Non-conformist#19.02.2012 19:15
+
-
edit
 

Xan

координатор

Non-conformist> Я продолжу, если уважаемая публика обнаружит существенный интерес к предмету повествования.

Передай автору :) , что начинать надо не с кода, а с постановки задачи.
Потом математика для неё.
Потом блок-схемы и/или диаграммы состояния.
Потом псевдокод с подробными комментариями.
Потом, если интересно, частный случай кода.

ЗЫ
Ну и вот так пусть не пишет:

if(skip++==5)

А пусть пишет так:

skip++;
if (skip == 5)

А то в Си есть и такоё замечательное выражение:

"-----i;"
 9.09.0
Это сообщение редактировалось 19.02.2012 в 21:04
UA Non-conformist #19.02.2012 21:10  @Xan#19.02.2012 20:58
+
-
edit
 

Non-conformist

аксакал

Сишный юмор оценить не могу, и потому автору ничего кроме "спасибо" передавать не буду. Да и недоступен он - тема закрыта, уже год как. Чем богаты, тем и рады.

Тут проблема не в авторе, гы-гы...
Skype: a_schabanow  
KZ Xan #19.02.2012 21:41  @Non-conformist#19.02.2012 21:10
+
-
edit
 

Xan

координатор

Non-conformist> Сишный юмор оценить не могу,

На Си писатель может в одной строчке множество разных действий сделать.
И при этом не писать лишние скобки.
И при этом не писать лишние пробелы.
И тогда читатели хер чего поймут, пока не разделят действия по разным строчкам, не расставят скобки и пробелы.
Это про удобочитаемость. :)
 9.09.0
UA Ckona #19.02.2012 22:10  @Non-conformist#19.02.2012 14:09
+
-
edit
 

Ckona

опытный

Non-conformist> Алексей, ты почитай, о чём пишет француз kas по приведённой чуть выше ссылке.
В сутках 24 часа, успеваю далеко не все. Конечно, он пишет полезные вещи - вскользь пробежал.
Вызывает уважение, что путь человека длился не один год - задачка нетривиальная.
Возможно, нам удастся продуктивно побеседовать во время твоего с дочкой визита в Киев.
 
UA Non-conformist #19.02.2012 22:45  @Xan#19.02.2012 21:41
+
-
edit
 

Non-conformist

аксакал

Xan> И тогда читатели хер чего поймут ...

skip++;
if (skip == 5)

"Пропустить, если кол-во пропусков равно 5". ))


***
Поездка в Киев отменяется - заболела дочка, не поправится к тому времени. В конце следующей недели приедет разъём, запаяю и отправлю тебе пакунок "Новой Почтой". Поигрались и будет.
Skype: a_schabanow  
UA Non-conformist #20.02.2012 21:01  @Non-conformist#19.02.2012 22:45
+
-
edit
 

Non-conformist

аксакал


Balancing robot for dummies

Balancing robot for dummies

// arduino.cc
 



Часть вторая:
приём данных, приведение их к нулю, усреднение. Вычисление углов.
Эпиграф: Акселерометры - шумные ребята.


1. Показания неподвижного акселерометра зависят от его углового положения относительно вектора земной гравитации (направления на центр Земли).


2. Приведение к нулю показаний акселерометра.

Перед началом обработки данных акселерометра в программном цикле, его показания должны быть приведены к нулю. Это означает, что когда робот неподвижен и строго вертикален, показания акселерометра по осям "X" и "Y" должны быть равны нулю. Показания оси "Z" должны быть максимальны, т.е. в "акселерометрических попугаях" численно равны одному "же" - ускорению свободного падения на планете Земля. Приведение к нулю производится в установочном блоке кода:

_________________

void calibrateSensors() { // Set zero sensor values
long v;
for(int n=0; n<3; n++) {
v = 0;
for(int i=0; i<50; i++) v += readSensor(n);
sensorZero[n] = v/50;
}
sensorZero[ACC_Z] -= 102;
}
_________________

Поскольку calibrateSensors() является one off action (? - прим. перев.), у нас есть достаточно времени, чтобы усреднить 3 х 50 измерений. В итоге сила земной гравитации оказывается полностью приложенной к оси "Z". Для используемого мной аналогового акселерометра, сигнал, соответствующий ускорению свободного падения, равен 330 мВ ±10%. Для десятибитного АЦП с опорным напряжением 3,3 В эти милливольты оказываются численно выражены следующим образом:

330/3300 х 1024 = 102

Это значение будет уточняться позже. Для второй версии (?), перед усреднением необходимо удалить по пять максимальных значений сверху и снизу получаемого диапазона чисел (излишний шум), или же найти характерный блок данных, "узор" значений которых наиболее часто повторяется - и именно этот кусок числовых данных использовать для усреднения.


3. Приём данных

_______________

void updateSensors() { // data acquisition
long v;
for(int n=0; n<3; n++) {
v = 0;
for(int i=0; i<5; i++) v += readSensor(n);
sensorValue[n] = v/5 - sensorZero[n];
}
}
________________

Каждый сенсор опрашивается по пять раз и усредняется по результатам этого пятикратного опроса, а затем вычисляются нулевые значения по каждой из осей. Во второй версии (?) перед усреднением полученных данных необходимо удалить верхнее и нижнее значение их диапазона.


4. Формат данных

________________

// Main module K_bot angles in Quids, 10 bit ADC -------------
// 4 - Checking sensor data format display raw sensors data

#include <math.h>

#define GYR_Y 0 // Gyro Y (IMU pin #4)
#define ACC_Z 1 // Acc Z (IMU pin #7)
#define ACC_X 2 // Acc X (IMU pin #9)

int STD_LOOP_TIME = 9;

int sensorValue[3] = { 0, 0, 0};
int sensorZero[3] = { 0, 0, 0};
int lastLoopTime = STD_LOOP_TIME;
int lastLoopUsefulTime = STD_LOOP_TIME;
unsigned long loopStartTime = 0;

void setup() {
analogReference(EXTERNAL); // Aref 3.3V
Serial.begin(115200);
delay(100);
calibrateSensors();
}

void loop() {
// ********************* Sensor aquisition & filtering *******************
updateSensors();

// ********************* print Debug info *************************************
serialOut_raw();

// *********************** loop timing control **************************
lastLoopUsefulTime = millis()-loopStartTime;
if(lastLoopUsefulTime<STD_LOOP_TIME) delay(STD_LOOP_TIME-lastLoopUsefulTime);
lastLoopTime = millis() - loopStartTime;
loopStartTime = millis();
}

void serialOut_raw() {
static int skip=0;
if(skip++==40) {
skip = 0;
Serial.print("ACC_X:"); Serial.print(sensorValue[ACC_X]);
Serial.print(" ACC_Z:"); Serial.print(sensorValue[ACC_Z]);
Serial.print(" GYR_Y:"); Serial.println(sensorValue[GYR_Y]);
}
}

// Sensors Module ---------------------------------------------------------------------

void calibrateSensors() { // Set zero sensor values
long v;
for(int n=0; n<3; n++) {
v = 0;
for(int i=0; i<50; i++) v += readSensor(n);
sensorZero[n] = v/50;
}
sensorZero[ACC_Z] -= 103;
}

void updateSensors() { // data acquisition
long v;
for(int n=0; n<3; n++) {
v = 0;
for(int i=0; i<5; i++) v += readSensor(n);
sensorValue[n] = v/5 - sensorZero[n];
}
}

int readSensor(int channel){
return (analogRead(channel));
}

________________

Числовые значения, получаемые с сенсоров, оказываются сформатированы следующим образом:

Горизонт (0 град = 0 Quid) ACC_X:0 ACC_Z:XX GYR_X:0
Влево (-90 град = -256 Quid) ACC_X:XX ACC_Z:0 GYR_X:0
Вправо (+90 град = +256 Quid) ACC_X:-XX ACC_Z:0 GYR_X:0
Вверх ногами (180 град = +512 Quid) ACC_X:0 ACC_Z:-XX GYR_X:0

Для ADXL330/335 "ХХ" равно примерно 100.

Перед тем, как двигаться далее, убедитесь в том, что вы получаете СИММЕТРИЧНЫЕ данные! Это один из первых камней преткновения большинства балансерных проектов. Т.е. сейчас нам самое время установить

sensorZero[ACC_Z]

назначив

sensorZero[ACC_Z]-=102

Это нужно сделать для того, чтобы получить зеркально симметричные числа (+103 и -103) в процессе прохождения диапазона углов от 0 до 512 Квидов (Quids) - или от 0 до 180 градусов.


5. Вычисление углов и угловых скоростей

ACC_angle = getAccAngle();
Определяет угол наклона робота через арктангенс числовых данных двух акселерометрических осей. Эти данные не нужно переводить в привычные единицы измерения, однако они должны быть приведены к нулю (симметрированы относительно нуля) и иметь одинаковый масштаб.

GYRO_rate = getGyroRate();
Определяет гироскопическую угловую скорость из "аналогового сырья", которое выдаёт нам наш гироскоп на своём выходе. Чувствительность гироскопа составляет 2,0 мВ/град/с. С ардуинским десятибитным АЦП имеем один АЦП-шный "попугай", равный 4,58(3) Quid/sec или же 1,611328 град/с.

_______________

// Main module K_bot angle angles in Quids, 10 bit ADC -----------------------------
// 5 - angle and rate calculation display ACC_Angle and GYRO_rate

#include <math.h>

#define GYR_Y 0 // Gyro Y (IMU pin #4)
#define ACC_Z 1 // Acc Z (IMU pin #7)
#define ACC_X 2 // Acc X (IMU pin #9)

int STD_LOOP_TIME = 9;

int sensorValue[3] = { 0, 0, 0};
int sensorZero[3] = { 0, 0, 0 };
int lastLoopTime = STD_LOOP_TIME;
int lastLoopUsefulTime = STD_LOOP_TIME;
unsigned long loopStartTime = 0;
int ACC_angle;
int GYRO_rate;

void setup() {
analogReference(EXTERNAL); // Aref 3.3V
Serial.begin(115200);
delay(100);
calibrateSensors();
}

void loop() {
// ********************* Sensor aquisition & filtering *******************
updateSensors();
ACC_angle = getAccAngle(); // in Quids
GYRO_rate = getGyroRate(); // in Quids per seconds

// ********************* print Debug info *************************************
serialOut_sensor();

// *********************** loop timing control **************************
lastLoopUsefulTime = millis()-loopStartTime;
if(lastLoopUsefulTime<STD_LOOP_TIME) delay(STD_LOOP_TIME-lastLoopUsefulTime);
lastLoopTime = millis() - loopStartTime;
loopStartTime = millis();
}

void serialOut_sensor() {
static int skip=0;
if(skip++==20) {
skip = 0;
Serial.print(ACC_angle); Serial.print(",");
Serial.print(GYRO_rate); Serial.print("\n");
}
}

// Sensors Module -----------------------------------------------------------------------------------

void calibrateSensors() { // Set zero sensor values
long v;
for(int n=0; n<3; n++) {
v = 0;
for(int i=0; i<50; i++) v += readSensor(n);
sensorZero[n] = v/50;
} //(618 - 413)/2 = 102.5 330/3.3 = x/1024
sensorZero[ACC_Z] -= 100; //102; // Sensor: horizontal, upward
}

void updateSensors() { // data acquisition
long v;
for(int n=0; n<3; n++) {
v = 0;
for(int i=0; i<5; i++) v += readSensor(n);
sensorValue[n] = v/5 - sensorZero[n];
}
}

int readSensor(int channel){
return (analogRead(channel));
}

int getGyroRate() { // ARef=3.3V, Gyro sensitivity=2mV/(deg/sec)
return int(sensorValue[GYR_Y] * 4.583333333); // in quid/sec:(1024/360)/1024 * 3.3/0.002)
}

int getAccAngle() {
return arctan2(-sensorValue[ACC_Z], -sensorValue[ACC_X]) + 256; // in Quid: 1024/(2*PI))
}

int arctan2(int y, int x) { // http://www.dspguru.com/comp.dsp/tricks/alg/fxdatan2.htm
int coeff_1 = 128; // angle in Quids (1024 Quids=360°)
int coeff_2 = 3*coeff_1;
float abs_y = abs(y)+1e-10;
float r, angle;

if (x >= 0) {
r = (x - abs_y) / (x + abs_y);
angle = coeff_1 - coeff_1 * r;
} else {
r = (x + abs_y) / (abs_y - x);
angle = coeff_2 - coeff_1 * r;
}
if (y < 0) return int(-angle);
else return int(angle);
}

_________________

Теперь вы можете наблюдать шумные сигналы акселерометра и гироскопа в мониторе компорта. Однако куда удобнее и нагляднее делать это в графической оболочке LabView или Processing. Могу поделиться своим кодом с владельцами LabView! Gybby623, не хочешь ли и ты обнародовать свой код для Processing???


Следующая часть: Фильтр Калмана и ПИД.

Не слишком ли я углубляюсь в детали? Или наоборот излишне краток? Дайте мне знать!


***

Gybby623: Конечно, вот мой код для Processing:

_____________________

/*
Serial Graphing Sketch
by Tom Igoe
Language: Processing

This sketch takes ASCII values from the serial port
at 9600 bps and graphs them.
The values should be comma-delimited, with a newline
at the end of every set of values.
The expected range of the values is between 0 and 1023.

Created 20 April 2005
Updated 27 June 2008
/

import processing.serial.
;

int maxNumberOfSensors = 6; // Arduino has 6 analog inputs, so I chose 6
boolean fontInitialized = false; // whether the font's been initialized
Serial myPort; // The serial port

float[] previousValue = new float[maxNumberOfSensors]; // array of previous values
int xpos = 0; // x position of the graph
PFont myFont; // font for writing text to the window

void setup () {
// set up the window to whatever size you want:
size(800, 600);
// List all the available serial ports:
println(Serial.list());
// I know that the first port in the serial list on my mac
// is always my Arduino or Wiring module, so I open Serial.list()[0].
// Open whatever port is the one you're using.
String portName = Serial.list()[0];
myPort = new Serial(this, portName, 9600);
myPort.clear();
// don't generate a serialEvent() until you get a newline (\n) byte:
myPort.bufferUntil('\n');
// create a font with the fourth font available to the system:
myFont = createFont(PFont.list()[3], 14);
textFont(myFont);
fontInitialized = true;
// set inital background:
background(0);
// turn on antialiasing:
smooth();
}

void draw () {
// nothing happens in the draw loop,
// but it's needed to keep the program running
}

void serialEvent (Serial myPort) {
// get the ASCII string:
String inString = myPort.readStringUntil('\n');

// if it's not empty:
if (inString != null) {
// trim off any whitespace:
inString = trim(inString);

// convert to an array of ints:
int incomingValues[] = int(split(inString, ","));

// print out the values
// print("length: " + incomingValues.length + " values.\t");
if (incomingValues.length <= maxNumberOfSensors && incomingValues.length > 0) {
for (int i = 0; i < incomingValues.length; i++) {

// map the incoming values (0 to 1023) to an appropriate
// graphing range (0 to window height/number of values):
float ypos = map(incomingValues[i], 0, 1023, 0, height/incomingValues.length);

// figure out the y position for this particular graph:
float graphBottom = i * height/incomingValues.length;
ypos = ypos + graphBottom;

// make a black block to erase the previous text:
noStroke();
fill(0);
rect(10, graphBottom+1, 110, 20);

// print the sensor numbers to the screen:
fill(255);
int textPos = int(graphBottom) + 14;
// sometimes serialEvent() can happen before setup() is done.
// so you need to make sure the font is initialized before
// you text():
if (fontInitialized) {
text("Sensor " + i + ":" + incomingValues[i], 10, textPos);
}
// draw a line at the bottom of each graph:
stroke(127);
line(0, graphBottom, width, graphBottom);
// change colors to draw the graph line:
stroke(64*i, 32*i, 255);
line(xpos, previousValue[i], xpos+1, ypos);
// save the current value to be the next time's previous value:
previousValue[i] = ypos;
}
}
// if you've drawn to the edge of the window, start at the beginning again:
if (xpos >= width) {
xpos = 0;
background(0);
}
else {
xpos++;
}
}
}

____________________
Skype: a_schabanow  
Это сообщение редактировалось 20.02.2012 в 21:53
UA Non-conformist #21.02.2012 12:47  @Non-conformist#20.02.2012 21:01
+
-
edit
 

Non-conformist

аксакал

Non-conformist> Определяет угол наклона робота через арктангенс числовых данных двух акселерометрических осей.
Из всего прочитанного этот пункт вызывает у меня наибольшие опасения. Автор пишет, что для вычисления угла, у акселерометра задействованы две оси, "Y" и "Z"...

Но если наш чётко отбалансированный "балансер" приобретёт стартовое ускорение - по оси "Z", конечно же - ради чего, в конечном счёте, вся эта деятельность и происходит, то расчётное значение угла наклона, определённое из арктангенса С УЧАСТИЕМ ЭТОЙ САМОЙ "Z", вроде как по любому должно измениться - в то время как реальный угол и думать не будет меняться...

Или в расчёт углов каким-то образом подмешиваются данные с гироскопа, и если сигнала с него нет, то ускорение по "Z" будет считаться не относящимся к процессу балансирования? Наверное, что-то в этом роде...
Skype: a_schabanow  
UA Ckona #21.02.2012 16:49  @Non-conformist#21.02.2012 12:47
+
-
edit
 

Ckona

опытный

Non-conformist> Или в расчёт углов каким-то образом подмешиваются данные с гироскопа, и если сигнала с него нет, то ускорение по "Z" будет считаться не относящимся к процессу балансирования? Наверное, что-то в этом роде...

Может быть, я и не прав... хотелось бы пойти по пути, который начинается с физического описания (матмодели).
Очень утешает, что товарищ KAS потратил несколько лет на изыскания.
Конечно, его софт позволит быстрее проскочить "пороги" дискретных вычислений.
Пока что, читая учебник по системам управления летательных аппаратов, убеждаюсь в различиях матмоделей самолета, вертолета, аэродинамической ракеты и МБР. Даже стыковка на орбите и самонаведение - разные уравнения.
Отсюда твердая убежденность: начинать с простейших пороговых задач.
 
UA Non-conformist #21.02.2012 17:58  @Ckona#21.02.2012 16:49
+
-
edit
 

Non-conformist

аксакал

Ckona> Может быть, я и не прав... хотелось бы пойти по пути, который начинается с физического описания (матмодели).
Надо определиться, чего добиваемся - конечного результата, или строго последовательного и "правильного" прохождения собственно процесса. При желании всё это можно растянуть на совершенно неопределённое время. Что, собственно, сейчас успешно и происходит.

Начинать "с начала начал" - лучше не придумаешь, конечно. Но тут 99,99 за то что теми началами и закончишь (ты забыл программирование, тут ведь тоже если "правильно проходить" нужно "начинать с начала начал"). Не знаю... Мне лично всё-таки хотелось бы, чтобы хобби моё было больше похоже на хобби, на научноПОПУЛЯРНОСТЬ, на развлечение, а не на тупой разрыв мозга.

Ckona> ... учебник по системам управления летательных аппаратов ... начинать с простейших пороговых задач ...
Ах ну да, ну да... Путь в никуда... Лет 30 назад бы, да в соответствующем коллективе энтузиастов... Ты, само собой, как знаешь - если чувствуешь в себе силы, интеллект, чтобы ... - в добрый путь, конечно! Но тут я тебе не попутчик и не помощник.
Skype: a_schabanow  
UA Non-conformist #21.02.2012 20:01  @Non-conformist#21.02.2012 17:58
+
-
edit
 

Non-conformist

аксакал

Non-conformist> ... ты забыл программирование, тут ведь тоже если "правильно проходить" нужно "начинать с начала начал" ...
Выбрать Arduino, получить первые положительные результаты, а потом "начать всё с матмодели"... Странный подход имхо... Как минимум непоследовательный.

Это же сёрфинг, а не "гребля академическая"... Это та, которая сугубо "пердячим пАром" и аж до самой до победушки... Камо грядеши, человече? )) Оседлай волну - и получай удовольствие!
Skype: a_schabanow  
UA Non-conformist #21.02.2012 20:58  @Non-conformist#21.02.2012 20:01
+
-
edit
 

Non-conformist

аксакал

Ещё один простой инерциальный ардуинобалансер:

Easy build self balancing electric skateboard

What is it? Twinwheeled skateboard that works like a Segway. Electric skateboard exist already with motors on the rear wheels. The plan here howe...

// www.instructables.com
 



Тема живая, позиционируется автором как проект для командного технического творчества школьников и студентов. Обрисовал нашу ситуацию (не уточняя возраста школьников гы-гы), ожидаю ответа.
Skype: a_schabanow  

UA Non-conformist #22.02.2012 11:08  @Non-conformist#21.02.2012 20:58
+
-
edit
 

Non-conformist

аксакал

Non-conformist> Тема живая, позиционируется автором как проект для командного технического творчества школьников и студентов.
Кусок из комментариев на главной странице:

It controls the wheel motors so the wheels always stay under your centre of balance, like balancing a broomstick on your fingertip. This in engineering terms is called a "PID" control system and is used for all sorts of things. For example think of the 300+ feet high Apollo rockets used in the moon landings..........
Q: How come they didn't they just fall over when they took off? They took off incredibly slowly for the first few seconds, tailfins would have no effect, much slower than the Shuttle launches. Watch this video and see what I mean.......................
It takes a full 10 seconds just to get to 100m and clear the launch tower: Apollo 11 launch w/ altitude and velocity data - YouTube
A: They had engines mounted on gimbals (swivelling joints) hydraulically controlled by a PID control system (lots of analog electronics too). Hence the mystery phrase "we've hit gimbal lock" which keeps cropping up during the film, Apollo 13.


Идеи носятся в воздухе, нужно помочь им сконденсироваться!
Skype: a_schabanow  
UA Non-conformist #22.02.2012 11:37  @Non-conformist#22.02.2012 11:08
+
-
edit
 

Non-conformist

аксакал

Для просмотра всего проекта на одной странице необходимо нажать кнопку "View All Steps". Она расположена сразу сверху справа последнего (самого верхнего) комментария.


Easy build self balancing electric skateboard

What is it? Twinwheeled skateboard that works like a Segway. Electric skateboard exist already with motors on the rear wheels. The plan here howe...

// www.instructables.com
 


Выложен весь необходимый софт, по кускам и вместе; выложены последние версии скетчей 2012 года. Автор любезно и быстро отвечает на вопросы по e-mail, связь установлена!

shadowjack ???
Skype: a_schabanow  
Это сообщение редактировалось 22.02.2012 в 11:50
UA Ckona #22.02.2012 12:19  @Non-conformist#21.02.2012 17:58
+
-
edit
 

Ckona

опытный

Non-conformist> тупой разрыв мозга.

Поскольку акселерометр тоже работает, появилась возможность перед стартом измерить отклонение оси ракеты от вертикального направления.
Грубо - это арккосинус от показания по оси Z, отнесенного к "вертикальным" показаниям. Точно - угол поворота связанной (с ракетой) системы координат относительно вертикали.
Пересчет: согласно матрице поворота в трехмерном пространстве.

По зрелищности это будет намного эффективнее просто вертикальной стабилизации - ракета стартует по углом 20-25 градусов от вертикали, в полете доворачивает на вертикальную траекторию.

Non-conformist> Путь в никуда... Лет 30 назад...
Разумеется, я не собираюсь изучать все "основы" ради процесса "изучения".

Насколько мне известно, за последние 30 лет люди стали злее и нетерпеливее, а законы механики не изменились.
Появилась возможность сокращать габариты, увеличивать быстродействие, адаптировать обработку, но по-прежнему невозможно управлять без понимания природы объектов управления.
 
UA Non-conformist #22.02.2012 13:18  @Ckona#22.02.2012 12:19
+
-
edit
 

Non-conformist

аксакал

Я думаю, что есть два пути познания природы: математикой познавать физику (Эйнштейн, Ландау и прочие из этого ряда), и наоборот - постановкой физических опытов, как лучом тусклого фонарика, пытаться выхватывать из математики то, что в данный момент "работает на столе" в грубом физическом смысле. Чем я и предлагаю заняться. Поставь опыт, и если есть такое желание - опиши его математически, дойди до основ, тебе доступных. Разве я против?

Ckona> Появилась возможность сокращать габариты, увеличивать быстродействие, адаптировать обработку, но по-прежнему невозможно управлять без понимания природы объектов управления.
Практика показывает обратное. Как раз-таки чтобы чем-то "управить" - В НАШЕ ВРЕМЯ уже не нужно "понимать природу". Как не нужно В НАШЕ ВРЕМЯ понимать физику энергетических барьеров p-n переходов для того, чтобы грамотно применять транзисторы в своих схемах. Грубо: бери пульт ДУ и управляй, без малейшего "понимания природы".

Природу понимать нужно только в том случае, если ты хочешь её понять. Желание весьма похвальное, но с практической точки зрения аж никак не обязательное.
Skype: a_schabanow  
AD Реклама Google — средство выживания форумов :)
UA Non-conformist #22.02.2012 13:42  @Non-conformist#22.02.2012 13:18
+
-
edit
 

Non-conformist

аксакал

Ckona> По зрелищности это будет намного эффективнее просто вертикальной стабилизации ...

Зрелищность ВЕРТИКАЛЬНОГО старта заключается прежде всего в СОБЛЮДЕНИИ МАСШТАБА СКОРОСТЕЙ* ТЯЖЁЛЫХ РАКЕТ-НОСИТЕЛЕЙ. Медленный, ОЧЕНЬ реалистичный (особенно на первых секундах) подъём на высоту двадцать-тридцать метров и стрельба парашютом.
________
  • Масштаб скоростей (здесь): модель поднимается на высоту, равную или кратную ВЫСОТЕ СВОЕГО КОРПУСА - за время, соответствующее аналогичному процессу реального прототипа. Например: за первую секунду после отрыва от стартового стола, А-4 поднимается на высоту, равную трети высоты СВОЕГО КОРПУСА. Т.е. если соблюдать масштаб скоростей, то модель А-4 также должна подняться на треть своего корпуса за первую секунду после отрыва от стартового стола.


Зрелищность МИНОМЁТНОГО старта - ракета выстреливается из ТПК вертикально, включается мотор, и, ломая траекторию на помянутые тобой 20 .. 30 градусов, ракета устремляется к Солнцу. Т.е. всё нужно делать как раз наоборот: СНАЧАЛА вертикаль, а потом разворот под углом. Реалистично, ЗРЕЛИЩНО изображаем старт ракеты комплекса С-300 с наипростейшим, наидешёвейшим солнечным датчиком...
Skype: a_schabanow  
1 70 71 72 73 74 88

в начало страницы | новое
 
Поиск
Поддержка
Поддержи форум!
ЯндексЯндекс. ДеньгиХочу такую же кнопку
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru