爪車

ヒト型ロボット 146 肩に2自由度追加

ロボットの肩に2自由度追加しました。

2×2の計4軸追加。
予算不足のため、2個のKRS-2542HV ICSを追加購入して、
残りの2軸は使用していなかった手先のサーボで工面することにしました。



動作範囲を広く、肩幅を狭く、としたらこのサーボ配置になりました。

20120725-2.jpg

20120725-3.jpg

20120725-4.jpg

ヒト型ロボット 145 背景AVI

MMDの背景AVIに相当するものを実装しました。

動画の読み込み関連はOpenCVのVideoCaptureを利用しました。

Screenshot-21120713.png

OpenCVの画像を、テクスチャにして、ポリゴンに張り付けています。

cv::VideoCaptureは、set(CV_CAP_PROP_POS_FRAMES、frame)として、フレーム位置の指定ができるのですが、任意の位置が指定できるわけではなくて、次にデコードされる位置が指定されます。
そのため、一フレームごとにset(CV_CAP_PROP_POS_FRAMES、frame)でフレーム位置を指定するようなコードでは、再生動画がガクガクになってしまいます。

ここら辺の問題は、
https://code.ros.org/trac/opencv/ticket/1419
に詳しいです。

上記ページによると、任意のフレーム位置を指定するには、現状ではOpenCVライブラリ本体に手を入れなければならないようです。

でも、そんなことは面倒なので、無理やり任意位置を指定できるようにしてみました。
指定のフレーム位置より前のデコードされたフレームから、順に任意位置になるまでデコードするという方法です。


#include <iostream>

#include <opencv/cv.h>

#include <opencv/highgui.h>



using namespace std;



int main()

{

std::string filename = "movie.mp4";



cv::VideoCapture cap(filename);

if (!cap.isOpened()) {

std::cerr << "Error : can't open file = " << filename << std::endl;

return -1;

}



int64_t refFrame = 1000; // 指定フレーム



// とりあえず1フレーム取得

cv::Mat image;

cap.set(CV_CAP_PROP_POS_FRAMES, refFrame);

cap >> image;



// 現在のフレーム位置の取得 (おそらく、指定フレームよりも大きな値になる)

int64_t currentFrame = cap.get(CV_CAP_PROP_POS_FRAMES);



std::cout << "refFrame = " << refFrame << ", currentFrame = " << currentFrame << std::endl;



// 現在のフレーム位置が指定フレームの値よりも大きかった場合は、巻き戻す

int count = 1;

while (currentFrame > refFrame) {

int64_t df = 5 * count++;

int64_t frame = std::max<int64_t>(0, currentFrame - df);

cap.set(CV_CAP_PROP_POS_FRAMES, frame);

cap >> image;



currentFrame = cap.get(CV_CAP_PROP_POS_FRAMES);

}



// 現在のフレーム位置が指定フレームの値よりも小さくなった場合は、1フレームづつ指定の位置になるまで読み込む

while (currentFrame < refFrame) {

cap >> image;

currentFrame = cap.get(CV_CAP_PROP_POS_FRAMES);

}



std::cout << "refFrame = " << refFrame << ", currentFrame = " << currentFrame << std::endl;



// 表示

cv::namedWindow("image");

cv::imshow("image", image);



cv::waitKey(0);



cv::destroyAllWindows();



return 0;

}



この方法は効率が悪く、無駄に処理時間が掛かります。
とりあえずの対処療法ということで。

Top

HOME

tsumehashi

Author:tsumehashi
FC2ブログへようこそ!

06 | 2012/07 | 08
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -