へっぽこ元ロボコニスト

ロボコンに燃え尽きた自分が日々の出来事を書くだけのブログです

2018/1/5(Think Pad x220の中古を買った)

あけましておめでとうございます

 

年末は研究室の最後の発表があったので忙しくて研究関係以外何も出なくて,ほとんど書くネタがありませんでした

でも,暇を見つけてやったことがあり

  • STMでMPU9250をI2Cでデータを取得する
  • 自作のSTMボードを作って,Lチカをする
  • 中古のThink Pad x220を買って,ロボコン用にカスタマイズ
  • ROSでシュミレーション環境を作る

ぐらいをやっていました

STM,ROS関係は後日書きますが,備忘録としてThink Pad x220を書きます

 

 購入した経緯

入学した当時に購入したノートパソコンは研究用にUbuntuを乗せたので,持ち運べるWindows機が無くなって困っていました

なので,新しいノートパソコンがいるなと思ってしました

ですが,何のノートパソコンを買おうかなと思っていた時に,TwitterのTLでThink Padがいいよっていうのを見かけたのでThink Padを買うことにしました

そして,値段も2万円以内を目標に探しているとThink Pad x220の中古をソフマップで1万6500円で見つけて買いました

 

届いたThink Pad

f:id:masanari7430:20180105231951j:plain

f:id:masanari7430:20180105232003j:plain

f:id:masanari7430:20180105232014j:plain

届いたThink Pad x220はきれいでキーボードのAとNが擦り切れてるぐらいでした

SSDは128GBで換装されており,メモリは2GB*2の4GBでした

バッテリーは6cellで100%まで充電したところ6時間持つので,ほぼ新品同様のバッテリーでした

 

なので,中古でバッテリーぐらいは新品にしないといけないなと思っていたのですが何も変えなくていいほどの良品が来ました

 

Windows10のインストール

windows10のインストールの前にリカバリーディスクの作成を行いました

搭載されているOSがwindows7 Professionalだったので,せっかくだからwindow7に戻せるようにリカバリーディスクの作成をしました

そしたら,DVD-RWの4.7GBが合計で3枚もいりました

 

そのあと,windows10のインストールメディアをUSBで作ってBootしてwindow10を入れました

30分ぐらいで入ったので拍子抜けしました

 

Think Padの目玉である,トラックパッドとホットキーと指紋認証はWindowUpdataをかけると自動で使えるようになりました

 

インストールしたもの

Git

Kicad

TrueSTUDIO

STMStudio

を入れました

Gitは家と研究室のデータのやり取りを容易にするため

Kicadは基本的にはデスクトップPCで回路は作りますが,はんだ付けの時に

TrueSTUDIOはST社がAtollicを買収したので将来的に見越してこれが使われるだろうと思い導入

STMStudioは,STMボードのデバックのためにインストールしました

 

しかし,残りのSSD容量が47GB/96.5GBと半分になってしましました・・・

 

まとめ

初めてThink Padを買いましたが,この値段でこのスペックは満足です

頑張ってSTMの開発します

 

 

 

2017/12/18(PCLライブラリでICPアルゴリズムをやってみた)

PCLライブラリを使ってみた

研究で,ICPアルゴリズムを使う必要があって,学部4年の自分の力では書けないことはわかっていたのでPCLライブラリを使ってやってみようと思いました

今回やったのは,2つのURGのデータをICPアルゴリズムを使ってどれだけ位置が違うかを取得します

コードは以下のようになります

#include <ros/ros.h>
#include <laser_geometry/laser_geometry.h>
#include <iostream>

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/registration/icp.h>
#include <pcl_conversions/pcl_conversions.h>
#include <pcl_ros/point_cloud.h>
#include <pcl/point_types.h>


class icp_transform{
  public:
    icp_transform();

  private:
    //pointcloud2を取得
    void cb_catch_cloud2_first(const sensor_msgs::PointCloud2::ConstPtr& cloud2);
    void cb_catch_cloud2_second(const sensor_msgs::PointCloud2::ConstPtr& cloud2);

    void transform(const ros::TimerEvent&);

    //ノードハンドラ作成
    ros::NodeHandle nh;

    ros::Publisher pub_pcl_first;

    ros::Subscriber sub_cloud2_first;
    ros::Subscriber sub_cloud2_second;

    //cloud2のデータ群
    sensor_msgs::PointCloud2 cloud2_first;
    sensor_msgs::PointCloud2 cloud2_second;

    //pcl_point_cloud
    pcl::PointCloud<pcl::PointXYZ> pcl_first;
    pcl::PointCloud<pcl::PointXYZ> pcl_second;
    //pcl::PointCloud<pcl::PointXYZ> pcl_second


    //時間の関数作成
    ros::Timer timer;

};
//コンストラクタ初期化
icp_transform::icp_transform(){
  pub_pcl_first = nh.advertise<pcl::PointCloud<pcl::PointXYZ> >("/pcl_data",10);

  sub_cloud2_first=nh.subscribe<sensor_msgs::PointCloud2> ("/cloud2_control_point_first", 100, &icp_transform::cb_catch_cloud2_first, this);
  sub_cloud2_second=nh.subscribe<sensor_msgs::PointCloud2> ("/cloud2_control_point_second", 100, &icp_transform::cb_catch_cloud2_second, this);

  timer = nh.createTimer(ros::Duration(1.0), &icp_transform::transform,this);
}

//pointcloud取得関数
void icp_transform::cb_catch_cloud2_first(const sensor_msgs::PointCloud2::ConstPtr& cloud2){
  cloud2_first=*cloud2;
  pcl::fromROSMsg(cloud2_first,pcl_first);

  //ROS_INFO("first");
  //pub_pcl_first.publish(pcl_first);
}

void icp_transform::cb_catch_cloud2_second(const sensor_msgs::PointCloud2::ConstPtr& cloud2){
  cloud2_second=*cloud2;
  pcl::fromROSMsg(cloud2_second,pcl_second);
}

//表示関数
void print4x4Matrix (const Eigen::Matrix4d & matrix)
{
  printf ("Rotation matrix :\n");
  printf ("    | %6.3f %6.3f %6.3f | \n", matrix (0, 0), matrix (0, 1), matrix (0, 2));
  printf ("R = | %6.3f %6.3f %6.3f | \n", matrix (1, 0), matrix (1, 1), matrix (1, 2));
  printf ("    | %6.3f %6.3f %6.3f | \n", matrix (2, 0), matrix (2, 1), matrix (2, 2));
  printf ("Translation vector :\n");
  printf ("t = < %6.3f, %6.3f, %6.3f >\n\n", matrix (0, 3), matrix (1, 3), matrix (2, 3));
}


void icp_transform::transform(const ros::TimerEvent&){
  //cloud_firstとcloud_secondをICPアルゴズムにより変換matrixを求める。
  pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;

  //pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud_in (&pcl_first);

  //boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> > cloud_in (&pcl_first);
  //boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> > cloud_out (&pcl_second);

  //icp.setInputSource(cloud_in);
  //icp.setInputTarget(cloud_out);
  icp.setInputSource(pcl_first.makeShared());
  icp.setInputTarget(pcl_second.makeShared());

  pcl::PointCloud<pcl::PointXYZ> Final;
  icp.align(Final);

  //変換matrixを表示する
  Eigen::Matrix4d transformation_matrix = Eigen::Matrix4d::Identity ();
  transformation_matrix = icp.getFinalTransformation ().cast<double>();
  print4x4Matrix (transformation_matrix);
}


//
int main(int argc, char** argv)
{
    ros::init(argc, argv, "icp_transform");

    icp_transform icp_transform;

    ros::spin();

    return 0;
}

参考にしたのは,
qiita.com

ros-robot.blogspot.jp

http://derivecv.tumblr.com/post/12364144145
derivecv.tumblr.com

www.slideshare.net


大体のところは,上の参考文献を当たればわかったのですが,唯一分かりにくくて困ったのは
pcl_first.makeShared()
この部分です

自分は,
URGのScanデータ→Pointcloud→Pointcloud2→2つのPointcloud2を同じ座標軸に変換→pcl::PointCloud→pcl::PointCloud::ConstPt
という長い手順でPCLライブラリに適用できるような形にしています
本来なら,PointCloudの形にして自分でICPアルゴリズムが書けるのがベターなのはわかっていますができないので,このような手順をとっています
問題だったのは,
pcl::PointCloud→pcl::PointCloud::ConstPt
の変換です

ICPアルゴリズムに限らず,PCLライブラリを使うにはスマートポインタの形にすることが大半だそうです
で,この変換に苦労しました
コメントアウトが多いところがあるのですが,その部分がスマートポインタの形にするのに苦労したところです

どうすればいいかというと
pcl_first.makeShared()
このように,pcl::PointCloudのクラス?の関数を実行するだけで,スマートポインタの形に出来ました

やっぱり,C++のリファレンスとかクラスの概念が全く分かっていないのでめっちゃ詰まりましたが,できたので良かったです

2017/12/10(休日)

明日からまた研究かぁ・・・・

 

今日は,台所の掃除してからカフェで本を読んでいました

onsaya.com

奉還町の店舗に行きました

この店舗,2階にいい席があってふかふかのソファに座れる上に店員さんも注文の品をもって来る以外に来ないのでとても落ち着けます

ですが,今日はランチの時間に行ってしまって,1階のカウンターで飲んでいました

 

人気店なので仕方なかったのですが少し落ち着けない状態で本を読んでいました

 

読んだのは昨日買ったばかりの

「僕はロボットごしの君に恋をする」を読みました

感想は,なんかよくある感じのオチだった,といえば少し偉そうですがそんな感じです

 

明日からは冬シンポのスライド作りが待っています

2017/12/9(原稿終わり)

冬シンポの原稿が終わった

 

やっと冬シンポの原稿が終わりました

実験して,ROSからデータ抜き出してちゃんとそれっぽくなりました

実験結果は思ってた通りの結果が出たのでまあよかったのかなと思います

 

なので,今日は久しぶりの休みでした

朝起きてからトイレ掃除と風呂掃除をして,学食で昼飯食べて,部室でクロスバイク洗って,イオンで本買った後に,映画見て帰った来ました

全く研究室に行かない日でした

めっちゃ楽しかった

 

イオンで本を買ったのですが,

「僕はロボットごしの君に恋をする」を買いました

この前,学校の生協の還元祭のガラガラで図書カード1000円が当たったので何か買いたいなぁと思っていたので衝動買いしました

 

映画は,

GODZILLA 怪獣惑星」

を見に行きました

友達から誕プレで映画観賞券を2枚もらっていて今まで使っていなかったので,思い出していきました

(2枚あるってことは彼女作って行けということなんでしょうね)

あと,一枚余ってるけど次は何の映画行こうかなぁ

 

明日はカフェで買った本を読もう

2017/11/22(書くのを忘れてた・・・・)

最近は,特にROSの新機能を使うことなく淡々と研究していたせいで日記を書くのを忘れていました

後,プライベートが全く潤わないのでそれも拍車をかけて日記を書くのを忘れていました

なので,まとめて最近あったことを書こうかな

 

ボルダリング

研究室の同期がボルダリングでアルバイトをしていて,誘われていきました

メンツは,同期が3人と先輩2人で行きました

場所は駅の近くのビルで,こんな所に本当にあるのかなって思う感じでした

ボルダリングはレベルで登る石が分けられていて,一番低いレベルだと大きい石で足を置く石も無理なところにないので楽しいのですが,レベルが上がっていくとそんな体勢から始まるの?って思うところから始まったりします

1時間半ボルダリングしたのですが,最後の方は10分に一回しかトライ出来ないぐらい握力もうでの力も無かったです

自分は,レベル2までは登れたのですがレベル3が一回しか登れませんでした

ちなみにレベルは10まであります・・・・・

次の日は案の定,筋肉痛でした

 

学会

岡山大学で,研究室が主催した小さな学会が行われました

自分はアルバイトで少し関わっただけですが,同期の一人が発表しました

それを,アルバイトのタイムキーパの役割で傍から見ていたのですが,めっちゃ悔しかったです

なぜ自分の研究はこんなにうまく行かないのかと・・・・・

ただただ悔しかったです

 

基板

なぜか研究をするテンションが保てなくなってきて,STM基板と絶縁GDを使ったMDを作り始めました

後輩のやつや今まで自分が今まで学んできたことをベースに来年の津山ロボコンでは全部を一新した回路と制御をやるつもりです

今は基板の設計や製作までやっていますが,春までには基本的な開発はすべて終わらせてGearVRやUnity移れたらなぁと思っています

 

残りは時間はほとんど研究でした

進捗はまあまあでとりあえず安定して動くようになったのと,先輩の研究を参考にしながら進んでいます

 

冬の進歩まで時間がもうないので明日も研究室行ってきます

 

PS

冬も近くなってきて今年もボッチクリスマスで,もうそろそろ豆腐メンタルが崩れてきそうなので誰かもらってください

 

 

 

2017/11/8(研究の進捗ゼロです)

最近,一度UbuntuMateが気にいらない動作をしたのでリセットをしました

具体的には,roscoreを立ち上げてもpython2.7のエラーが出て動かなくなりました

なので,今週はほとんど進捗はありませんが明日は何とか乗り切れたらいいなぁ

 

あと,最近はストレスがたまりすぎて基板を作っていました

STMの勉強用基板と

f:id:masanari7430:20171108221835p:plain

卒業お祝い基板です

f:id:masanari7430:20171108221837p:plain

卒業お祝い基板は部のマスコットであるそうじまるを描くためにKicadを使って作りました

意外とKicad使いやすいし,自分でライブラリをほとんど作らないので便利です

 

こんなことしてないと研究で押しつぶされそうなので,切実に癒しが欲しーー

2017/11/2(うまくいかないなぁ・・・)

研究用のロボットを動かしていますが,うまくいきません・・・

遠隔操作してるので,遅れがあったり,動かない時があったりしてるので思った通りの動きをしてくれないのです

そのうえ,機体の動作に加えてURGのデータもやり取りしてるのでそのせいで遅いのかなぁ・・・・・

 

今週の3連休は,学祭だけどロボットを動かしに行きます

2017/10/25(rviz楽しい)

rviz楽しい

 

ROSで最近rvizで描画するのにはまっています

f:id:masanari7430:20171025222907p:plain

こんな感じに使ってるロボットの制御点やセンサーの位置を指定してビジュアル的に見れるのはとてもクールだと思います

ただ,こんな感じに制御点指定するのは結構めんどくさいので他の研究室の人たちにはあまり好まれません・・・・・

 

あと,今コレに少し問題があって何故かセンサデータが世界座標から見ても移動してしまうことが起こっています

明日には解決するかなぁ・・・・・・

 

 

2017/10/24(param化できない)

風邪は引かずに済んで良かった

 

今日は,今まで作ったノードの整理をしていました

複数台のラズパイからデータが来るので,それぞれにネームスペースを与えてデータを分割して実行できるようなlaunchファイルを作っていました

でも,少しまずいことになっていて,node間でpublishしたりsubscribeするデータはremapで簡単に変更できます

しかし,他のパラメータを変更するためのparam化を忘れていて少々面倒になってきました

主に参照する座標系をparam化しないと行けなくなってきました

しかも,param化すると同時にそのparamデータが動的に読み込まれるようなプログラムを作らないといけません

 

かなりめんどくさそう・・・・・

2017/10/23(風邪ひいたかな?)

風邪ひいたかもしれないので寝ます

2017/10/22(nodelet作成)

やって効果があるかわからない

 

ROSには,同じマシンの中のNodeならnodeletという物を使ってデータのやり取りを高速化できる仕組みがあります

研究で少し重めのデータがあるのでそこをnodeletを用いて高速化できるように書きました

cryborg.hatenablog.com

公式のHPよりもわかりやすくて,実装が一日で出来ました

 

明日は,台風も過ぎ去って大学に行けるのでこれを使って実験しないと

2017/10/21(残念な休日)

ほとんど寝ていた休日

 

今日は朝から雨で買い物と昼ごはん以外には外に出ませんでした

その代わりに家で研究の進捗出せるかなと思っていたのですが,ほとんど寝ていました

もったいない休日でした

 

ですが,少し進んでラズパイ用のシェルスクリプトを書いていました

時刻同期やURGの許可はROS上からは操作できないのでシェルスクリプトを書いて実行すれば全部やってくれるものを書きました

結構簡単でこれで動かすときに楽になるのではないかと思います

 

後,ラズパイ用のlaunchファイルを書いていました

毎回,パラメータ設定とかのコマンドラインを書くのがめんどくさいのに気づいたので,ようやくlaunchファイルを作りました

 

明日は,nodelet関係のプログラムを作りたいなぁ

2017/10/20(オフライン時刻同期改)

もう少し改良が必要だった

 

昨日のオフライン同期をもう一台のラズパイでやってみたのですが,数十秒遅れる上につながらない時もありました

 

なので,公式のページを見ながら設定を見直してみました

そしたら,許容する遅れの範囲を設定していたのでそれをラズパイで設定してみました

 

server [PCのIPアドレス] iburst minpoll 0 maxpoll 5 maxdelay 0.5

 

maxdelayを設定することで誤差の許容範囲を示します

またminpollとmaxpollの値を公式のページの値にしてみました

こうすると,なぜかPCの時刻にすぐ同期出来て,しかも遅れもなくなりました

 

しかし,ROSで運用する際にはもっと精密な同期が必要かもしれず,もし,そうならmaxdelayを小さくすればいいのではないかな

 

あと,やっといた方がいいと思うのは

  • nodelet
  • 設定が多くなってきたので,シェルスクリプトを書いて簡略化(時刻同期,URGの許可)
  • sshの名前登録

ぐらいかな

 

でも,これで準備ができたので明日からは動かします

 今日は朝一で歯医者に行っていたので,これしかできませんでした

 

今日,久しぶりにまた部室に行ってきました

そしたら,新しいMDが出来上がっていました

新しいPICが乗っていて,エンコーダの処理もできてSPI通信で動くそうです

それとPS3コントローラの受信機も自作するようになっていました

なんだか,次々と新しいものを作っていっている後輩たちがめっちゃうらやましくなりました

自分も混ざりって彼らと開発がしたかったです

もし,自分が今開発するなら

  • MD with STM
  • BLDC with STM
  • メイン回路 with STM

のSTMフルコースを作りたいなぁ

あと,MDにDC/DCコンバータ乗せて余計な線を排除したい

ROHMにいいDC/DCコンバータあったから,それを今年の部品提供に混ぜてもらおうかなぁ

 

 

2017/10/19(オフライン時刻同期できた)

時刻同期が出来た

 

研究では,複数台のラズパイとノートPCを使ってROSを実行するのですが,ROSではtfを使う際時間同期をしないといけません

なので,chronyやntpdateを使って外部ネットワークにあるサーバに時刻同期します

ですが,学内のネットワークではSSH接続ができなくてロボットに乗せたラズパイに遠隔接続できないし,携帯のテザリングでは携帯を忘れたらロボットを動かせません

 

そして,先生に相談したら無線LANだけを貸してくれました

つまり,外部ネットワークに繋げずにROSネットワークを作らない行けなくなりました

なので,夏前はテザリングで動かして夏シンポが終わってから,ラズパイがノートPCへ時刻同期を行うように設定できるかなとトライしていました

で,今日やっと成功しました

 

主に,参考にしたページはこれです

ja/ROS/NetworkSetup - ROS Wiki

qiita.com

qiita.com

wings2fly.jp

www.server-world.info

l-w-i.net

tech-mmmm.blogspot.jp

www.orangetakam.com

 

もちろん,公式を見ればいいのですが公式で自分が確認できたのは時刻合わせをしないといけないということでした

なので,それぞれで行ったことをまとめます

いじる場所は,ラズパイ,ノートPCともに

/etc/chrony/chrony.conf

です

vimでもemacでどちらでもいいです

ノートPC側

ノートPCには内臓クロックが搭載されているので特に外部に対して時刻同期しなくてもいいものと考えます

なので,ノートPCがラズパイに対して時刻同期を許可すればいいだけです

 

なので

 

allow [ラズパイのIPアドレス]

 

を追加します

こうすることで,ラズパイが時刻同期しようとするのを許可します

IPアドレスは,無線LANの設定から固定のIPアドレスを与えます

 

次に加えるのが

 

local stratum 10

 

です

これは,ノートPCが外部のサーバに対して時刻同期できなくても,ノートPCの時刻は信頼できるものとして,ラズパイが参考できるというものです

普段,時刻同期はネットにつなげば行われるのですが,もし同期できなければ信頼度が16となり,参考にできないようになります

(信頼度は1が最高で15が最低です)

今回の設定では,同期できなければ10の信頼度でもいいなら同期してもいいよというものです

 

ラズパイ側

まず,ラズパイ側ではどこのIPアドレスに対して時刻同期を行うか設定します

 

server [PCのIPアドレス] iburst minpoll5 maxpoll 6

 

これでどこのIPアドレスの時刻に同期するか指定をします

IPアドレスの後ろはオプションですが,参考文献を見ればわかると思います

 

次に行うのは,信頼度に関係なく時刻同期を行う設定をします

 

stratumweight 0

 

これを書けば,信頼度に関係なく時刻同期を行います

 

読み込み,実行

これらは設定した後

sudo /etc/init.d/chrony restart

で設定を読み込みます

 

どちらも,設定して読み込んだ後

ラズパイ側で

sudo chronyc -a makestep

をするとサーバの時刻に強制的に同期します

ですが,何回かしないと時刻同期できません・・・・・

自分は5分ぐらいすると同期出来ました

なぜ,時間がかかるかはわかりません

 

便利なコマンド

date

コマンドライン上に時刻を表示

 

chronyc sources

今同期しようとしているサーバ一覧が表示される

 

chronyc tracking

同期先に関するデータ?が表示される

 

その他

思い出しながら書いてるので,これだけでできる保証はないです

それに余計なコマンドも書いてるかもしれないですが,とりあえず自分はこれで同期が出来ました

とゆうか,忘れたとき用に書いてるだけですのであしからず

 

今,デュアルディスプレイと無線キーボードとマウスで作業していますが,快適で買ってよかったです

 

 

 

2017/10/18(ディスプレイと無線マウス・キーボード購入)

買ってよかった

 

ディスプレイと無線キーボード・マウスを購入しました

ディスプレイは,デスクトップPCのために購入しました

時々,家でラズパイをいじるのですがその時ディスプレイが一枚しかないので何か調べようとしてもUbuntuのノートPCしかなくなってしまします

でも,このノートPCそろそろ研究用にしようかなと思ってるので,もう一枚ディスプレイが必要でした

なので,Amazonで中古のディスプレイがランダムで3700円で購入できるものを買いました

そして,来たのがこれです

f:id:masanari7430:20171019000021j:plain

中古にしてはきれいですし,ちゃんと動くので問題はありません

f:id:masanari7430:20171019000024j:plain

そして,今の家の開発環境がこんな感じになって,研究室の環境よりもよくなりました

 

無線キーボード・マウスですが,デスクトップPCから線が垂れるのと,ノートPC用に有線マウスを確保したかったので,ディスプレイと一緒に買いました

f:id:masanari7430:20171019000026j:plain

やっぱり,線がなくなってだいぶスマートになりました

今のところ無線の遅延もほとんど感じられませんし,1500円でまとめて買えたので良かったです

 

後,UbuntuMateですがCUIGUIの切り替え機能が便利でCUIにするとURGのデータがサクサク転送できた気がします

なので,UbuntuMateを研究に正式採用です

 

メモ

ノード一つ消すとビルドが通る

SSH接続が研究室のネットワークだとつながらないから,ファームウェアのアップデートもしくは一度リセットはあり

URGとかロボットにつなぐときには,許可忘れない

永続的に許可する方法があるなら試す

毎度毎度ノードを立ち上げるのに長い分は面倒なので,シェル?でできない?

 

お土産渡しに行ったけど,めっちゃ失敗した

失敗したから次は頑張る

でも,気持ちが分らんから不安でしかない

 時間がないならないと言ってほしいし,嫌なら嫌なら嫌と言ってほしいなぁ