Acronim: ireal


implementarea modului software de simulare în timp real



Yüklə 194,95 Kb.
səhifə8/8
tarix30.10.2017
ölçüsü194,95 Kb.
#22437
1   2   3   4   5   6   7   8

4.2.implementarea modului software de simulare în timp real


Pentru implementarea modului software de simulare în timp real, într-o primă etapă au fost implementate funcţii de calcul a dinamicii automobilului utilizând formalismele de calcul descrise în paragraful 2.4. Rezultatele obţinute în urma simulării sunt transmise prin intermediul modului de comandă prezentat în sectiunea anterioară către robotul Moog pentru percptia virajelor, acceleratiei şi franarii automobilului precum şi pentru actualizarea deplasarii automobilului îm mediul virtual.

În următoarea etapa au fost generate mediile virtuale 3D demonstrative folosind programul CAD Solidworks şi exportate în limbajul standardizat ISO de reprezentare a mediilor virtuale VRML(Virtual Reality Modelling Language). Limbajul VRML este modular, cu o structură arborescentă ierarhică a entităţilor, permiţând crearea unor scene 3D în care utilizatorul poate naviga liber(fig. 4.5). Obiectele VRML sunt descrise sub forma unor noduri, existând un mecanism de imbricare a lor. Fişierele VRML sunt fişiere text care pot fi create prin utilizarea unui editor de text şi salvate în format ASCII cu extensia .wrl . Pentru vizualizare se folosesc programe specializate, cele mai populare fiind BSContact. Aceste program citeste fişierul scris în limbajul VRML şi generează automat mediul virtual.

În scopul controlului dinamic al automobilului din scena virtuală , s-a realizat generalizarea atributelor obiectelor virtuale prin includerea unei interfeţe definită printr-un nod de tip prototip (Proto). Sintaxa nodului VRML care descrie automobilul este prezentată în continuare:

PROTO id_obiect_virtual

[

eventIn SFVec3f setPosition

eventIn SFRotation setRotation

eventIn SFInt32 setTranslationAxis

eventIn SFInt32 setRotationAxis

eventIn SFBool collision

eventIn SFBool changeColour

exposedField SFVec3f collisionVector 0 0 0

eventOut SFVec3f position_changed

eventOut SFRotation rotation_changed

]

{

# noduri ce conţin informaţiile geometrice

}

Prin intermediul interfeţei create, automobilul virtual poate fi manipulat utilizând evenimentele eventIn şi eventOut. Astfel când un eveniment de intrare eventIn este primit, valorile modificate vor fi trimise de către evenimentul eventOut, schimbarea poziţiei sau orientării fiind detectată şi transmisă către obiectul virtual pentru actualizare. Obiectul virtual se comportă astfel:


1. Primire set_Position > Trimitere position_changed

2. Primire set_Rotation > Trimitere rotation_changed


Pentru definirea poziţiei şi rotaţiei automobilului virtual sunt utilizate tipurile de date SFVec3f, respectiv SFRotation. De asemenea nodul prototip mai permite transmiterea de evenimente pentru pornirea/oprirea detecţie coliziune cu alte obiecte din mediul virtual, schimbarea culorii în cazul coliziunii cu alte obiecte, alegerea axei de translaţie şi de rotaţie pentru poziţionarea sau orientarea obiectului în mediul virtual.

Pentru demonstrarea simulatorului dezvoltat au fost realizate doua aplicaţii demonstrative:

(i) – simularea automobilului pe un drum drept cu hopuri: în cadrul acestei aplicaţii utilizatorul poate sa testeze prin intermediul echipamentului haptic de prototipare virtuala a pedalei de acceleraţie profilul de forţă al arcului de presiune tip diafragmă precum şi comportamentul automobilului la acceleraţie şi frânare. A fost modelat un drum cu doua hopuri, şi introdus un model virtual de automobil. Pentru automobil au fost stabiliţi următorii parametrii iniţiali:


  • Moment motor : 15;

  • Viteza masina: 2.245

  • Raport de transmitere: 3

  • Randament: 0.8

  • Raza roţii: 0.32

  • Coeficient rezistenta rulare : 0.01

  • Inclinatia drum: 0;

  • Densitate aer: 1.2;

  • Coeficient suprafata: 2;

  • Masa: 900 kg;

  • Inertie motor: 0.5

  • Inertia rotii: 3

  • Distanta axe automobile: 2.7

  • Constanta rului: 0.03

  • Conatanta pitch: 100







Fig. 4.41. Mediu virtual simulare autoturism drum drept

(ii) - aplicaţie demonstrativă complexă pentru simularea automobilului într-un oraş: în cadrul acestei aplicaţii utilizatorul poate sa testeze prin toate echipamentele haptice de prototipare virtuala dezvoltate în acest proiect, precum şi comportamentul automobilului la acceleraţie şi frânare. A fost modelat un mediu virtual al unui oraş ce conţine drumuri cu diferite viraje pe care utilizatorul trebuie sa se deplaseze (fig. 4.6). Pentru automobil au fost stabiliţi aceeaşi parametri iniţiali specificaţi în aplicaţia anterioara.





Fig. 4.42. Mediu virtual 3D aplicatie demonstrativa simulare autoturism în oraş

5.Diseminarea rezultatelor


  • Talabă, D. , Horvath I. , Kwan H. Lee, Advanced and Emerging Virtual and Augmented Reality Technologies in Product Design, Special Issue of Journal of Computer-Aided Design, Elsevier, Volume 42, Issue 5, Pages 361-478, 2010 (revista cotata ISI, factor impact  = 1.474).

  • Talaba D., Erdelyi H., Virtual Prototyping of Mechanisms Using Customized Haptic Feedback, Tools and Methods of Competitive Engineering, Volume1, pp: 577-584, Proceedings of TMCE 2010 Symposium, April 12-16, 2010, Ancona, Italy, ISBN 978-90-5155-060-3.


Anexa 1. Setarea parametrilor autovehiculului în matlab


%Parameters

spring_k = 50000;

spring_d = 4000;

spring_nl = 0.45; %normal length

Pickup.chassy_cg.name = 'chassy_cg';

Pickup.chassy_cg.coordinates = eval(['[1.6345 0 1.39]']);


%Masses

dummy_mass = 0.001;

dummy_innertia = [1 0 0; 0 1 0; 0 0 1]*0.00001;

chassy_mass = 995;

chassy_innertia = [200 0 0; 0 500 0; 0 0 600];

tire_mass = 25;

tire_innertia = [0.8 0 0; 0 0.8 0; 0 0 1];
%Front suspension Hard-Points:

Pickup.lca_front_l.name = 'lca_front_l';

Pickup.lca_front_l.coordinates = eval(['[67.0e-3 -400.0e-3 180.0e-3]']);

Pickup.lca_front_r.name = 'lca_front_r';

Pickup.lca_front_r.coordinates = eval(['[67.0e-3 400.0e-3 180.0e-3]']);

Pickup.lca_outer_l.name = 'lca_outer_l';

Pickup.lca_outer_l.coordinates = eval(['[267.0e-3 -750.0e-3 130.0e-3]']);

Pickup.lca_outer_r.name = 'lca_outer_r';

Pickup.lca_outer_r.coordinates = eval(['[267.0e-3 750.0e-3 130.0e-3]']);

Pickup.lca_rear_l.name = 'lca_rear_l';

Pickup.lca_rear_l.coordinates = eval(['[467.0e-3 -450.0e-3 185.0e-3]']);

Pickup.lca_rear_r.name = 'lca_rear_r';

Pickup.lca_rear_r.coordinates = eval(['[467.0e-3 450.0e-3 185.0e-3]']);

Pickup.lwr_strut_mount_l.name = 'lwr_strut_mount_l';

Pickup.lwr_strut_mount_l.coordinates = eval(['[267.0e-3 -600.0e-3 180.0e-3]']);

Pickup.lwr_strut_mount_r.name = 'lwr_strut_mount_r';

Pickup.lwr_strut_mount_r.coordinates = eval(['[267.0e-3 600.0e-3 180.0e-3]']);

Pickup.tierod_inner_l.name = 'tierod_inner_l';

Pickup.tierod_inner_l.coordinates = eval(['[467.0e-3 -400.0e-3 330.0e-3]']);

Pickup.tierod_inner_r.name = 'tierod_inner_r';

Pickup.tierod_inner_r.coordinates = eval(['[467.0e-3 400.0e-3 330.0e-3]']);

Pickup.tierod_outer_l.name = 'tierod_outer_l';

Pickup.tierod_outer_l.coordinates = eval(['[417.0e-3 -750.0e-3 330.0e-3]']);

Pickup.tierod_outer_r.name = 'tierod_outer_r';

Pickup.tierod_outer_r.coordinates = eval(['[417.0e-3 750.0e-3 330.0e-3]']);

Pickup.top_mount_l.name = 'top_mount_l';

Pickup.top_mount_l.coordinates = eval(['[307.0e-3 -500.0e-3 680.0e-3]']);

Pickup.top_mount_r.name = 'top_mount_r';

Pickup.top_mount_r.coordinates = eval(['[307.0e-3 500.0e-3 680.0e-3]']);

Pickup.uca_front_l.name = 'uca_front_l';

Pickup.uca_front_l.coordinates = eval(['[367.0e-3 -450.0e-3 555.0e-3]']);

Pickup.uca_front_r.name = 'uca_front_r';

Pickup.uca_front_r.coordinates = eval(['[367.0e-3 450.0e-3 555.0e-3]']);

Pickup.uca_outer_l.name = 'uca_outer_l';

Pickup.uca_outer_l.coordinates = eval(['[307.0e-3 -675.0e-3 555.0e-3]']);

Pickup.uca_outer_r.name = 'uca_outer_r';

Pickup.uca_outer_r.coordinates = eval(['[307.0e-3 675.0e-3 555.0e-3]']);

Pickup.uca_rear_l.name = 'uca_rear_l';

Pickup.uca_rear_l.coordinates = eval(['[517.0e-3 -490.0e-3 560.0e-3]']);

Pickup.uca_rear_r.name = 'uca_rear_r';

Pickup.uca_rear_r.coordinates = eval(['[517.0e-3 490.0e-3 560.0e-3]']);

Pickup.wheel_center_l.name = 'wheel_center_l';

Pickup.wheel_center_l.coordinates = eval(['[267.0e-3 -760.0e-3 330.0e-3]']);

Pickup.wheel_center_r.name = 'wheel_center_r';

Pickup.wheel_center_r.coordinates = eval(['[267.0e-3 760.0e-3 330.0e-3]']);
%Rear suspension Hard-Points:

Pickup.r_lca_front_l.name = 'r_lca_front_l';

Pickup.r_lca_front_l.coordinates = eval(['[2627.0e-3 -400.0e-3 240.0e-3]']);

Pickup.r_lca_front_r.name = 'r_lca_front_r';

Pickup.r_lca_front_r.coordinates = eval(['[2627.0e-3 400.0e-3 240.0e-3]']);

Pickup.r_lca_outer_l.name = 'r_lca_outer_l';

Pickup.r_lca_outer_l.coordinates = eval(['[2827.0e-3 -750.0e-3 190.0e-3]']);

Pickup.r_lca_outer_r.name = 'r_lca_outer_r';

Pickup.r_lca_outer_r.coordinates = eval(['[2827.0e-3 750.0e-3 190.0e-3]']);

Pickup.r_lca_rear_l.name = 'r_lca_rear_l';

Pickup.r_lca_rear_l.coordinates = eval(['[3027.0e-3 -450.0e-3 245.0e-3]']);

Pickup.r_lca_rear_r.name = 'r_lca_rear_r';

