Забавляюсь последнее время по работе с СистемСи. Это такая надстройка над Си++, по сути набор классов для симуляции цифровых электронных систем. Пародия на СистемВерилог: работает так же шустро, и не стоит никаких денег. Но код выглядит ужасно.
Цифровые схемы уже несколько приелись, и решил я развлечься чем-нибудь более человеческим. Благо, к СистемСи народ умудрился добавить расширение для работы с аналоговыми вещами.
Зацените: модель материальной точки с одной степенью свободы. Как бы аналоговый элемент с одним входом и двумя выходами. На входе воздействующая сила, на выходе скорость и координата. Внутренний параметр - масса.
Добавляем второй элемент - пружину, получаем маятник. Результат симуляции выглядит вполне симпатично:

Полные исходники примера можно посмотреть здесь: https://code.google.com/p/vak-opensource/source/browse/#svn%2Ftrunk%2Fhardware%2Fsystemc-ams
Но все это не просто ради забавы. Есть у меня задумка попытаться сделать одноногого прыгающего робота. Типа Pogo Stick, но без привлечения человека.
Цифровые схемы уже несколько приелись, и решил я развлечься чем-нибудь более человеческим. Благо, к СистемСи народ умудрился добавить расширение для работы с аналоговыми вещами.
Зацените: модель материальной точки с одной степенью свободы. Как бы аналоговый элемент с одним входом и двумя выходами. На входе воздействующая сила, на выходе скорость и координата. Внутренний параметр - масса.
SCA_TDF_MODULE(point_mass) {
sca_in force_in<double>;
sca_out velocity_out<double>;
sca_out position_out<double>;
double mass;
double position;
double velocity;
double time_last;
SCA_CTOR(point_mass) {
mass = 1.0; // 1 kg by default
position = 0;
velocity = 0;
time_last = 0;
}
void set_attributes() {
set_timestep(0.001, SC_SEC);
position_out.set_delay(1);
}
void processing() {
double force = force_in.read();
double time_now = get_time().to_seconds();
double delta_t = time_now - time_last;
velocity += delta_t * force / mass;
position += velocity * delta_t;
time_last = time_now;
velocity_out.write(velocity);
position_out.write(position);
}
};Добавляем второй элемент - пружину, получаем маятник. Результат симуляции выглядит вполне симпатично:

Полные исходники примера можно посмотреть здесь: https://code.google.com/p/vak-opensource/source/browse/#svn%2Ftrunk%2Fhardware%2Fsystemc-ams
Но все это не просто ради забавы. Есть у меня задумка попытаться сделать одноногого прыгающего робота. Типа Pogo Stick, но без привлечения человека.

no subject
Date: 2014-10-22 05:28 (UTC)Поставлю сюда несколько любопытных ссылочек по теме.
http://engineering.phys.msu.ru/ru/projects/jumping-robot
http://physics.aps.org/articles/v5/119
http://crablab.gatech.edu/pages/jumpingrobot/index.html