爪車

ヒト型ロボット 36 歩行パターン生成ほぼ完成

線形倒立振子に基づいた歩行パターンを実際のロボットの運動に適用させるため、歩行動作開始、停止、方向転換のパターン生成ができるようにしました。これで、歩行パターン生成はほぼ完成です。

以前は歩行開始時に片脚を上げた状態からだったのを、両脚が接地している状態から始められるようにしました。
両脚支持時の重心の運動を、片脚支持になるときの重心位置、速度に滑らかに接続できるようにしています。
歩行動作停止時には、両脚で支持できる状態で停止するようにしています。
重心の位置の運動を4次関数で計算しているだけなので、動力学等は考慮していないのですが、十分にゆっくり動かせば大丈夫だと思います。

方向転換は本の通りにしただけです。
実際の着地点が目標着地点とけっこうずれています。

xy平面の重心の軌跡
gnuplot091227-1.gif

y方向の速度
gnuplot091227-2.gif

青い部分は両脚支持期間。赤い丸が実際の着地点です。

ヒト型ロボット 35 両脚支持期間の導入

線形倒立振子の歩行パターンに「ヒューマノイドロボット」(オーム社)、4.3.4の両脚支持期間を導入してみました。

本の通りに両脚支持期間の重心の位置は時間に関する4次関数
x(t) = a0 + a1*t + a2*t^2 + a3*t^3 + a4*t^4
で求めました。

係数a0...a4は上の式と、上の式を1階、2階、3階まで微分してできた式と、支持脚交代前後の状態(位置、速度、加速度)、両脚支持期間の条件から連立方程式により求めます。

両脚支持期間導入前の重心のx方向の速度
(重心高さZc=0.8,歩行周期Tsup=0.8,x方向歩幅0.3, y方向歩幅0.2)
Screenshot-Gnuplot-dx.gif
支持脚の交代が一瞬で行われるので、支持脚の交代時に重心の速度は屈曲点になります。

両脚支持期間を導入後の重心のx方向の速度
(重心高さZc=0.8,歩行周期Tsup=0.7,両脚支持期間Tabl=0.1,x方向歩幅0.3, y方向歩幅0.2)
Screenshot-Gnuplot-dx-s.gif
青い部分が、両脚支持期間の導入による効果です。
両脚支持期間の導入により、重心の速度が、滑らかに変化するようになりました。


両脚支持期間導入前のxy平面の重心の軌跡
(重心高さZc=0.8,歩行周期Tsup=0.8,x方向歩幅0.3, y方向歩幅0.2)
Screenshot-Gnuplot-xy.gif

両脚支持期間導入後のxy平面の重心の軌跡
(重心高さZc=0.8,歩行周期Tsup=0.7,両脚支持期間Tabl=0.1,x方向歩幅0.3, y方向歩幅0.2)
Screenshot-Gnuplot-xy-s.gif
青い部分が両脚支持期間における重心の軌跡です。
両脚支持期間の導入により、歩幅が増大しています。




C言語でgnuplotを利用してグラフ表示

最近、C言語のプログラム中からgnuplotを呼び出し、グラフの表示をする方法を知りました。
パイプを使ってgnuplotにコマンドを送る方法です。特別なライブラリ等を使用するわけではないので気楽に利用できます。

こちらのページを参考にさせて頂きました。
4 C言語からgnuplotを操作する

いままでは、Cプログラムで計算したデータをファイルに書き出して、エクセルやらgnuplotなどでグラフ表示処理していましたが、プログラム中でグラフを処理できるようになるのでかなり便利です。
プログラムの実効中に逐一データをグラフ処理できるので、リアルタイムでグラフを表示したりできます。
工夫すればグラフのアニメーション表示もできます。

試しに
1.sin(x)をプロット
2.配列のデータを曲線と点で同じグラフに重ねてプロット
3.三次元プロットのアニメーション表示
するプログラムを作成してみました。

以下のプログラムはLinux環境下で実効できます。
あらかじめgnuplotのインストールが必要です。
Windows環境で動かす時は
工学ナビの中の人の研究と周辺 C言語のプログラムでgnuplotにグラフを描かせる(Windows)
を参考にしてください。

