Creazione ambiente e oggetti

di il
5 risposte

Creazione ambiente e oggetti

Ciao, mi servirebbe un consiglio.

Vorrei realizzare una sorta di gioco che mi sarebbe utile per simulare una situazione che poi dovrei riprodurre nella realtà con dei robot. In un ambiente quadrato (che in un secondo momento potrei modificare) al centro devo disporre un cerchio e a formare un triangolo a una distanza minima vorrei disporre due triangolini…. Ovviamente devo poi stabilire le regole di evoluzione di questi tre oggetti, mi servirà spostarli e salvare le posizioni. Come posso cominciare? Consigli?
Insomma questo step in matlab lo dovrei utilizzare solamente per farmi un’idea sull’evoluzione dei tre oggetti.

Grazie

5 Risposte

  • Re: Creazione ambiente e oggetti

    Per cominciare, definisci le coordinate delle posizioni iniziali dei vari oggetti.

    Per il plottaggio puoi usare la la funzione rectangle ( per disegnare:
    [*] un quadrato (per delimitare quello che chiami "ambiente quadrato"): basta specificare gli stessi valori per larghezza e lunghezza
    [*] il cerchio al suo interno: basta specificare gli stessi valori per larghezza e lunghezza, come per il quadrato e 'Curvature',[1 1]
    Per i due triangolini, puoi definite le coordinate dei tre vertici ed usare la funzione plot per plottare le linee che li congiungono.
    In alternativa pupi usare la funzione "patch" ()

    Quando chiami le funzioni per il plottaggio (sia all'inizio che nel ciclo for descritto nel seguito), devi farti "ritornare" l'handle.
    Setta "hold on" per abilitare l'aggiunte dei vari oggetti nel grafico

    Per "muovere" gli oggetti puoi semplicemente creare un ciclo "for" nel quale:
    [*] secondo le regole che stabilirai, calcolerai le nuove posizioni (coordinate) degli oggetti
    [*] cancellerai gli oggetti plottati nell'iterazione precedente, usando la funzione "delete"
    [*] chiamarai la funzione "pause" per fermare temporaneamente l'esecuzione in modo da ottenere l'effetto "movimento"
    [*] "ri-plotterai" gli oggetti nelle nuove posizioni, così come descritto sopra

    Dovresti anche chiamare la funzione "daspect" (con parametri [1 1 1]) per settare l'"aspect ratio" degli assi in modo che gli oggetti plottati non vengango "distorti"
  • Re: Creazione ambiente e oggetti

    Grazie mille per la risposta! ora provo a implementare il tutto
  • Re: Creazione ambiente e oggetti

    Ho un dubbio e vista la tua risposta vorrei sapere se puoi aiutarmi nuovamente. Ho disegnato come da te suggerito il cerchio e i due triangoli. Ora in pratica con delle righe di codice vado a selezionare sulla figura un punto che dovrà essere raggiunto dal cerchio mentre i due triangoli dovranno mantenere sempre questa configurazione ma disponendosi sulla base dello spostamento del cerchio che ho indicato in verde . In pratica si dovranno disporre rispetto al nuovo sistema di coordinate indicato in giallo, come in questa figura
    sol_finale.jpg
    sol_finale.jpg

    . ogni spostamento mi deve restituire le posizioni finali dei tre oggetti rispetto al sistema iniziale.
    Ringrazio chiunque possa darmi un'input per risolvere questo problema.
  • Re: Creazione ambiente e oggetti

    ask_raf ha scritto:


    Quando chiami le funzioni per il plottaggio (sia all'inizio che nel ciclo for descritto nel seguito), devi farti "ritornare" l'handle.
    Mi potresti spiegare cosa vuol dire farsi ritornare l'handle. Credo che uno dei problemi che sto riscontrando sia dovuto a come io ho creato questi oggetti.... perché per spostare almeno il cerchio la procedura l'ho in parte presa da un vecchio post ma non riesco a spostare il mio cerchio.....
    Mi resta comunque il problema sullo spostare i due triangolino mantenendo questa configurazione....come spiegato nei commenti precedenti. Ti allego il codice che ho fino ad ora
    Ho una funzione che mi consente di stabilire la nuova posizione del cerchio
    
    function xx = plot_uomo(fig,param,size,tol)
    
    figure(fig)
    flag_l=1;
    
    n_l=0;
    
    x=[];
    y=[];
    
    while flag_l
        [x_a,y_a] = ginput(1);
        flag_l = ~isempty(x_a);
        if flag_l
            n_l=n_l+1;
            s=plot(x_a,y_a,param);
            if (size)
                set(s,'MarkerSize',size)
            end
            x(n_l,1)=round(x_a*10^tol)/(10^tol);
            y(n_l,1)=round(y_a*10^tol)/(10^tol);
        end
    end    
    xx = [x,y];
    
    
    e lo script principale:
    
    
    figure
    title('Evoluzione')
    pos = [0 0 1 1];
    ambiente_1= rectangle('Position',pos);
    
    % posiziono l'uomo al centro dell'ambiente
    hold on
    grid on
    pos = [0.49 0.49 0.02 0.02];
    uomo = rectangle ('Position',pos,'Curvature',[1 1],'FaceColor',[1 0 0]);
    
    coordx_1 = [0.39 0.40 0.41];
    coordy_1 = [0.39 0.41 0.39];
    coordx_2 = [0.59 0.6 0.61];
    coordy_2 = [0.39 0.41 0.39];
    hold on
    robot_1 = patch(coordx_1,coordy_1,'b');
    hold on
    robot_2 = patch(coordx_2,coordy_2,'b');
    
    
    % Scelgo la posizione da far assumere all'uomo
    display('Inserire la nuova posizione del leader')
    xx_vp = plot_uomo(1,'mx',5,1);   %ho le coordinate della nuova posizione assunta dall'uomo
     
    % Definizione della coordinata X inziale
    x_ini=0.5;
    % Definizione della coordinata Y inziale
    y_ini=0.5;
    % Definizione della durata della simulazione
    t=10
    %prendo le coordinate che ho selezionato
    x_fin=xx_vp(:,1);
    y_fin=xx_vp(:,2);
    
    % Sezione per il plottagio
    % Scelta tipo plottaggio: 0 => punto
    %                         1 => linea continua
    p_mode=0
    % Definizione dell'intervallo di tempo
    dt=0.1
    % Calcolo del numero dei punti
    np=t/dt
    % Definizione dei vettori X e Y
    x_pt=linspace(x_ini,x_fin,np)
    y_pt=linspace(y_ini,y_fin,np)
    % Apertura della "figure"
    hold on
    
    if(p_mode == 0)
       for i=1:np
          delete (uomo)
          ph=plot(x_pt(i),y_pt(i),'d','markerfacecolor','r','markeredgecolor','r');
          daspect([1 1 1])
          pause(dt)
          delete(ph)
       end
    else
       for i=1:np-1
          plot([x_pt(i) x_pt(i+1)],[y_pt(i) y_pt(i+1)],'r','linewidth',2)
          daspect([1 1 1])
          pause(dt)
       end
    end
    

    Non riesco però a spostare il mio cerchio che nel codice è chiamato uomo.
  • Re: Creazione ambiente e oggetti

    Per quanto riguarda le funzioni che creano degli oggetti grafici (come "plot", "rectangle", ecc.) l'handle è il valore "ritornato" da esse.

    Nel tuo codice c'è un errore.
    Nel "main" crei il primo cerchio con la funzione rectangle la quale ti ritorna l'handle "uomo".
    Nella prima iterazione, del ciclo for, quando "p_mode" è uguale a 0, cancelli l'handle (uomo) il che cancella il cerchio, subito dopo, plotti il punto (che dovrebbe corrispondere al cerchio) usando la funzione "plot" la quale ti restituisce l'handle "ph".
    Successivamente, dopo la "pausa" cancelli l'oggetto grafico "ph".
    Nella seconda iterazione, viene chiamata nuovamente la funzione "delete" per cancellare "uomo", ma questo handle non esiste più perchè è stato cancellato nella prima iterazione e non è stato più creato.
    Il codice dovrebbe darti un messaggio di errore e fermarsi dopo la prima iterazione.
    Nel ciclo for dovresti creare il cerchio continuando ad usare la funzione "rectangle" nella chiamata alla quale devi aggiornare solo i primi due parametri della "position" e farti ritornare l'handle "uomo" in modo che venga creato ad ogni iterazione e, quindi possa essere cancellato.

    Una volta risolto il problema del cerchio, per far muovere i "robot" nella stessa direzione dell'"uomo", potresti:
    - prima del coclo for
    [*] calcolare la direzione (l'angolo) che segue il cerchio (arcotangente tra i due segmenti dati da y_fin-y_ini e x_fin-x_ini). Usa "atan2" e considera che la direzione Nord (angolo=0) corrisponde, in MatLab a 90° per cui dovrai sottrarre 90° al valore ritornato da atan2
    [*] una volta calcolata la direzione, puoi usare la matrice di rotazione
    mx=[cos(heading) -sin(heading)
                    sin(heading)  cos(heading)];
    
    per ruotare i due "robot" (le coordinate dei robots).

    - all'interno del ciclo for
    [*] plottare il cerchio nelle nuove posizioni
    [*] plottare i due triangoli aumentando, ad ogni iterazione, le loro coordinate x e y della stessa quantità della quale si incrementano quelle del cerchio

    Considera che, per come hai definito la funzione "plot_uomo" puoi definire più di un punto.
    Se definisci più di un punto, deve inserire quanto suggerito sopra, all'interno di un ciclo for che iteri sui punti che hai selezionato.
Devi accedere o registrarti per scrivere nel forum
5 risposte