MATLABでの多角形障害物回避プログラム作成方法について

このQ&Aのポイント
  • MATLABを使用して多角形障害物を回避するプログラムを作成する方法について質問です。
  • 現在、始点と終点を決めてクリックした場所をつないでいくプログラムを作成していますが、問題文に沿っていません。
  • 最終的にはダイクストラの方法を使用して最短の折れ線経路を求める予定です。
回答を見る
  • ベストアンサー

MATLABについての質問です。

大学の研究していてMATLABでわからないところがあるのでぜひ教えて頂けたらと思っています。 よろしくお願い致します。 現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるプログラムを作っているのですがどのように作ればいいかわかりません。 今は始点と終点を決めてクリックした所をつないでいくプログラムができたのですが問題文に沿ってできていません。 このプログラム後はダイクストラの方法で最短折れ線経路を求めるので それを含めてよろしくお願い致します。 clear all; close all; clc; init=1; final=1000; figure(1) for loop=init:final [x,y] = ginput A=[x,y] if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 B{loop} =A else break end end figure(2) for C=init:loop-1 B{C} fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); end [x,y] = ginput pb=[x,y] figure(3) for C=init:loop-1 fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); plot(pb(:,1),pb(:,2),'o');hold on end for D=init:final [x,y] = ginput if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 plot([pb(1,1),x',pb(2,1)],[pb(1,2),y',pb(2,2)],'-*');hold on node{D}=[[pb(1,1),x',pb(2,1)],[pb(1,2),y',pb(2,2)]] B{D} = sum(node{D}) else break end end for E=init:D-1 B{E} end

質問者が選んだベストアンサー

  • ベストアンサー
  • Kules
  • ベストアンサー率47% (292/619)
回答No.2

A No.1のKulesです。 確かにいろいろ見てみるとこのプログラム動きますね。 まあ直したいところは山ほどありますが、そこは本題ではないのでやめときます。 で、それより問題なのはこのプログラムがきちんと動いているにも関わらず この質問を >MATLABについての質問です。 と思っていることでしょうか。 Matlabはちゃんと動いているのであれば、この質問は >現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるプログラム に対する質問であって、Matlabについての質問ではないですよね。 (アルゴリズムに関する質問とでもいいましょうか) ということで、まず考えるべきは >現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるプログラム をどのような考え方で組むかであって、それをMatlabでどう書くかではありません。 もう一つ「ダイクストラ法」についても同様で、 まず ・ダイクストラ法とは何たるかを勉強する(ここはもうクリアしているんですよね?) ・それをプログラムでどのように書けば実現できるのか調べる となります。で、どのように書けばいいかを調べるには別言語でも構わないので そのアルゴリズムをそのまま書いたサンプルを見つけることです。 例えばgoogleで「ダイクストラ法 プログラム」を検索してみると、 5分と立たず http://www.ss.cs.meiji.ac.jp/CCP024.html のようなサイトを見つけられます。これはcで書かれているようですね。 cのプログラムが読めるのであれば、それをMatlabの文法に従って翻訳してやればいいですね。 ということで、まず「今詰まっているのはMatlabではなく、アルゴリズムそのものだ」という認識を持つ必要があります。 と、ここまで偉そうに書きましたが、もしかしたらアルゴリズムは完成しているのかも知れませんよね。 >現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求める という機能をどうやって実現するか。 などすでに自分の中にあれば(プログラムではなく、文字での説明でも)補足していただければ有用な回答ができると思います。 まあ私の思いつきで書くなら、 例えば始点と終点を決めたらその間を結ぶ直線と一つの多角形が交点を持つか調べ、交点を持っているのであれば 多角形の頂点の一つを選んで始点→頂点→終点と結べば多角形を回避できますね。多角形が複数あるのであれば何回も繰り返せばよいでしょう。 参考になれば幸いです。

syounan101
質問者

お礼

ありがとうございました。 無事ここまでできました。

その他の回答 (1)

  • Kules
  • ベストアンサー率47% (292/619)
回答No.1