// test1.c sin(x)をプロット
#include <stdio.h>

int main(void)
{
FILE *gp;

gp = popen("gnuplot -persist", "w"); // パイプを開き、gnuplotの立ち上げ

fprintf(gp, "plot sin(x)\n"); // パイプを通してgnuplotにコマンドを送る

fprintf(gp, "exit\n"); // gnuplotの終了
fflush(gp);
pclose(gp); // パイプを閉じる

return 0;
}

Screenshot-Gnuplot-test1.gif


// test2.c 配列のデータを曲線と点でプロット
#include <stdio.h>
#include <math.h>
#define N 100

int main(void) {
FILE *gp;

int i;
double x[N], y1[N], y2[N];

// データ生成
for (i = 0; i < N; ++i) {
x[i] = M_PI/18*i;
y1[i] = sin(x[i]);
y2[i] = cos(x[i]);
}

gp = popen("gnuplot -persist", "w"); // パイプを開き、gnuplotの立ち上げ
fprintf(gp, "set multiplot\n"); // マルチプロットモード
fprintf(gp, "set xrange [%f:%f]\n", x[0], x[N-1]); // 範囲の指定
fprintf(gp, "set yrange [-1.2:1.2]\n");
fprintf(gp, "set xlabel \"x\"\n"); // ラベル表示
fprintf(gp, "set ylabel \"y\"\n");

// 曲線のプロット
fprintf(gp, "plot '-' with lines linetype 1\n");
for (i = 0; i < N; ++i) {
fprintf(gp, "%f\t%f\n", x[i], y1[i]);
}
fprintf(gp, "e\n");

// 点のプロット
fprintf(gp, "plot '-' with points pointtype 1\n");
for (i = 0; i < N; ++i) {
fprintf(gp, "%f\t%f\n", x[i], y2[i]);
}
fprintf(gp, "e\n");

fprintf(gp, "set nomultiplot\n"); // マルチプロットモード終了
fprintf(gp, "exit\n"); // gnuplotの終了
fflush(gp);
pclose( gp); // パイプを閉じる

return 0;
}

Screenshot-Gnuplot-test2.gif


// test3.c 三次元プロットのアニメーション表示
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#define N 100

int main(void) {
FILE *gp;

int i;
int j;
double x, y, z, t;

gp = popen("gnuplot -persist", "w"); // パイプを開き、gnuplotの立ち上げ
fprintf(gp, "set xrange [-1.2:1.2]\n"); // 範囲の指定
fprintf(gp, "set yrange [-1.2:1.2]\n");
fprintf(gp, "set zrange [0:10]\n");
fprintf(gp, "set xlabel \"x\"\n"); // ラベル表示
fprintf(gp, "set ylabel \"y\"\n");
fprintf(gp, "set zlabel \"z\"\n");

// 三次元プロットのアニメーション表示
for (j = 0; j < N; ++j) {
usleep(50000); // usec待機
fprintf(gp, "splot '-' with lines linetype 1\n");
for (i = 0; i < N; ++i) {
t = 0.2*i;
x = cos(t+0.1*j);
y = sin(t+0.1*j);
z = t;
fprintf(gp, "%f\t%f\t%f\n", x, y, z);
}
fprintf(gp, "e\n");
}

fprintf(gp, "exit\n"); // gnuplotの終了
fflush(gp);
pclose(gp); // パイプを閉じる

return 0;
}

Screenshot-Gnuplot-test3.gif


パイプを通す方法だと、gnuplotだけでなく、OctaveやScilabもCプログラム中から利用できます。

ODEの導入メモ

ubuntu9.10でODE-0.11.1を使うためのメモです。

こちらのページを参考にさせて頂きました。
BuildOnUbuntu
自分のプログラムをODEで動かす,LinuxとMac OSX


ODEをインストールする前に、OpenGL関連をインストールしておきます。
sudo apt-get install freeglut3 freeglut3-dbg freeglut3-dev

次に、ここからode-0.11.1.tar.gzを適当な場所にダウンロードし、展開します。
展開したディレクトリで
sudo ./configure --enable-double-precision --with-x
sudo make
sudo make install
これでODEのインストールは完了です。
ode/demoにデモプログラムが入っているので、試しに実行してみましょう。

