2015年5月3日日曜日

Pythonスタートブック,一人輪講


「Pythonスタートブック」を入手したので、ちょこちょこと勉強を始めました。

現在、8章ですが、どこかで見た方...というか見た亀が出てきました。

動き回る亀...この形...どこかで

ros_wikiでも、よくお目にかかるカメくんではないですか!!

で、カメくんの召喚方法ですが...

>>>  import turtle
>>>  kame = turtle.Turtle()

として、turtleモジュールのインポート、Turtle型のインスタンスにkameという名前を付けています。
この辺りは、Java等と扱いは一緒ですね。
これを実行すると、カメくんの前段階として、新しいウインドウが開きます。

この段階では、タダの矢印なので形をカメにします。

>>> kame.shape('turtle')

...標準関数にカメの形が入っているプログラム言語っていったい....

小さくて見づらいので拡大して準備終了。

>>> kame.shapesize(2,2,3)

縦×2,横×2,輪郭太さ3の指定です。

例題では、ランダムを使うので、randomモジュールをインポートします。

>>> import random

例題は、中心からの距離200以内でカメくんが動き続けるようにします。

>>> while True:
... [TAB]kame.left(random.randint(1,360))
... [TAB]kame.forward(15)
... [TAB]if kame.distance(0,0) > 200:
... [TAB][TAB]kame.undo()
...

[TAB]のところはTABキーを押してください。

簡単に使われているメソッドを説明します。

 left(angle):カメくんをangle度だけ左回転する。単位はdegreeです。
 forward(count):カメくんをcountだけ前進します。
 distance(0,0):カメくんが原点からどれぐらい離れたかを返します。
 undo():ひとつ前の作業を取り消します。

という事を念頭に置いて、プログラムを見直すと

「カメさん、適当に回って15歩だけ進んでよ。でも原点から200を超えたらやり直しね」

という様に読めます。

それにしても、何故カメだったのか.....
 





2015年4月17日金曜日

第5回.ROS勉強会、復習2


いろいろと挑戦しているけれど、Pythonで/amcl_pose座標がとれていないみたいです。

まぁ、Python自体初めて触るので仕方がないといえば仕方がないんですけどね。

ちょっと、嫌になりかけたので強引な手段で課題を消化してしまう事にしました。



残念ながら、私の環境ではRVIZを動かしていると「RecordMyDesktop」でもフレーム落ちするので、RVIZは停止して動画を撮りました。

お題は、6つの部屋を1部屋ごと訪ねていって、最終的に元に戻るですから
一見うまく動いている様に見えます。

しかし、実際は部屋の移動が終わる時間を見計らって、ゴール地点を変えているだけですから、課題ができたとは言えませんね。

ソースはこちら

#!/usr/bin/env python
# vim: fileencoding=utf-8
# rospy のインポート
import rospy
# 数学ライブラリ
import math
# タイマーのインポート
import time
# 今回主に使うROSメッセージ型をインポート
from geometry_msgs.msg import Quaternion, PoseStamped, PoseWithCovarianceStamped
# 幾何学変換のための関数
from tf.transformations import quaternion_from_euler

# ノードの初期化
rospy.init_node('exercise')

# ゴール配信者オブジェクトを生成
goal_pub = rospy.Publisher('/move_base_simple/goal', # トピック名
                           PoseStamped,              # 型
                           queue_size=1,             # 送信キューのサイズ
                           latch=True)               # データを次の更新まで保持する

# 現在位置を読み込むオブジェクトを生成
pose_sub = rospy.Subscriber('/amcl_pose/pose/pose/postion/x',   # トピック名
                 PoseWithCovarianceStamped)          # 型

# 次のゴールのメッセージを生成して初期化
print "Step1"

goal = PoseStamped()
goal.header.frame_id = 'world'        # 世界座標系で指定する
goal.header.stamp = rospy.Time.now()  # タイムスタンプは今の時間
goal.pose.position.x = 9.5
goal.pose.position.y = 3.5
goal.pose.position.z = 0.0
q = quaternion_from_euler(0, 0, math.radians(90))
goal.pose.orientation = Quaternion(*q)
goal_pub.publish(goal)  # 実際にメッセージを配信

amcl_pose = PoseWithCovarianceStamped()
#amcl_pose.pose.pose.position.x,yを取れないよう〜

time.sleep(30)   #タイマーで誤魔化しています

print "Step2"

goal = PoseStamped()
goal.header.frame_id = 'world'        # 世界座標系で指定する
goal.header.stamp = rospy.Time.now()  # タイムスタンプは今の時間
goal.pose.position.x = 16.0
goal.pose.position.y = 3.5
goal.pose.position.z = 0.0
q = quaternion_from_euler(0, 0, math.radians(90))
goal.pose.orientation = Quaternion(*q)
goal_pub.publish(goal)  # 実際にメッセージを配信

