ロボットの進む角度を導く

ロボットが移動する動画を撮影しその動画からロボットがどの程度の角度で移動したか導くことは可能ですか?
またどのような方法がありますか?
ロボットが進んだ道のりを線に出すといったサイトは見たことあるのですが
やり方が見つけられずお願いいたします。

3 Comments

Atsushi Ueno
Atsushi Ueno on 31 Jan 2023
>ロボットが移動する動画を撮影しその動画からロボットがどの程度の角度で移動したか導くことは可能ですか?
環境によりけりですが、下記の条件を満たせばロボットがどの程度の角度で移動したか導くことは可能だと思います。
  • ロボットの角度(向き)と移動方向が一致する ⇒ 条件が満たされない場合(例:オムニホイール搭載車)、ロボットの向きで移動方向を判断する事が出来ないので、速度ベクトルの角度から移動方向を判断するしかない
  • ロボットが移動する動画からロボットの位置を取得出来る
例えばマイクロマウスの様に2次元方向に移動するロボットを天井に固定したカメラで上から撮影した動画なら考えやすいです。要するにロボットの座標を逐次取得する事さえ出来れば、後から速度・速度ベクトルの角度・加速度を得る事が出来ます。
  • 動画の1フレーム内に映るロボットを認識する
  • 出来ればロボットの何れかの部位も認識し、同じ部位の座標を得る
  • 1フレームずつ座標取得を繰り返し、動画の長さ分の座標(時系列データ)を得る
  • 座標データ(一定の時系列データ)の差分から速度(時系列データ)を得る
  • 速度データから速度ベクトルの角度(時系列データ)を求める
下記は向きをランダムに変えて移動するロボットのシミュレーションです。速度ベクトルの角度を得て図示しています。
v = [0 0]; r = [0 0]; oldr = [0 0]; % 各種初期値
xp = cos(0:pi/6:2*pi); % 円描画用データ
yp = sin(0:pi/6:2*pi); % 円描画用データ
p = plot(r(1)+xp,r(2)+yp,'r'); % ロボット描画
hold on
q = quiver(0,0,0.01,0); % 矢印描画
rng(123); % この動きが良かった(?)
while true
a = (rand(1,2) - 0.5) * 0.01; % 加速度ベクトル
v = v + a; % 速度ベクトル
t = atan2(v(2),v(1)); % 速度ベクトルの角度
r = r + v; % 位置ベクトル
plot([oldr(1) r(1)],[oldr(2) r(2)],'g');
p.XData = r(1)+xp; % 変更:円描画用データを追加
p.YData = r(2)+yp; % 変更:円描画用データを追加
q.XData = r(1); % 追記:矢印の位置を動かす
q.YData = r(2); % 追記:矢印の位置を動かす
q.UData = cos(t); % 追記:矢印の角度を動かす
q.VData = sin(t); % 追記:矢印の角度を動かす
drawnow
oldr = r;
end
大空
大空 on 3 Mar 2023
  • 動画の1フレーム内に映るロボットを認識する
  • 出来ればロボットの何れかの部位も認識し、同じ部位の座標を得る
  • 1フレームずつ座標取得を繰り返し、動画の長さ分の座標(時系列データ)を得る
  • 座標データ(一定の時系列データ)の差分から速度(時系列データ)を得る
  • 速度データから速度ベクトルの角度(時系列データ)を求める
これらを教えて頂いてもよろしいでしょうか?
%% ロボットが動く動画を作成
vid = VideoWriter('moving_robot.avi');
open(vid);
N = 20; radius = 10; rsize = 3; t = (0:pi/N:pi*2)';
r(1:N*2+1,1) = radius * cos(t);
r(1:N*2+1,2) = radius * sin(t);
xp = rsize * cos(t + pi/4 + (0:pi/2:2*pi));
yp = rsize * sin(t + pi/4 + (0:pi/2:2*pi));
p = plot(r(1,1)+xp(1,:),r(1,2)+yp(1,:),'k'); % ロボット描画
xlim([-radius - rsize,radius + rsize]);
ylim([-radius - rsize,radius + rsize]);
axis off
for k = 1:size(r,1)
p.XData = r(k,1) + xp(k,:);
p.YData = r(k,2) + yp(k,:);
drawnow
frame = getframe(gcf);
writeVideo(vid,frame);
end
close(vid);
%% 動画からロボットの位置と動作方向を検出
vidObj = VideoReader('moving_robot.avi')
lastr = [0 0]; k = 0;
while hasFrame(vidObj)
k = k + 1; % 動画フレーム数
vidFrame = readFrame(vidObj);
BW = rgb2gray(vidFrame) < 127;
r(k,1:2) = [mean(find(sum(BW,1))), mean(find(sum(BW,2)))];
v(k,1:2) = r(k,:) - lastr;
t(k) = atan2(v(k,2),v(k,1));
aglx = radius * 10 * cos(t(k));
agly = radius * 10 * sin(t(k));
imshow(vidFrame);
hold on
quiver(r(k,1),r(k,2),aglx,agly,'k');
lastr = r(k,:);
end

Sign in to comment.

Answers (0)

Products

Release

R2022b

Asked:

on 31 Jan 2023

Commented:

on 5 Mar 2023

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!