2017-04-06 12 views
1

掃除ロボットをシミュレートするプログラムを作成する必要があります。私たちはOctaveでそれをする必要があります。Octave/Matlabで移動する2次元プロットの回転

Main() 
    clear all; 

    %Initalisierung der Raummatrix, damit nachher abgefragt werden kann 
    XMatrix = 0; 
    YMatrix = 0; 

    %"Winkel festsetzten" 
    t=1; 
    h=1; 
    hold on 
    %Startpunkte vom Punkt 
    x = 20; 
    y = 15; 
    alpha = 45; 

    xalt= 10; 
    yalt= 10; 

    %Hier die Methode ändern um verschiedene Räume einzulesen 
    [XMatrix,YMatrix] = RaummitsechsEcken(); 

    %plot Funktion wird gespeichert 
    p = plot(x,y,'*'); 
    %p1 = plot(x,y,xalt,yalt); 

while(true) 


    pause(0.001) 

    %alte Position speichern 
    xalt = get(p,'XData'); 
    yalt = get(p,'YData'); 

    %Bewegungsberechnung 
    set(p,'YData',get(p,'YData')+0.1*t); 
    set(p,'XData',get(p,'XData')+0.1*h); 

    % Strich plot 

    %Kollisionabfrage 
    if(inpolygon(get(p,'XData'),get(p,'YData'),XMatrix,YMatrix) == false) 

     %Alte Position zurückspielen  
     set(p,'XData',xalt); 
     set(p,'YData',yalt); 

     %Neue Winkelberechnung(random) 
    t = -1+rand(1)*(1-(-1)); 
     h = -1+rand(1)*(1-(-1)); 


    endif 

    endwhile 

endfunction 


function[X,Y] = RaummitsechsEcken() 

X = [10 18 10 30 22 30 10]; 
Y = [1 16 30 30 16 1 1]; 

plot(X,Y) 
hold on 
endfunction 

「ロボット」は壁に当たったときのコードの問題は、彼がランダムにこのように新しい天使と動きを生成していること、です。問題は、ロボットが角度と速度について同じ変数を持つということです。速度は角度によって異なります。私の質問は、誰かが私のポイントを同じ速度で動かす方法を知っていても、ロボットが壁に当たったときの速度から離れて方向を変えれば、今のところです。私は回転行列を検索しましたが、それで動作させることはできません。 私はあなたが助けることを願っています!

フェリックス

+0

2つの変数を使用しますか? – Suever

+0

また、 't'と' h'を正規化してください。 – beaker

答えて

0

解決策は少しトリッキーです。デカルト座標系でロボットの新しい位置を設定すると、xとy座標が両方のパラメータを制御するため、角度と速度は常に変更されます。しかし、非常に単純な解法があります。変換デカルト座標を極座標に使うと、角度と大きさが得られます。大きさを一定の速度係数で置き換え、hおよびt値、すなわち直角座標を再び計算する。したがって、コードにの3つの行を追加するだけです。

angle = atan2(t,h); 
t = speedFactor*sin(angle); 
h = speedFactor*cos(angle); 

あなたのコードは次のようになります。ちょうど角を用いて横

Main() 
    clear all; 


    % You can control speed by increasing or decreasing this parameter. 
    speedFactor = 0.1; 


    %Initalisierung der Raummatrix, damit nachher abgefragt werden kann 
    XMatrix = 0; 
    YMatrix = 0; 

    %"Winkel festsetzten" 
    t=1; 
    h=1; 



    hold on 
    %Startpunkte vom Punkt 
    x = 20; 
    y = 15; 
    alpha = 45; 

    xalt= 10; 
    yalt= 10; 

    %Hier die Methode ändern um verschiedene Räume einzulesen 
    [XMatrix,YMatrix] = RaummitsechsEcken(); 

    %plot Funktion wird gespeichert 
    p = plot(x,y,'*'); 
    %p1 = plot(x,y,xalt,yalt); 

while(true) 


    pause(0.001) 

    %alte Position speichern 
    xalt = get(p,'XData'); 
    yalt = get(p,'YData'); 

    %Bewegungsberechnung 
    set(p,'YData',get(p,'YData')+0.1*t); 
    set(p,'XData',get(p,'XData')+0.1*h); 

    % Strich plot 

    %Kollisionabfrage 
    if(inpolygon(get(p,'XData'),get(p,'YData'),XMatrix,YMatrix) == false) 

     %Alte Position zurückspielen  
     set(p,'XData',xalt); 
     set(p,'YData',yalt); 

     %Neue Winkelberechnung(random) 
     t = -1+rand(1)*(1-(-1)); 
     h = -1+rand(1)*(1-(-1)); 

     angle = atan2(t,h); 
     t = speedFactor*sin(angle); 
     h = speedFactor*cos(angle); 


    endif 

    endwhile 

endfunction 


function[X,Y] = RaummitsechsEcken() 

X = [10 18 10 30 22 30 10]; 
Y = [1 16 30 30 16 1 1]; 

plot(X,Y) 
hold on 
endfunction 
+1

素晴らしい作品です!私はすべてを解読しようとしますが、最初のテストはうまくいきます!ご助力ありがとうございます! – Felix

+0

@Felixあなたの問題を解決したら、私の答えを投票するのをためらってください。 –

+1

私の評判は低いですので、私の投票は表示されません...私は "最高の"答えとしてマークすることができます。 – Felix

0

、あなたはまた、速度の正確な視覚的印象を得るために「等しい」に軸を設定する必要があります。

p = plot (x, y, '*'); 
axis ("equal"); 

と計算で(私もそれをより面白くするためにあなたの部屋を変更)を与える衝突

alpha = 2*pi*rand(); 

後の新しい位置

set(p,'YData',get(p,'YData')+0.2*sin(alpha)); 
set(p,'XData',get(p,'XData')+0.2*cos(alpha)); 

をPF

enter image description here

+0

軸(「等しい」)は良いことです。ありがとうございます。それに加えて、私たちがこのプログラムをする前に、たくさんの部屋を作りました。私が理解していないことの一つは、あなたが角度をランダムに計算するということです。 – Felix

+0

はい、私は車両が0から2 * pi(0と360°)の間でランダムに衝突後に車両が変化する一定の速度(上記の例ではタイムステップ当たり0.2単位)を使用すると仮定します。 Btw、どのような学校でOctaveを学びますか? Realschule、体育館? – Andy

+0

したがって、すべてを極座標系で計算し、デカルト座標系で計算します。私は2つの異なる科目について大学で学びます。数学と信号とシステム。 – Felix

関連する問題