次に、自分でプログラムを作成するためにdrawstuff関連の設定をします。
インクルードファイル・ライブラリファイルのコピー。
sudo cp -r include/drawstuff /usr/local/include/
sudo cp drawstuff/src/libdrawstuff.la /usr/local/lib/
sudo cp drawstuff/src/.libs/libdrawstuff.a /usr/local/lib/
sudo ldconfig

texturesを参照可能な場所に置く。
sudo mkdir /usr/local/share/drawstuff
sudo cp -r drawstuff/textures /usr/local/share/drawstuff/

以上で、自分でODEを使ったプログラムを作製する準備は完了です。

自分でODEを使ったプログラムを作成する際は
#include <ode/ode.h>
#include <drawstuff/drawstuff.h>

textureを利用するときは/usr/local/share/drawstuff/texturesを指定します。

コンパイル・リンク時のオプションは
コンパイル
-I/usr/local/include -DdDOUBLE

リンク
-L/usr/local/lib -lode -ldrawstuff -lglut

とします。コンパイル時のオプションにに-DdDOUBLEをつけないとエラーが発生するようです。

liboctaveの導入メモ

Ubuntu9.10の環境でliboctave(Octave C++)のインストールと利用のメモです。

liboctaveの利用はこちらを参考に。
octave+c++で数値計算
liboctave で数値計算(リンクとインストール)

octaveの最新版は3.2のようだが、ubuntu9.10での公式パッケージは3.0.5なのでこちらを利用。

インストール
sudo apt-get install octave3.0 octave3.0-headers
sudo apt-get install liblapack-dev
sudo apt-get install fftw-dev readline-common
で大丈夫だと思う。もしかしたら他にも必要かも。

/etc/ld.so.confに/usr/lib/octave-3.0.5を追加する。
sudo ldconfig

liboctaveを利用するプログラムには
#include <octave/config.h>
#include <octave/Matrix.h>
として、コンパイルは
g++ -I/usr/octave-3.0.5 -I../include -c test.cpp
g++ -o test test.o -L/usr/lib/octave-3.0.5 -loctave -lcruft -ldl -lfftw3 -llapack -lblas -L/usr/bin/octave/

必要ならば
sudo apt-get install octave3.0-htmldoc
で/usr/share/docにoctave3.0-htmldocがインストールされます。

新しいPC買いました

ロボット開発用に新しくPCを買いました。

CPU: Athlon Ⅱ X2 240e 2.8GHz
メモリ: DDR3-1333 2GB
マザーボード: BIOSTAR TA785G3

あまり考えずに、3年くらい使えればいいと思い、BTOで安い構成で購入したのですが、Linuxの環境を整備するのにかなり手間りました。

Ubuntu8.04を入れ、ART-Linux化して使う予定だったのですが、その前に、試しにUbuntu9.10を入れてみました。
無理だとは思いましたが、だめもとでART-Linux化を試みるものの、インストールの途中でエラーが発生しインストールできませんでした。

仕方がないので、当初の予定どうり、Ubuntu8.04をインストールすることに。

ところが、Ubuntu9.10では自動でつながったインターネットがUbuntu8.04ではつながらず。
いろいろとネットで調てみると、どうやらマザーボードのオンボードLANのドライバがおかしい模様。
別のPC経由で最新のドライバを入手し、試してみるもすもうまくいかず、あきらめてPCIのLANボードを購入することにしました。
近所の家電量販店でLANボードを購入し、取り付け後、再インストールすると、無事接続。

インターネットには接続できるようになったものの、別のところで問題が発生しました。
画面の解像度がモニタに合っていなかったので、設定を変更してみたが直らず。
内臓グラフィックのドライバがうまく有効にならず、画面がおかしくなる。いろいろと試すもどうにもなりませんでした。

結局、ART-Linuxは古いPCで使い続けることにし、新しいPCにはART-Linux化をあきらめ、Ubuntu9.10をインストールすることにしました。

LANボードが無駄に・・・。

Ubuntu9.10だと、LANの問題も、画面の問題も大丈夫です。
起動も8.04のときよりも早くなっているので、9.10をART-Linux化できたら一番よかったんですけどね・・・。

ヒト型ロボット 34 OpenGLで線形倒立振子の描写

OpenGLで3次元線形倒立振子のシミュレーションの描写をしてみました。

線形倒立振子のプログラムは以前Scilabで書いたものをC言語で書き直したものです。
Scilabでは3次元プロットがうまくいかず、3次元での動作が表示できなかったのですが、これでやっと表示できるようになりました。

IP_test1.gif

OpenGLでのアニメーション表示は簡単にできましたが、表示速度がうまく設定できず、適当です。
表示速度と、線形倒立振子のシミュレーションの時間をあわせたいのですが・・・タイマを使えばいいのかな。
でも、それだと処理内容によっては表示速度が変わってしまうような気もしますが。


最近はずっとプログラミング関係をしているので、ロボット本体は2ヶ月くらい前からまともに動作させていません。
うっすらと埃が・・・
今月中には何とか動作できるようにしたいです。

ヒト型ロボット 33 OpenGLで描写のテスト

OpenGLでロボットの描写のテストをしています。

ODEで物理演算をする前の動作確認用です。
リンクを線で表示するだけの簡易的なものですが、ロボットの動作確認用としてはこれで十分です。

opengl_test.gif

オシロスコープ買いました

オシロスコープを買いました。ポータブル・カラーオシロスコープ PDS5022S(25M 2ch 100Msps)というものです。

数日前に届いたのですが、箱から出しただけで、電源も入れずに放置しています。
作業机の片隅にでも置こうと思っていたのですが、思っていたよりもサイズが大きく、机の上だと邪魔になるので、置き場所に困っています。

ヒト型ロボット 32 開発環境の整備 ODEをインストール・・・

WindowsPCでロボットのシミュレーションに使っていたODE(Open Dynamics Engine)をLinuxPCにもインストールしました。

しました・・・のですが、、デモプログラムのdemo_buggyを実行してみたところ、非常に重い・・・。
昔使っていたノートPCよりも重い気がします。グラフィック関係が弱いのでしょうか・・・。
これではまともに使えません。
やはりPCを買い換えるべき、とは思うのですが、今日、念願のオシロスコープを注文したばっかです。
お金が・・・

ヒト型ロボット 31 liboctave導入

数値計算ライブラリのliboctave(Octave C++)を導入してみました。
liboctaveはC++で使える無料のライブラリです。数値計算ソフトのOctaveが元になっています。

インストールと実行は以下のサイトを参考にさせていただきました。
http://d.hatena.ne.jp/aki-yam/20080720
http://d.hatena.ne.jp/yanma_4/20080424/1209029092

けっこう導入までが面倒だったのですが、使えるようになったので、以前書いた数値解法による逆運動学のプログラムをliboctaveを用いて書き直しています。
数値解法による逆運動学は「ヒューマノイドロボット」(オーム社)に載っていたものです。
以前のプログラムでは、自分で行列演算などの計算をC++で実装していたのですが、逆行列の計算値が不安定だったりと、計算結果の信頼性に不安があったので、liboctaveを用いてみることにしました。

liboctaveは、さすがに数値計算処理ソフトのOctaveとまったく同じようにとはいきませんが、行列演算をA=B*Cと数式的に記述できたりと、けっこう使いやすいです。
ただ、導入までが面倒なのと、liboctaveを利用したプログラムのコンパイルには少々時間がかかります。
ライブラリについての情報もあまりないですが、「liboctave」か「Octave C++」で検索すればいろいろと見つかります。

ヒト型ロボット 30 Geany

Linuxでのプログラム開発に使うエディタを探していたらいいものを見つけました。
軽量IDEのGeanyです。
一応、統合開発環境の形をしていますが、軽量で、なかなかの高機能エデュタとして使えます。
メニュー等の日本語化もされており、日本語の入力も問題なくできました。
Ubuntuだと、アプリケーションの追加と削除で簡単にインストールできます。

少し使っただけですが、かなり良いです。

Top

HOME

tsumehashi

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

11 | 2009/12 | 01
- - 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 - -