time.sleep(30)

print "Step3"
goal = PoseStamped()
goal.header.frame_id = 'world'        # 世界座標系で指定する
goal.header.stamp = rospy.Time.now()  # タイムスタンプは今の時間
goal.pose.position.x = 3.5
goal.pose.position.y = 11.5
goal.pose.position.z = 0.0
q = quaternion_from_euler(0, 0, math.radians(90))
goal.pose.orientation = Quaternion(*q)
goal_pub.publish(goal)  # 実際にメッセージを配信
time.sleep(30)

print "Step4"

goal = PoseStamped()
goal.header.frame_id = 'world'        # 世界座標系で指定する
goal.header.stamp = rospy.Time.now()  # タイムスタンプは今の時間
goal.pose.position.x = 9.5
goal.pose.position.y = 11.5
goal.pose.position.z = 0.0
q = quaternion_from_euler(0, 0, math.radians(90))
goal.pose.orientation = Quaternion(*q)
goal_pub.publish(goal)  # 実際にメッセージを配信
time.sleep(30)

print "Step5"

goal = PoseStamped()
goal.header.frame_id = 'world'        # 世界座標系で指定する
goal.header.stamp = rospy.Time.now()  # タイムスタンプは今の時間
goal.pose.position.x = 16.0
goal.pose.position.y = 11.5
goal.pose.position.z = 0.0
q = quaternion_from_euler(0, 0, math.radians(90))
goal.pose.orientation = Quaternion(*q)
goal_pub.publish(goal)  # 実際にメッセージを配信
time.sleep(30)

print "Step6"

goal = PoseStamped()
goal.header.frame_id = 'world'        # 世界座標系で指定する
goal.header.stamp = rospy.Time.now()  # タイムスタンプは今の時間
goal.pose.position.x = 3.5
goal.pose.position.y = 3.5
goal.pose.position.z = 0.0
q = quaternion_from_euler(0, 0, math.radians(90))
goal.pose.orientation = Quaternion(*q)
goal_pub.publish(goal)  # 実際にメッセージを配信

# Ctrl−Cで中断するまでポーリング
rate = rospy.Rate(10)
while not rospy.is_shutdown():
    rate.sleep()


pythonの参考書を密林で見つけてぽちったので、参考書待ちです。

2015年4月13日月曜日

第5回.ROS勉強会、復習


「/amcl_poseから座標とるのってどうやるんだっけ?」で終わってしまったROS勉強会のやり残しを少しずつ片付けます。

先ず、座標のとり方。

シミュレーション中にrostopicを使って調べたところ

$rostopic echo /amcl_pose/pose/pose/position/x

で座標が出ることが判明。

あれ?

これは、やったはずなのに...

ん?....よく見てみたら、/pose/pose/になってるぞ!
 

2015年4月12日日曜日

第5回.ROS勉強会に行ってきました


中部大学の名古屋キャンバスで開催された「第5回.ROS勉強会」に行ってきました。

13:00スタートで、会場に12:40に入ったのですが、その時間ですでに、前方の席がほぼ埋まっている状態でした。

資料は無線LANからということなので、LANの使用登録をし、ネットに繋げようと思ったとき、

「Proxy設定が邪魔じゃね?」

と気づきました。

案の定、apt-getも通りません。

設定を壊さずに何とかしたかったのですが、時間と技術がないので、泣く泣くProxyの設定を削除しました。

帰ったら、戻さないとなぁ

勉強会自体は、各自持ち込んだパソコン上で、シミュレーション環境を構築して、シミュレーション上でTurtleBotを動かすというもので、判らないところは、その場で質問しながら進めるという輪講形式(にしては参加人数が多すぎですが..)。

トラブルが無ければ、学習時間が十分とれるはずでした

がっ

推奨がUbuntu14.04+ros Indigo以外、私の持ち込んだUbuntu12.04+ros Hydro環境では、ソースコンパイルが必要になり、準備に結構時間を取られてしまいました。

ちょっと前までは、Hydroも推奨環境になっていた気がしたんだけどなぁ
これを機に indigoに切り替えようかな。

何とか、ソースからコンパイルしてシミュレーションができ、
「/amcl_poseから座標とるのってどうやるんだっけ?」と悩み始めたころ時間切れしてしまいました。

模範解答が欲しい所です。

シミュレータ上でTurtleBotをコントロールします


その後は、興味深い発表がいろいろあって面白かったのですが、何しろ時間がなく十分な質問もできない状況でした。

このボリウムだと午前中からやった方が良いんじゃないかとも思ったのですが、無料講座なので会場使用料とかも大変なのかもしれません。

社会人は有料(学生無料)とかにすると、その辺りは解決するのではないかと思うのですが...

でも、お金が絡むと、それはそれでめんどくさいのかな?



2015年3月31日火曜日

Step2.Ubuntuをインストールする


Ubuntuの公式に行ってダウンロードしてください。以上、終わり。

で済めばよいのですが、そう言うわけにもいきません。
rosにもバージョンが存在するので、それに合ったUbuntuを入れておかないと酷い目にあいます。

私の環境は、Ubuntu12.04をインストールして、ros Hydroを動かしています。
Ubuntu14.04+ros Indigo という組み合わせも推奨されているみたいです。
インストールするだけならば、他にもいろいろありますが、このどっちかにしておくのが無難だと思います。

インストールするUbuntuのバージョンが決まったらイメージファイルをダウンロードして、起動ディスクを作ります(USBメモリーで作るのも良いかも...)。

Ubuntuを母艦にしている方は、「usb-creator-gtk」で一発ですね。


2015年3月28日土曜日

Step1.Ubuntu環境を準備する


rosを動かすためには、先ずUbuntuの環境を用意する必要があります。
費用をあまりかけずに用意する方法として、3つぐらいあります。

1.windowsパソコンにVirtualBoxをインストール使う

一番リスクの低い方法はVirtualBoxをつかう方法でしょう。

windows8.1環境上でUbuntu12.04を動作させて、Rosのhydroをインストール出来ています。
UbuntuからUSBへのアクセスもできるらしいですが、僕はまだ成功していません。

というか、挑戦中に環境を壊してしまったので、それ以来やっていません。

2.windowsパソコンをデュアルブートにしてUbuntuを動かす

一番現実的なのは、windowsとubuntuのデュアルブートマシンを作ることでしょう。
最近はノートパソコンでも「これ使い切れるの?」というぐらいメモリー余ってますしね。

僕も現状これでやっています。

但し、一歩間違うとwindows環境が吹っ飛びますのでご注意を...

3.小型PC,中古PCで専用環境を立ち上げる

ちょっと予算が取れる方は、これがお勧めです。
特に小型PCは結構お安くなっているので、ubuntu専用マシンとしてしまうのもお勧めです。

一様、ubuntuをインストール出来た奴らを乗せておきます。

テスト済み1.ECS 超小型 Bay Trail-M搭載デスクトップ 2.1A出力のモバイルバッテリでも駆動可能 LIVA-C0-2G-64G-W

メモリー、SSDなどオールインクルッシブで、OS無しなら2万以下(Amazon調べ)とお勧めの一台なんだけど...

2点ほど困ったことがあります。

困ったこと1.無線LANをUbuntuで使うのが少し面倒

http://morokyuu.way-nifty.com/blog/2014/10/livawifiubuntu1.html

とかを参考にして、Ubuntu_1.0M.zipファイルのWLANの中身どおりにやると一様できるんだけれども....

Ubuntu_1.0M.zipをどっからダウンロードしてきたか忘れちゃった...

思い出したら、書き加えます。

追記.

2015年03月31日現在、下のアドレスから入手できます。

http://download.ecs.com.tw/dlfileecs/driver/mb/wlan/Ubuntu_1.0M.zip



困ったこと2.内臓BlueToothが動かない

これは、どうしようもないみたいです。諦めてBluetooth_USBを購入しましょう。

テスト済み2.Intel NUC(Next Unit of Computing) Kit Intel Core i5 4250U搭載(D54250WYK)キット BOXD54250WYKH

ちょっと重い処理をしようと思って、買ってみました。
別途、メモリー、SSD、無線LANなどの購入が必要...出費が....

しかし、CPU高性能+SSDなのでストレスなく、動きますね。
とりあえず、不満なところは無いですね...消費電力を除けば.....

テスト中.ZOTAC ZBOX PI321 pico Win8.1 with Bing Intel Atom Z3735F搭載ポケットサイズのコンパクトPC(64GBモデル) PC936 PI321

うーん。ubuntu化がうまく行かないです。

いろいろ参考ページを漁って苦戦中です。

初心者は行かない方が良いのか?いや..でもこの小ささは魅力なんだけれど....

このページについて


ROSというのは、Ubtuntu上で動くロボット制御用ライブラリーの様なもの?
歯切れが悪いのは、理解が十分でない証拠ですね。
まぁ、初心者ということを隠す気はないので、別にいいですけどね。

正確に定義を知りたい人は、ROS Wikiをどうぞ。

ここは、私こと「錬金術師まさ」が新たに挑戦中のROSについて書き留めておくページなので
間違ったことを書いていたらごめんなさい、できれば指摘してというスタンスでやっていきます。

それでは、よろしくお願いします。