えっと…まずこのプログラムちゃんと動きます? 何か不安になるところがたくさんあるんですが。 で、仮にもプログラム載せるのであればコメントぐらい入れて欲しいなあ…と思ってみたり。 (解読するのも大変なので) 雰囲気としては、figure(1)で任意多角形を定義して、figure(2)でそれを描いた上で通る点を指定し、 figure(3)で多角形と通る点を書いた上で通る点を結んでいくって感じですかね? これを全部違うfigureに描く理由はなんですかね?hold onの使い方は分かっているようですし。 あと、ここに投稿する分には構いませんが各行の最後は;で終わっておいた方がよいですね。余計な出力がうっとうしいので。 まず if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 ってエラー出ませんか?私の感覚だと&じゃなくて&&じゃないとエラーが出る気が…あとそれぞれの比較もallかany使うとか。 (if文にlogicalを与えることは出来ますが、logicalのベクトルや行列は与えられなかった気が) ginputを使ってる文はfinalで1000回とかで区切るよりはwhile使った方がいい気はしますが、本質ではないですね。 とまあいろいろ書きましたが、結局どこで止まっているのかがわからないです。 私が一読した感じだとこのプログラムはまともに動かなさそうですが、 >今は始点と終点を決めてクリックした所をつないでいくプログラムができたのですが問題文に沿ってできていません。 という書き方をしている以上動いているのでしょうし。 ダイクストラの方法というのがどのようなものかはわかりませんが、Matlabの組み込み関数になければ自作するしかないですし、自作するならその手の本を読んでそれに書かれている通り組めばとりあえず動くものは出来そうですしね。 というわけで、現在どの状態でしょうか? 1.「今は始点と終点を決めてクリックした所をつないでいくプログラムができたのですが問題文に沿ってできていません。」とは書いたが、実は上手く動いていない。どのようにすればエラーなく動くようになるのか? 2.一応動いてはいるが、自分の意図したものとは違う動き方をしている。なぜ?(これは、どのような意図をして書いたのかがわからないと回答のしようがありません) 3.一応意図通りに動いているが、ダイクストラの方法をどのようにして組めばいいかがわからない。 この辺りも含めて補足していただければ、もう少し有用な回答ができるor他の方から付くかも知れません。 参考になれば幸いです。

syounan101
質問者

補足

2と3です。わかりづらく大変申し訳ございません。 まず2ですがプログラムは動いています。 任意の物体を配置した後クリックして点をうってその点たちを任意の図形と交わらないようにつなぎ回避経路を求めたいのですが今のプログラムだとひと経路づつクリックしてつないでいくようなプログラムになっていて全部の回避経路を求める場合なかなか難しくなってきます。 是非その辺を改善したく質問させて頂きました。 3ですがダイクストラ方法をどのように組めばいいかネットなどで調べたのですがアルゴリズムは理解したのですが具体的な組み方が分からずプログラムを書くことができませんでした。 是非お力添えよろしくお願い致します。

関連するQ&A

  • MATLABの質問です。

    MATLABについての質問です。 大学の研究していてMATLABでわからないところがあるのでぜひ教えて頂けたらと思っています。 よろしくお願い致します。 現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるところまでできています。その後、全経路からダイクストラの方法で最短折れ線経路を求めたいのですがどのようにプログラムを持っていけばいいか分からず手詰まりしました。 ぜひご指導いただけますでしょうか。 よろしくお願いいたします。 プログラムは動きます。 close all; clc; init=1; final=1000; %図形座標取得 figure(1) for loop=init:final [x,y] = ginput A=[x,y] if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 B{loop} =A else break end end % size(B{i},1) figure(2) for C=init:loop-1 B{C} fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); end [x,y] = ginput pb=[x,y] figure(3) for C=init:loop-1 fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); plot(pb(:,1),pb(:,2),'o');hold on axis([0,1,0,1]); end %図形の辺 k=0; for i=1:loop-1 for p=1:size(B{i},1) for q=p+1:size(B{i},1) k=k+1; obst(k,:) = [B{i}(p,:),B{i}(q,:)]; end end end Pall = pb(1, :); Pall = [Pall; cat(1, B{:})]; Pall = [Pall; pb(2, :)]; %全経路 k=0 for i=1:size(Pall,1) for j=i+1:size(Pall,1) k=k+1; path(k,:) = [Pall(i,:),Pall(j,:)]; point{k}=[i,j]; end end % 交差判定 H=0 for j=1:size(path,1) cflas=1 for i=1:size(obst,1) y1=((obst(i,1)-obst(i,3))*(path(j,2)-obst(i,2))+(obst(i,2)-obst(i,4))*(obst(i,1)-path(j,1))) y2=((obst(i,1)-obst(i,3))*(path(j,4)-obst(i,2))+(obst(i,2)-obst(i,4))*(obst(i,1)-path(j,3))) y3=((path(j,1)-path(j,3))*(obst(i,2)-path(j,2))+(path(j,2)-path(j,4))*(path(j,1)-obst(i,1))) y4=((path(j,1)-path(j,3))*(obst(i,4)-path(j,2))+(path(j,2)-path(j,4))*(path(j,1)-obst(i,3))) Y1=y1*y2 Y2=y3*y4 if Y1<0&&Y2<0 H=H+1 cflas=0 S{j}=[0,0,0,0] S1{j}=[0,0,0,0] end end if cflas==1 X=[path(j,1),path(j,3)]; Y=[path(j,2),path(j,4)]; Xa=[path(j,1),path(j,2)]; Yb=[path(j,3),path(j,4)]; S{j}=[X,Y] S1{j}=[Xa,Yb] plot(X,Y,'-');hold on end end barricade = length(B{1,1}); M=zeros %コストを計算 for k = 1:size(path,1) X1=S{k}(1,1); X2=S{k}(1,3); Y1=S{k}(1,2); Y2=S{k}(1,4); cost{k}=sqrt((X2-X1)^2+(Y2-Y1)^2) M(point{k}(1), point{k}(2) )=cost{k} % if cost{i}==0 % cost{i}=10 % end end M' g=cost{1} for j=1:size(obst,1)+1 if(cost{j}>cost{j+1}) g= cost{j+1} end end

  • 数値解析(MATLAB)について

    vehi=[0,1,1,-1,-1,0;2,1,-1,-1,1,2]; plot(vehi(1,:),vehi(2,:));axis equal;axis([-15 15 -15 15]); [x,y]=ginput(1); hold on;plot(x,y,'p');hold off; [x1,y1]=ginput(1); hold on;plot([x x1],[y y1]);hold off; theta=atan2(y1-y,x1-x)-pi/2; R=cos(theta),-sin(theta);sin(theta),cos(theta)]; newvehi=R*vehi; hold on;plot(newvehi(1,:)+x,newvehi(2,:)+y);hold off このプログラムは実効したんでどのようになるかは分るんですが、講義で、プログラムの説明がされなかったので、全然意味が分りません。 vehiって何ですか? ginput(1)って何をしているんですか?(1)の意味って何ですか? hold onは何をしているんでしょうか? plot(x,y,'p')は何をしているんですか?pって何ですか? hold offで何をしてるんですか? theta=atan2(y1-y,x1-x)-pi/2は何をしているんですか?atan2って何ですか?アークタンジェント2? plot(newvehi(1,:)+x,newvehi(2,:)+y)って何をしてるんですか? ほとんど意味が分りません。特に、atan2とかは意味不明です。 それぞれが何をしているのか順序を追って説明をお願いします。 分りやすい解説をお願いします。

  • MATLAB

    matlabで for x=1:10 for y=1:10 for z=1:10 f=2*x+3*y-4*z; end end end のようなプログラムで、最大のときのfの値と、そのときのx,y,zの値を表示させるにはどのように書けばいいでしょうか?

  • MATLABのrbboxについての質問です。

    MATLABのrbboxについての質問です。 MATLABである画像の領域内の情報を取得できるようにしたいのですが、調べてみると、rbboxという関数を使って出来るらしいです。実際にMATLABのHPにあったソースコードを動かしてみると、画像にマウスでドラッグした領域の枠が描かれるのですが、その画像の領域をどうやって処理を行えるように出来るのかがわかりません。出来れば教えてほしいです。rbboxのソースコードを下に示します。宜しくお願いします。 figure; pcolor(peaks); k = waitforbuttonpress; point1 = get(gca,'CurrentPoint'); % ボタンダウンの検出 finalRect = rbbox; % figure単位の出力 point2 = get(gca,'CurrentPoint'); % ボタンアップの検出 point1 = point1(1,1:2); % x と y の抽出 point2 = point2(1,1:2); p1 = min(point1,point2); % 位置と大きさの計算 offset = abs(point1-point2); % x = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)]; y = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)]; hold on axis manual plot(x,y,'r','linewidth',5) % ボックスの回りに選択した領域の描画

  • MATLABのfor文の使い方について

    MATLAB(というかプログラム)初心者です 下記を教えてください よろしくお願いいたします 「つくりたいプログラム」 y1=[A B C] y2=[D E F] ・ ・ ・ y200=[AA BB CC] 上記のような200個くらいある行列に同じ操作をしたいです そこでいちばん簡単な構造を考えました ////////////////////// y1=[A B C] y2=[D E F] for i=1:2 Yi=yi*5 end ///////////// 成功イメージは Y1=[5A 5B 5C] Y2=[5D 5E 5F] となってほしいのですが回りません・・・ yiの定義のしかたがわからず困っております 初歩的な質問かもしれませんが教えてくださいよろしくお願いいたします

  • MATLABの質問

    a = imread('AM100-1.png'); b = imread('AM100-2.png'); a = im2uint16(a); b = im2uint16(b); c=b-a; c2=a-b; d=c/10; d2=c2/10; p1=a+d; P1=p1-d2; p2=P1+d; P2=p2-d2; p3=P2+d; P3=p3-d2; p4=P3+d; P4=p4-d2; p5=P4+d; P5=p5-d2; PP1 = label2rgb(P1, @jet); PP2 = label2rgb(P2, @jet); PP3 = label2rgb(P3, @jet); PP4 = label2rgb(P4, @jet); PP5 = label2rgb(P5, @jet); [nRows nCols] = size(P1); for iCol = 1:nCols for iRow = 1:nRows if P1(iRow,iCol)<17000; PP1(iRow,iCol,:)=0; if P2(iRow,iCol)<17000; PP2(iRow,iCol,:)=0; if P3(iRow,iCol)<17000; PP3(iRow,iCol,:)=0; if P4(iRow,iCol)<17000; PP4(iRow,iCol,:)=0; if P5(iRow,iCol)<17000; PP5(iRow,iCol,:)=0; end end end end end end end A = cat(4,PP1,PP2,PP3,PP4,PP5); 初心者ながら上のようなプログラムを作ったんですが、うまくまとめられないでしょうか?

  • MATLAB 相互相関

    X = zeros(200, 200,3); %%% RGB plane X(95:105, 95:105, 1) = 255; X(95:105, 95:105, 2) = 255; X(95:105, 95:105, 3) = 255; figure imshow(X,[]); Y = zeros(100, 100,3); %%% RGB plane Y(45:55, 45:55, 1) = 255; Y(45:55, 45:55, 2) = 255; Y(45:55, 45:55, 3) = 255; figure imshow(Y,[]); このあと、XとYの相互相関をnormxcorr2でグラフ化したいのですが・・ 色々なサイトを見て、 c=normxcorr2(X,Y)や、c=normxcorr2(X(:,:,1),Y(:,:,1))などを試したのですがエラーが出てしまいます。 何かこれの前に打たなければいけないプログラムがあるのでしょうか・・・

  • MATLAB初心者;プログラミングのエラーが直せない

    こんにちわ、先週からMATLABを学び始め、これからプログラムを作っていこうと思っているところです。以下のプログラムを作ろうとしているのですが、エラーが出てしまいます。似たようなプログラムがあったのでそれを修正して、自分で解答してみたのですがうまくいきません。 【課題】Quadratic equation x^2+b*x+c = 0 has two roots. They are given by r1 = (-b+sqrt(b^2-4*c))/2 and r2 = (-b-sqrt(b^2-4*c))/2. Fix the value of c at c=1, plot r1 and r2 as functions of b for b in [2,3]. Plot two curves in one figure. Use about 100 points to represent each curve. 【自分の解答例】 % % Plot f1(x) = (-x+sqrt(x^2-4))/2 and f2(x) = (-x-sqrt(x^2-4))/2 for x in [2,3] % clear; clf; % n=81; dx=8/(n-1); x=[-4:dx:4]; f1=(-x+sqrt(x^2-4))/2; f2=(-x-sqrt(x^2-4))/2; % plot(x,f1,'b-','linewidth',2.0) hold on plot(x,f2,'ko') axis([-4.0,4.0,-1.4,3.8]) set(gca,'xtick',[-4:1:4]) set(gca,'ytick',[-1:1:3]) set(gca,'fontsize',14) xlabel('x') ylabel('f(x)') h1=legend('f1(x)=(-x+sqrt(x^2-4))','f2(x)=(-x-sqrt(x^2-4))/2'); set(h1,'fontsize',12) % ??? Error using ==> mpower Matrix must be square. というエラーが出てしまいます。変数はあとでbに直すつもりですが、エラーの意味がわかりません。よろしくお願いします。

  • MATLABによるラグランジェ補間

    下記1~2行目の8点が与えられていて、ラグランジェ補間を行う問題です。 下記のプログラムを自分で組んだものの、おかしな値が返ってきます。 どこが間違っているのか全く検討がつかないのでわかる方がいらっしゃったらどうかご教授お願いします。 x=[0,1.2,2.1,3.5,4.8,6.7,8.5,9.7]; y=[0.4,1.3,2.0,3.1,4.0,5.2,6.0,6.1]; x0=(0:0.001:15); h=0.0001; a=0; j=1; while a<=15 f(j)=0; for i=1:8 b=(lag(x(i)+h)-lag(x(i)))/h; f(j)=f(j)+lag(a)*y(i)/(b*(a-x(i))); end a=a+0.001; j=j+1; end plot(x0,f) [lag.m] function f=lag(x) g=1; z=[0,1.2,2.1,3.5,4.8,6.7,8.5,9.7]; for i=1:1:8 if x ~= z(i) g = g*(x-z(i)); end end f=g;

  • MATLABで連続した画像の取り込み方

    1つのJPGファイルを取り込み、表示させるやり方は I = imread('sample000.jpg'); imshow(I) これででき、作業を書くと for t=1:1:10 if(t==1) A=imread('sample000.jpg'); imshow(A) hold on [xa, ya]=textread('sample01.txt','%d %d','headerlines',10); end plot(xa(t,1), ya(t,1), 'r+'); if(t==10) hold off end end ということになります。 10回ループさせるのは、sample01.txtの10行目以降の中身が10個ずつの座標だからです 以下はsample01.txtの中身を簡単に書いたものです ...         ※9行目 test coordinates  ※10行目 44 54        ※11行目 45 46 53 43 55 41 58 38 61 33 66 36 69 41 72 47 73 52        ※20行目 10         ※21行目 46 54        ※22行目 48 52 ... ... 77 51        ※31行目 10         ※32行目 47 52        ※33行目 ... ... という感じです。 で、本題ですが sample000.jpg sample001.jpg sample002.jpg ... ... など複数のjpgファイルをループを使って連続して取り込み、作業したいときは、どういうコマンドでどういうループを作ればいいでしょうか? 具体的には 1枚目のsample000.jpgファイルを読み込みhold on、sample01.txtの11行目から20行目の座標を赤い点でプロットし、最後にhold off 2枚目のsample001.jpgファイルを読み込みhold on、sample01.txtの22行目から31行目の座標を赤い点でプロットし、最後にhold off 3枚目の... というループです。 下手な説明でごめんなさい、誰かMATLABの画像処理に詳しい方がいたら応答よろしくおねがいします。

専門家に質問してみよう