2017-04-06 25 views
1

我必须创建一个模拟真空吸尘器机器人的程序。我们必须用Octave来做。在Octave/Matlab中旋转移动的二维绘图

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 

与代码的问题是当“机器人”打在墙上,他是随机生成一个新的天使,现在以这种方式移动。问题在于机器人具有相同的角度和速度变量。所以速度随角度而变化。现在我的问题是,如果有人知道如何以相同的速度移动我的观点,但改变方向与机器人击中墙壁时的速度不同。我已经寻找了一个旋转矩阵,但是我无法使它与它一起工作。 我希望你能帮助!

Felix

+0

使用两个变量? – Suever

+0

或正常化't'和'h'。 – beaker

回答

0

该解决方案有点棘手。当您在笛卡尔坐标系中设置机器人的新位置时,角度和速度总是会同时改变,因为x和y坐标控制着两个参数。但是有一个非常简单的解决方案,如果使用转换笛卡儿坐标到极坐标,您将获得角度和大小。用一个恒定的速度系数替换幅值,再次计算h和t值即笛卡尔坐标。所以你只需要在你的代码中添加这些三个行。

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"); 

,并在计算pf的新位置

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

碰撞后

alpha = 2*pi*rand(); 

这给(我还修改了你的房间,使之更加有趣)

enter image description here

+0

轴(“平等”)是一件好事,谢谢你。除此之外,在我们制作这个程序之前,我们创造了很多房间。有一件事我不明白的是,你以另一种方式随意调整角度,就像我们做的那样,对吧? – Felix

+0

是的,我假设车辆使用恒定速度(上例中为每单位时间单位0.2个单位),以及0和2 * pi(0和360°)之间随机碰撞后车辆行驶的角度。顺便说一下,你学习八度的哪种学校? Realschule,健身房? – Andy

+0

因此,总而言之,您可以在极坐标系统中计算它,并且我们用笛卡尔坐标系计算它。我在大学学习了两门不同的课程。数学和信号与系统。 – Felix