Pickup.r_lca_rear_r.coordinates = eval(['[3027.0e-3 450.0e-3 245.0e-3]']);

Pickup.r_lwr_strut_mount_l.name = 'r_lwr_strut_mount_l';

Pickup.r_lwr_strut_mount_l.coordinates = eval(['[2827.0e-3 -600.0e-3 200.0e-3]']);

Pickup.r_lwr_strut_mount_r.name = 'r_lwr_strut_mount_r';

Pickup.r_lwr_strut_mount_r.coordinates = eval(['[2827.0e-3 600.0e-3 200.0e-3]']);

Pickup.r_tierod_inner_l.name = 'r_tierod_inner_l';

Pickup.r_tierod_inner_l.coordinates = eval(['[3027.0e-3 -400.0e-3 350.0e-3]']);

Pickup.r_tierod_inner_r.name = 'r_tierod_inner_r';

Pickup.r_tierod_inner_r.coordinates = eval(['[3027.0e-3 400.0e-3 350.0e-3]']);

Pickup.r_tierod_outer_l.name = 'r_tierod_outer_l';

Pickup.r_tierod_outer_l.coordinates = eval(['[2977.0e-3 -750.0e-3 350.0e-3]']);

Pickup.r_tierod_outer_r.name = 'r_tierod_outer_r';

Pickup.r_tierod_outer_r.coordinates = eval(['[2977.0e-3 750.0e-3 350.0e-3]']);

Pickup.r_top_mount_l.name = 'r_top_mount_l';

Pickup.r_top_mount_l.coordinates = eval(['[2867.0e-3 -500.0e-3 700.0e-3]']);

Pickup.r_top_mount_r.name = 'r_top_mount_r';

Pickup.r_top_mount_r.coordinates = eval(['[2867.0e-3 500.0e-3 700.0e-3]']);

Pickup.r_uca_front_l.name = 'r_uca_front_l';

Pickup.r_uca_front_l.coordinates = eval(['[2927.0e-3 -450.0e-3 575.0e-3]']);

Pickup.r_uca_front_r.name = 'r_uca_front_r';

Pickup.r_uca_front_r.coordinates = eval(['[2927.0e-3 450.0e-3 575.0e-3]']);

Pickup.r_uca_outer_l.name = 'r_uca_outer_l';

Pickup.r_uca_outer_l.coordinates = eval(['[2867.0e-3 -675.0e-3 575.0e-3]']);

Pickup.r_uca_outer_r.name = 'r_uca_outer_r';

Pickup.r_uca_outer_r.coordinates = eval(['[2867.0e-3 675.0e-3 575.0e-3]']);

Pickup.r_uca_rear_l.name = 'r_uca_rear_l';

Pickup.r_uca_rear_l.coordinates = eval(['[3077.0e-3 -490.0e-3 580.0e-3]']);

Pickup.r_uca_rear_r.name = 'r_uca_rear_r';

Pickup.r_uca_rear_r.coordinates = eval(['[3077.0e-3 490.0e-3 580.0e-3]']);

Pickup.r_wheel_center_l.name = 'r_wheel_center_l';

Pickup.r_wheel_center_l.coordinates = eval(['[2827.0e-3 -797.0e-3 350.0e-3]']);

Pickup.r_wheel_center_r.name = 'r_wheel_center_r';

Pickup.r_wheel_center_r.coordinates = eval(['[2827.0e-3 797.0e-3 350.0e-3]']);

Anexa 2. clasa pentru setare parametrii şi generarea mesajelor transmise catre robotul Moog


/////////////////////////////////////////////////////////////////////////////

MesajMoog.h
class CMesajMoog

{

// Constructor



public:

CMesajMoog();

public:

CString mesaj_actual;



TCHAR m_szError[255];

CString state;

CString mod_lucru;

bool status_comunicatie;


//valori parametri moog
float fActuator_lenhgt1;

float fActuator_lenhgt2;

float fActuator_lenhgt3;

float fActuator_lenhgt4;

float fActuator_lenhgt5;

float fActuator_lenhgt6;


float roll;

float pitch;

float heave;

float surge;

float yaw;

float lateral;

bool mesajnou ;
CString mesaj_moog;

CString valoare_conversie;


// Operatii

public:


CString newposition_0();

CString deconectare_moog();

CString start_moog();

CString start_moog_82();

CString disable_moog();

CString park_moog();

CString engage_moog_dof();

CString reset_moog();

CString inhibit_moog();

void setmod(CString mod_actual);

void setstatus(CString status_actual);
CString set_mod_lenght();

CString set_mod_dof();

CString set_mod_mda();

bool setare_configuratie_dof(float roll, float pitch, float heave, float surge, float yaw, float lateral);

bool setare_configuratie_lenght(float act1, float act2, float act3, float act4, float act5, float act6);

bool setare_configuratie_mda(float a_roll,float a_pitch, float a_z, float a_x, float a_yaw, float a_y,float v_roll,float v_pitch, float v_yaw, float roll, float pitch, float yaw,

float buffet_roll, float buffet_pitch, float buffet_z, float buffet_x, float buffet_yaw, float buffet_y, float v_vehicle);
//functii citire parametrii
CString getstatus();

CString getmod();

CString get_mesaj_actual();
float get_Actuator_lenhgt1();

float get_Actuator_lenhgt2();

float get_Actuator_lenhgt3();

float get_Actuator_lenhgt4();

float get_Actuator_lenhgt5();

float get_Actuator_lenhgt6();


float get_roll();

float get_pitch();

float get_heave();

float get_surge();

float get_yaw();

float get_lateral();

//functii prelucrare mesaj
int _httoi(const TCHAR *value);

bool prelucrare_mesaj_primit_DOF(CString mesaj_primit);

bool prelucrare_mesaj_primit_LENGHT(CString mesaj_primit);
void reset_mesaj_actual();

//functii pentru conversie mesaj


void conversie_integer(int &valoare);

void append_int_mesaj();

void append_str_mesaj( CString string);

void reset_mesaj();

void conversie_float32_hex(float &valoare);

float conversie_hexto_float32(CString strHex);

void append_float_mesaj();
// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CMesajMoog)

//}}AFX_VIRTUAL


// Implementation

public:


virtual ~CMesajMoog();

};

/////////////////////////////////////////////////////////////////////////////



UdpAsySk.h
class CUdpAsySk : public CAsyncSocket

{

bool m_bReadyToSend;



// Attributes

public:


//CDialog* m_pDlg; //back pointers to the main dialog
CString m_sendBuffer; //for async send

int m_nBytesSent;

int m_nBytesBufferSize;

CString m_strRemote;

UINT m_remoteport;

UINT m_port;

CString m_strReceive;

CString m_strSend;

int recvdata;

//void DoAsyncSendBuff();

// CIndigoView Dview;
// Operations

public:


CUdpAsySk();

virtual ~CUdpAsySk();

// Overrides

public:


// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CUdpAsySk)

public:

virtual void OnAccept(int nErrorCode);



virtual void OnClose(int nErrorCode);

virtual void OnConnect(int nErrorCode);

virtual void OnOutOfBandData(int nErrorCode);

virtual void OnReceive(int nErrorCode);

virtual void OnSend(int nErrorCode);

virtual int Receive(void* lpBuf, int nBufLen, int nFlags = 0);

//virtual bool Send(const void* lpBuf, int nBufLen, int nFlags = 0);

//}}AFX_VIRTUAL


virtual bool Send(const void* lpBuf, int nBufLen);

CString GetReceivedData();

virtual void SetRemodeIP(CString &ip);

virtual void SetLocalPort(int &localport);

virtual void SetRemotePort(int &remoteport);

};




Yüklə 194,95 Kb.

Dostları ilə paylaş:
1   2   3   4   5   6   7   8




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin