2014年1月31日金曜日

Sociology



僕のもともとの専門は、地域計画。

その背景があるかもしれないけど、

大きな組織や、大規模なプロセスを対象にするシステムを構築するような仕事には、

社会科学的な視点が重要だと思っている。

僕の経験では、コンピュータ科学は手段の積み木の世界、

それの手段をうまく使うためには、対象となる組織やプロセスをきちんと

描かないとならない。それには、社会科学的な視点が重要になる。

そんな事、コンピュータの学校や大学じゃ教えない。

理由は、簡単。そういう学校の先生は、大規模なシステムなんかを責任もって

作った事がない。だから、重要性が分からない。

単純でしょ。

僕は、ある意味、人間とロボットの社会を作ろうとしている

だから、きっちっと社会学的なフレームが必要になる。

そういうときには、いくつかの理論が役に立つけど、

今は、ルーマンを再度、お勉強中。

Peace!!

2014年1月27日月曜日

Making robot parts

いろいろ大変、ロボットのパーツも自分で作る。

今日は、ハイブリッド?

2014バージョンは、ベアリングをちゃんと使うので、ホルダーを作って、

職人技で、削ってはめ込みます。



右下は、出力したての状態です。


ぴったりはまっています。

いつもの様に、Blenderで、設計して3Dデータ作ります。

大事な事は、出来上がりの収縮率を見込んでおくこと。

ABSで、2%位考えた方が良いかも。

今日は簡単に、と思ったけど、

あー疲れている。でも、部品づくりも楽しいね。


Peace

2014年1月26日日曜日

My dog with Robots

今日は、寒いので、家でテストだぁ

我が家のクリン(犬)は、以前は、動くものが怖かったみたいだけど、

最近は、気にしない。


5台の自律移動型ロボットが動いていても、フーンて感じでみています。

このロボットは、カメラ一つで、環境を認識するようにしています。

まぁ、家では、こんな感じでテストをしてます。

2月に向けて、寒さが増してくる。

風邪ひかないように。

みなさんも、風邪ひかないよう

Peace

2014年1月25日土曜日

A technology of robot control based on community rule.

新しいテストを開始しまーす。

これをビデオにする予定、おそくなっちゃった。


貧乏なので、5台のロボットですが、二つの実証実験  始ままーす。

でも、可愛いでしょ!!

1)ルールベースの自律行動

2)ロボット行動の社会性の付与

ある意味、同じなんだけど、、、


ロボットにいろいろさせようとすると、プログラムを沢山作らないとならない。

RDCSでは、そんな非生産的な事を、極力少なくなるようにしたい。

従って、状況依存のルールベールの自律移動を実装している。はず、??

だから、テストを始めまーす



状況依存なので、複数のロボットが必要です。


で、最近得意のこのロボット、可愛いでしょ!!

作るのも簡単で、安いし。

でも、自律移動型ロボットよ!


僕は、サンオーって呼んでいるんだけど、

これまでのロボットって

重い      OMOI

大きい   OOKII

遅い      OSOI

はは、つまり、3O     O3(オさん)じゃない。王さんは、尊敬する野球人です。

もう、そんな時代じゃないよ。

Simple、に、Cool  で、Smart だよね。

SCSだ、、、、でも、デザインのセンスがない、私。。

とにかく、検証は、 これでよし。

また、報告しましゅ。

Peace!! 可愛い、ロボットたちに、、、

2014年1月24日金曜日

The performance management of organization.


お詫び) 夜中に書いたので、微妙に内容がずれていますが、ご容赦ください。<(_ _)>


読者の方のコメントに「日本人は、経営に向いているのか?」というご質問

ありました。経営といっても、大変広いので、経営の基礎である、マネジメントについて、

私が過去に調査研究した内容で私の考えをご説明します。

企業は、人だし、組織全体の知的機動力を最大化させるのが、基本でしゅ。

スペースの問題があるので、断片的になりますが、お許しください。



30代後半に、「組織のパフォーマンスって何だろう?」と疑問を持つようになりました。

今から、15年位前です。

そこで、会社の提案制度を利用して、組織分析手法の開発を提案し、許可が下りたので取り組みました。

組織のパフォーマンスといっても、漠然とした言葉なので、

企業が継続的に存続を保証する唯一の方法、「顧客を創造し続ける  事」を 前提に、

これからの時代を生き抜く組織とは、「新たな知識を継続的に生み続ける組織」であると、

仮定をして、その点を中心に分析手法や、そのような組織を構築するマネジメントについて

研究する事にしました。

この研究には、大手の上場企業の経営企画部に大変な興味を持って頂き、

約100の企業で、約10,000人のアンケート、および2,000人近いインタビューを行うことができました。

調査は、回答に1時間程度かかるかなり分量の多いアンケートで行い、その結果に基づいて、

マネジメントおよび、特に知識を生み出す事に関与の高い人に直接インタビューしました。

たぶん、今は、個人情報や、企業情報のセキュリティーの観点から、これだけ大規模でかつ、

深い分析をする事は不可能だと思います。このような分析をしている経営学の

研究者もいますが、実は、これだけのデータで研究をしている研究者はいません。

私の取組を評価して頂き、MITと共同研究することができました。

実は、RDCSには、その成果が組み込まれています。



図は、組織のなかの知識を生み出すネットワークを分析した結果をまとめたものです。

手法については、今回は解説しません。

点は、人であり、線は知識を活用したり知識を生み出すネットワークです。

左は、ほとんどネットワークがなく個人単位の知識で仕事をしている組織です。

真ん中は、典型的な情報をマネジメントの手段として使っている中央集権的な組織

右は、新たな知識を生み出し続ける組織です。知的機動力の高い組織です。

調査した企業は、同業種の企業もありネットワーク力と業績の違いを比較する事もできました。

業績面でみると、明らかに右の組織が良く、利益率が格段に高くなっています。

これは、みなさんも直観的にご理解頂けると思います。

左の組織は基本的に個人の知識・経験に頼った組織です。ですから、同じ間違いを繰り返します。

設計起因による、製造段階での不具合発生に悩む組織は、左の組織です。

次に、マネジメントがどのように違うのか?

左は、明らかにマネジメントが存在しません。たとへば、業績目標は立てるけど、

PDCAが回っていない。目指すべきGoal、が定義されていないなど、ある意味野放しの状態です。

不具合が発生しても、根本原因が分からず、繰り返します。

真ん中は、ルールを重視したマネジメントがされています。しかし、ルールから逸脱する事は、

「間違い」であると、強く意識づけられています。従って、それが組織の不文律になり、

人の意思決定をサイクルを縛ります。代表的な業種でいうと、銀行、旧財閥系製造業になります。

他に、電力、電鉄などのユーティリティ関連、そして官僚、自衛隊かも。

真ん中は、既存の知識体系の上で、仕事をする組織なので、ある意味効率的かもしれません。

しかし、新たな変化が発生した時に、不文律によって拘束されている個人、そして組織は

身動きが取れなくなります。ホストコンピュータが不振になったIBMはサービスに舵を切るために、

2/3の社員を入れ替えたのは、そのような背景があるからです。日本の企業は、

そのようなダイナミックな事はできませんから、不調な状態が長く続きます。

ある大手メーカの改革の時期に、ワークスタイル変革にご協力をしたことがあります。

しかし、その企業は、大胆な改革を行い、マネジメント層を大きく入れ替えたにも関わらず

業績が低迷してしまいました。それは、企業の不文律を変える事が出来なかったからです。

私が、調査をしても、途中で、現場から「やめてくれ」といわれて、その企業ではほとんど

調査が進みませんでした。組織の不文律に触れらるのを極度に恐れたようです。

つまり、組織の成員は、改革に合意していませんでした。従って、意思決定の

よりどころになる不文律を変えらる事に、大きな抵抗を示したのです。

当然、その企業は現在、大変な状況になっています。

右の組織は、組織内部の知識、そして外部の知識を組織の目的の為に、積極的に活用します。

知的機動力の高い組織です。

その結果、知識の化学反応が起こり、新たな「知」が生まれます。このサイクルが回ると、

どのような状態が生まれるか、たぶん推測することができると思います。

業務の品質、成果が良くなります。何よりも、意思決定サイクルが早まります。

その結果、沢山の失敗もしますが、すぐにリカバリーできるので、結果的に

成員のパフォーマンスもアップし、組織全体のパフォーマンスがあがります。

この組織は、環境変化にも強く、かつ、不文律にとらわれる事はありません。

ところで、このような組織のマネジメントのポイントは、careです。

活性の高い、組織なので、一人ひとりのcareが重要になっています。

この組織の部門長にインタビューを行うと、メンバー 一人一人の能力の的確な把握と、

その弱点に対して対処が的確になされている事がわかります。

たとえば、活性の高い組織の課長は大変です。課長はどちらかというと、古い組織の体質を

曳きづっていますし、会社のマネジメント教育そのものが、不文律にとらわれている事が

多いからです。その課長をいかにフォローするのか、部門長は頭を悩ませることが多いようです。

しかし、課長が実は大切で、知的起動力を高めるマネジメントを取得すると、この組織は継続的に

続くことになります。よく企業でミドルマネジメントが大切といわれるのは、企業が段々、

変革能力を求めるようになってきたからです。このような組織を運営した部門長は、

継続調査をした結果、ほとんどの方が取締役になられています。

日本の企業が強い競争力をこれからも維持するためには、環境変化に強い、左の組織を

目指すことが重要であり、かつそのためには、ミドルマネジメントの変革能力を高める事が

大切になります。

ところで、行政組織をみると40代後半に課長になる組織が多いようです。

もちろん、キャリアは、別パスなので違いますが、一般的に。

この場合、決して組織の変革は生まれません。それより、不文律が強くなり、人を縛ります。

「課長になるには、50までいう事を聞いて頑張るしかない」「そして残り10年波風立てない」

今の豊かさを維持するためには、グローバルなビジネスで勝ち残る必要があります。

企業が変化をしようとするのを、行政が結果的に邪魔すことが、これからますます増える

かもしれません。


人の能力は、遺伝子ではなく、環境で決まることが実証されています。

左の組織から、真ん中や、右の組織に異動するとどうなるでしょう。実証された通りに

適応します。従って、組織マネジメントがいかに重要であるかが分かります。


ところで、私は、J-SOX対応のグローバルプロジェクトの責任者をしたり、グローバルな事業の

立ち上げをしてきましたが、上の3つの図は万国共通とはいかないようです。

アングロサクソン文化圏は、ほぼ成り立ちます。しかし、東アジアや、東南アジアはどうも

違うようです。


さて、読者の方からの質問、日本人は経営に向いているのか

真ん中のマネジメントには向いている。ルールベースのコツコツ業界の経営は可能。


右のマネジメントには向いていない機動力の必要な業界の経営は向いていない。

あくまでも、一般的に見てと、ご理解ください

これからの時代は、ルールが無い、あるいみジャムセッションのような

機動的な意識決定が要求されることになります。また、当然海外でも活動する必要が

あります。それには、右のマネジメントが必要になります。

構成員を見極め、穴が開かないようにCareをして、

知的機動力最大の組織をつくるマネジメント、とうぜん業績はついてきます。

日本では、人の意思決定モデルが決まるまでに、

真ん中が社会のルールであると、教え込まれます。

最悪の例は、体罰は、暴力であるのに、しつけの範囲では許されることです。

つまり、ルールを守らないと、、、、、、

小中学校の先生に、変革意識はありません。基本は教育指導要領に従って、

コピーを作る仕事です。どんなに良い先生でも、真ん中の図の不文律の

基礎を、日常的な学校の中で、教え込んでいます。

学校の先生には、グローバル化とか、グローバス視点はありません。

社会の仕組みが、真ん中のマネジメントモデルの人材を量産しています。

高校は、若干良い方ですが、大学が典型的な真ん中です。

就職するまでの、間に、右のようなマネジメント触れる事がありません。

もちろん、例外もあります。

たとえは、私見ですが、慶応大学のSFCに集まる学生は将来、右のマネジメントができる

可能性が強いです。

人の能力は、遺伝子で決まるのではなく、環境で決まることが実証されています。

日本が、今の幸せな状態を維持するためには、グローバルなビジネス環境で、

勝ち続ける必要あります。その為には、知的機動力の高い組織をマネジメントする

環境に早くから触れなければなりません。躾けは家で、学校には求めず。

学校では、未来を生きる子供たちに必要な能力が身に付くようにするべきです。

グルーバルで競争する事をしらない、おじいさん学者の教育論が、子供たちを不幸にしています。

長文ですみません。

Peaceになりますように。。。

2014年1月22日水曜日

My Goal & My Now Mission.

疲れた~~、息抜き、、、ここでいうITは、経営システムね。



世の中、ITとロボットって融合させようとする取組はない。

また、一台一台作る事に、囚われている。    (産業ロボットは別ね。)

たしかに、ロボットの中では、プログラムが動ているけど、

ITではない、 農業もITと融合していない。

ITを使って、暗黙知とかあるけど、

僕は、数千人の知識分析をした。だから、

知識自体にはあまり意味がない事を知っている。

ましてや、経営から見ると、知識の価値とは、実は、???

ITと、ロボットと、農業を融合させる、それが僕の今のミッション。

でも、それは、目的ではない

目的は、それらを効果的な手段として使った「新しい地域経営の実現」

特に、中山間地域がターゲット。

この地域は、確かに過疎とか大変な状態。

でも、この国土の7割を占めている。

そこが荒廃したら、、、、、

まずは、思いっきり、目線上げるぞ!!

なんか、できる気がしてきた。なんちゃって。

妄想すると、息抜きになるね。!(^^)!

Peace!!

2014年1月19日日曜日

Start testing a small robot that measure temperature, humidity, land features and more

今日は、寒い寒いけど、ハウスの中は、暖かい。


2014年ロボットのテストを開始しまーす。

まずは、小型ロボットのテスト開始だぁ

このロボットのロールは次の2つでーす。


1) ハウス内の複数の指定位置で、温度、湿度、虫観測する

2) 移動中に、3m間隔で地形計測する

こういう事をしながら、RDCS、アプリケーションのテストをしまーす。

Raspberry Piを使った小さなロボット

上のピンク色は、Raspberry Pi カメラ

前からは、こんな感じ
ロボットのカメラから

Raspberry Piカメラは、性能が良い

定植が始まるまでに、テストテストだぁ。。

楽しい季節が始まりまーす。

Peace!!

My Weakness is electronic engineering. exemple...DC-DC Converter

ハードの事は、何もわからずに飛び込んだ、無謀なロボット創り。

その一例、

DC-DCコンバータの変遷です。



左から右です。

電池は、Lipoの 11.1V または、14.7V

それから、5V3A以上を取るために、使った、使っている、DCコンバータの変遷

電子工学の基本を、知らない私は、このように遠回りしています。(+_+)

ちなみに、5V1Aは、いろいろあるけど、5V3Aは無い。

でも、ロボットで、Raspberry Piと、各種のUSB、センサーなどを使うと3Aは必要。

もちろん、モータやサーボは、別電源よ。

最初から、村田さんのDCDCコンバータ()OKL-T/6-W12NC)使っていれば、、、

ノウハウにもなりゃしないけど、、、終わった事は、しょうがない。

しかし、日本はすごいよね。こんなデバイスが簡単に手に入る。

何事も、前向きに、、、、

そして、最後のターゲットは、サーボだ!!

安価に自作可能な、高トルクのサーボを開発できれば、いう事なし。

Peace !!

2014年1月18日土曜日

New Agriculture management frame work

昨日の、世界を変えるかもしれない人達との議論は、最高にエキサイティングだった。

最先端のITなのに、自然の力の潜在力も追求されている。

彼らの足元にも、及ばないが、僕も、頑張る。勇気がわいてきた。

従来から、言われていたけど、日本の農業の肥料や飼料は、海外からの原料の輸入や

エネルギーの供給に問題があると、成り立たなくなる。

化学合成肥料がなければ、とうぜん、今の農業は成り立たなくなる。

しかし、原料も、エネルギーも世界的に減少し、価格が高騰するのは分かっているわけだから、

もっと、自然の力を生かした、食料生産を追求しなければならない。

また、、これまの農業とは違った、企業経営を追求するのであれば、当然経営手法がことなるし、

何よりも、人のcapability違ってくる。

従って、上記以外のこれからの変化も含めて、

疲弊感満載な、「農業」という言葉、そして、「農学」という古い技術体系の見直しが必要なのでは

ないかと思う。当然、補正も含めえると3.5兆円もの補助金をだしている行政も変わる必要がある。

農学栄えて、農業滅ぶ。。。30年以上たまに、農学部生の時に、言われていたこと。



たとえば、僕は、農学を意識していない。



このようなフレームで考えた方が、すっきりする。

日本には、農業は、特別だ!

特別だと思わせることによって、既得権を作ろうとしえいる人達が、わんさかいる。

確かに、お天道様には勝てないが、科学を組み合わせれば、乗り越えられることは多い。

農業は、特別だ! ではなくて、既存の研究の成果も含めて、

科学的な、食糧生産産業に、いよいよ向かう時になったのだと思う。

僕は、そう考えてトマトを生産している。

だから、最高に、面白いのだ!!!

Peace!!

2014年1月12日日曜日

Next target device for robot controller


次のロボットのコントローラは、これでしょう!!

http://pc.watch.impress.co.jp/docs/news/event/20140111_630478.html



若いころに、640KBのMS-DOSで苦労してシステムを使った経験があるから、

こういう機器でも、抵抗感なくシステムを作れる。

最新の機器を使いこなすノウハウが、過去の経験ってのは笑える。

システムは、「言語の機能」で作るのではなく、

モデル化(構造化思考)とアルゴリズムで作るんだ。

そういう、大切な事を、知らないIT技術者が多すぎる。

Peace!!

2014年1月10日金曜日

New! How to install MinGW and Msys, and build opencv mingw library

しかし、いろいろ難しい、それを言うときりがないので、、、

ところで、Linuix側とWindows側でシームレスな開発環境をつくるためには、

MinGW上のgcc が欠かせない。

なぜなら、Linuxでも、Windowsでも、共通したソフトをつくる、もっとも確かな方法だから。

ところで、いろいろやっていると、さまざまな問題が起こってくる。

原因を調べてみると、ネット上の情報と、MinGWなどのメンテナンスの情報が

ずれていたり、理解されていないから。

それで、結果的に、いろいろ試して、現時点で一番いい方法というか、多分、

これからも変わらないと思う方法。この方法のポイントは、

単にコンパイルするとかではなく、cmakeの活用を前提に置いている事。

cmakeが活用できな環境構築は、今は、駄目でしょう。

下記は、DRY (Don't Repeat Yourself)の為のメモ

Opencvのminigw libraryをつくるためのcmakeの使い方まで含みます。

じつは、ここがむっちゃ苦労したところ。


1.MinGWのインストール(Msys単独のインストールは駄目)

必ず、mingw-get-setup.exe で行うこと。 ダウンロードは、下記のアドレスから。

http://sourceforge.net/projects/mingw/files/

インストール後には、ガイダンスに従ってインストールすればよい。

最小限のインストールだけでいいです。後に、追加のインストールをします。

ただし、Eclipseを使うのであれば、必ず、C:\MinGW にインストールすること。

これで、Msysもちゃんと入ります。別にダウンロードして、入れちゃだめよ!

2.環境設定

pathに、C:\MinGW\bin;C:\MinGW\msys\1.0\bin を設定する。

HOMEに、適当なディレクトリーを設定する。僕の場合は、HOMEに基本的に何も置かないので、

テンポラリー用のドライブDに D:\home と設定している。

あと、D;\home\.profileに設定をします。適当に、自分の環境に合わせてください。

if [ -n "${PS1:-}" ]; then
    export PS1="\[\e]0;\w\a\]\n\[\e[35m\]\D{%H%M%S} \[\e[32m\]\u
\[\e[0m\]\n\$ "
fi

umask 22

export LC_ALL=C
export LANGUAGE=en_US.UTF-8

export C_INCLUDE_PATH=/e/opencv/build/include
export CPLUS_INCLUDE_PATH=/e/opencv/build/include
export LIBRARY_PATH=/e/opencv/build/x86/mingw/lib
export PKG_CONFIG_PATH=/e/opencv/build/x86/pkg-config

#ALIAS set
alias ls='ls --color=auto'
alias ll='ls -al'
alias l='ls'
alias h='history 100'
alias cdhttp='cd /var/http'

alias n='cd /home;ls -al --color=auto'

alias rb='cd /f/robot/2W/2w/stereo'

この段階では、windows7以上を使っている場合には、再ログインかrebootをする。

理由は、解るよね。

3.追加ソフトのインストール

(1) mintty

C:\MinGW\msys\1.0\msys.bat を起動して、minttyをインストールする。

mingw-get update

mingw-get install msys-mintty

minttyのショートカットをdesktop上につくって、propertyに機動設定をする。

C:\MinGW\msys\1.0\bin\mintty.exe -tMinGW /bin/bash --login -i

(2) パッケージの update & upgrade

mingw-get update
mingw-get upgrade

なんか、apt-get と同じね。僕は、追加で、次のパッケージを入れました。

mingw-get install msys-coreutils msys-man msys-tar msys-gzip
mingw-get install msys-wget msys-zip msys-unzip msys-vim msys-rsync
mingw-get install msys-openssl msys-openssh
mingw-get install msys-patch msys-diffutils


(4) pkg-config 

これは、超大切です。ダウンロードは、下記のURL

http://www.gtk.org/download/win32.php

ダウンロードは、次の3つ。それぞれ、解凍して、C:\MinGW に上書きする。

pkg-config (runtime)、Glib (runtime)、gettext-runtime(Runtime)


4. cmake の インストール

下記から、ダウンロードしてインストールするだけ。

http://www.cmake.org/

 
5 OpenCv Minigw 用のlibrary作成のためのcmake オペレーション

これで、半日以上ハマった。思い出したくないから、やり方だけ。

http://robot009.blogspot.jp/2013/12/how-to-build-opencv-2472-mingw-on.html

と、下記の事を、合わせて読んでください。




Configure ボタンを押す

エラーが発生する。えっ!!


このpath 変更が、無茶苦茶大事。

これをしないと、minGWのWindowsの実装の問題で、

とんでもないエラーが表示されて、絶望的になる。

pathを変更して、再度Confrereボタンを押す


もう一回、Configure を押す。


で、Generation ボタンだよ



この後は、OpenCV/Build/x86/mingw で、mingw32-make install だぁ!!!

とっても、精神的に悪いエラーもでて、困ったので、

もう一度まとめなおしました。

Peaceだぁ!!

2014年1月6日月曜日

100yen shop is truly awesome

ばらして、基板に電池をつなぐ。

100均 ショップで、車のシガーライターから5V1A出力する機器を購入

さっそく、11.1V Lipoをつないで、確認。赤色LEDまでついている。

5.2V出力、チップも熱くならず。

チップは、MC34063APと書いてあるが、どうも、TI製ではない。

China パクリか?

チップの元本は、40Vまで入力OKのシロモノ


チップのパクリも、製品の価格もMade in chinaは、凄すぎ。

ある意味、ご立派。

日本は、もっと、危機感を持たないと、、、

というか、日本の基軸は製造業。

批判もあるかもしれないが、ITとか、サービス業とかではない、、、

だって、グローバルにビジネスしてないじゃん。

今の、贅沢に、うつつを抜かしていて、いいのだろうか?

やっぱり、製造業が復活しなければ、、、


Peace!!  じゃないなぁ

2014年1月5日日曜日

MinGW multithreading programming in C, and Now Project

今のProjectの目的は、

・開発生産性向上の為の、RDCSのシングルソース化の強化

・RDCSの性能向上の為に、マルチコア対応

・RDCSの、連続運転対応、対障害対応、リソースの有効活用を進めるための、

  一層の分散並列処理化

・入手性の良い、かつ誰でも1台は持っているWindowsマシンの有効活用促進


こんな所を目的に、改造作業をしています。

Version1も完成していない状態で、

ちょっと、悩むのだけど、このタイミングでしないと、やりたくても

できなくなってしまう。

特に、通信部分は、最も重要視している事の一つです。

やっぱり、HTTP通信は、業務系のシステムには良いけど、

ロボットシステムの通信系に使ってはならない事を痛感しました。

例えば、RDCSのような沢山のロボットを人工知能を搭載した協調制御するシステムで、

運用するのは、安全を考えれば、ダブル以上のチェック機能を持たせなければならないし、

それを分散環境で実現するためには、

独自のClient-Serverシステムで、専用のプロトコルで高速化や柔軟性を追求する

必要があるのだぁ。。。

だったら、Raspberry Piを使ってる事は矛盾じゃないのか?

なんて、意見もあるが、運用の時のハードはどんどん良くなるから変えればよい。

それより、安価で、10台のロボットを創って、上記のような事を確かめられる事の方が、

もっと意味がある。そう意味では、とってもバランスのよい開発マシンなのです。

Raspberry Piや、BBBは、、、、

僕は、開発や研究のマシンは、最新の性能でない方が良い場合も

あることを経験かつ体験的に理解しているよ。沢山、開発してきたから、、、


ところで、BBBは、Raspberry Piより体感的には、2倍以上の性能差を感じることがある。

一番感じるのは、pacmanによる大量のupgradeの時。

この作業は、まさにマシンの性能を測る上では、良いベンチマーク作業だと思う。


しかし、このようなシステムを開発可能なのも、gccなどの、オープンソースのおかげでです。

感謝感謝です。

そのおかげて、いろいろなシステムを構築することができる。

なんて、幸せな時代なのだとうと思います。

僕も、いつかは、恩返ししないと。。



で、昨日の懸案事項、今の段階で、いろいろテストしているけど、

ちゃんとOKだぁ。

(1) MinGWのSocketを使った、プログラムの確認

(2) MinGW下での、(1)とthreadを組合わせた場合の挙動


で、忘備録で、gcc 起動時の引数と、テスト時のヘッダーファイルをドーン。

ブログって、忘備録に最適なのでしゅ。。。

・MinGW
gcc threadServer0.c -o threadServer0 -mthreads -DDEBUG -DMINGW -lwsock32 -lws2_32 -lpthreadGCE2

・Linux
gcc threadServer0.c -o threadServer -lpthread

/***********************************************************
** Function : RDCS Communication Server & thread test
** File Name:
** Library  :
** Author   : Naoki Kabaya
** create   : 01/10/2014 version 1.0
** modify   :
***********************************************************/
//----------------------------------------------------------
// Includes
//----------------------------------------------------------
#include <stdio.h>
#include <stdlib.h> /* exit() */
#include <sys/types.h>

#if MINGW
#include <winsock2.h>
#include <ws2tcpip.h>
#else
#include <sys/socket.h> /* socket(), bind(), listen(), accept(), recv() */
#include <netinet/in.h> /* htons() */
#include <unistd.h>
#endif

#include <pthread.h> /* pthread_create(), pthread_detach() */
#include <errno.h>

//----------------------------------------------------------
// Defines
//----------------------------------------------------------
#define _POSIX_SOURCE  1   /* POSIX comliant source (POSIX)*/
#define BUFFSIZE       256
#define FALSE          0
#define TRUE           1

#define PORT    50000 /* listening port*/
#define MAXDATA 1024 /* recieve buffer size */

#if DEBUG
#define PR(A,B) printf("--->%s.(%s)\n", A, B)
#define PRDI(A,B) printf("DEBUG--->%s.(%d)\n", A, B)
#define PRDS(A,B) printf("DEBUG--->%s.(%s)\n", A, B)
#else
#define PR(A,B)
#define PRDI(A,B)
#define PRDS(A,B)
#endif

#if MINGW
#define D_SOCKET_VAR SOCKET
#define D_SOCKET_CLOSE(A) closesocket(A)
#define D_SOCKET_WIN_INIT WSADATA wsaData;if (WSAStartup(MAKEWORD(2 ,0), &wsaData) == SOCKET_ERROR) {printf ("Error initialising WSA.\n");return -1;}
#define D_SOCKET_WIN_TERM WSACleanup()
#else
#define D_SOCKET_VAR int
#define D_SOCKET_CLOSE(A) close(A)
#define D_SOCKET_WIN_INIT
#define D_SOCKET_WIN_TERM
#endif

//EOF

MinGW socket programming in C

RDCSのネットワーク部分は、HTTPで実装してきたのだが、

やはり、性能などの点で問題があり、Client-Serverに戻すことにしました。

性能と、拡張性を確保するために変更します。

将来的な事を考えて、従来Winodws上で構築していたが、MinGW環境実装するように変更する。

基本的に確認しなければならないのは、2点で、

(1) Socketを使った、プログラムの確認

(2) (1)とthreadを組合わせた場合の挙動

で、最初に(1)をしました。

大丈夫だと思うは、コンピュータの世界は通用しないもんね。

重要なポイントは、次の3点に集約できる。その点を理解すれば、イイチャ。

a. MinGWは、winsockを使ってネットワークを実装しているので、おまじないが必要

b. 変数の型

c. リンクモジュール


a. おまじない
     ・include
         #include <winsock2.h>
         #include <ws2tcpip.h>

         通常の #include <sys/socket.h>,<netinet.h>などは使わない

     ・モジュールの初期化が必要

         変数宣言      WSADATA wsaData;

         初期化         WSAStartup(MAKEWORD(2 ,0), &wsaData);

         終了処理     closesocket(SOCKET  ss);

                           WSACleanup();

b. 変数宣言

       SOCKET を使う。POSIXは、int の descriptor 

         従って、read、writeは使えない。recvとsendを使う。
           
c. リンクモジュール

       -lwsock32 -lws2_32

以上です。   で、 serverとclientのテスト用モジュールをドーン

Peace!!

/***********************************************************
** Function : RDCS network system Server test
** File Name: server.c
** Library  :
** Author   :
** create   :
** modify   :
***********************************************************/
//----------------------------------------------------------
// Includes
//----------------------------------------------------------#include <stdio.h>
#include <stdio.h>
#include <sys/types.h>
#include <winsock2.h>
#include <ws2tcpip.h>
//#include <sys/socket.h>
//#include <netinet/in.h>
#include <errno.h>

//----------------------------------------------------------
// Defines
//----------------------------------------------------------
#define _POSIX_SOURCE  1   /* POSIX comliant source (POSIX)*/
#define BUFFSIZE       256
#define FALSE          0
#define TRUE           1

//----------------------------------------------------------
// Globals
//----------------------------------------------------------

//----------------------------------------------------------
// Prototype
//----------------------------------------------------------
int main();

/***********************************************************
** Function :
** Category :
** Parameter:
**          :
** ---------------------------------------------------------
** return   : normal end :0
**          : error      : -1  error progess is upper routine.
** note     :
**          :
************************************************************/
int main()
{
WSADATA wsaData;
SOCKET sock;
SOCKET sock0;

struct sockaddr_in addr;
struct sockaddr_in client;

//int sock0;
//int sock;

int len;
int n;
/*******************************************************
** Initialize
********************************************************/
if (WSAStartup(MAKEWORD(2 ,0), &wsaData) == SOCKET_ERROR) {
printf ("Error initialising WSA.\n");
return -1;
}

/*******************************************************
** Process
*******************************************************/
//------------------------------------------------------
// (1) Open Socket
//------------------------------------------------------
sock0 = socket(AF_INET, SOCK_STREAM, 0);
if (sock0 < 0) {
perror("socket");
printf("%d\n", errno);
return 1;
}
printf("after scoket\n");

//------------------------------------------------------
// (2) bind
//------------------------------------------------------
addr.sin_family = AF_INET;
addr.sin_port = htons(50000);
addr.sin_addr.s_addr = INADDR_ANY;

if (bind(sock0, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
perror("bind");
return 1;
}

//------------------------------------------------------
// (3) listen
//------------------------------------------------------
if (listen(sock0, 5) != 0) {
perror("listen");
return 1;
}

//------------------------------------------------------
// (4) accept
//------------------------------------------------------
while (1) {
len = sizeof(client);
sock = accept(sock0, (struct sockaddr *)&client, &len);
if (sock < 0) {
perror("accept");
break;
}

n = send(sock, "RDCS SERVER", 11, 0);

if (n < 1) {
perror("write");
break;
}

//close(sock);
closesocket(sock);
}

/*******************************************************
** Terminate
*******************************************************/
//close(sock0);
closesocket(sock0);
WSACleanup();

return 0;
}



/***********************************************************
** Function : RDCS network system Client test
** File Name: client1.c
** Library  : 
** Author   : 
** create   : 
** modify   :
***********************************************************/
//----------------------------------------------------------
// Includes
//----------------------------------------------------------
#include <stdio.h>
#include <sys/types.h>
#include <winsock2.h>
#include <ws2tcpip.h>
//#include <sys/socket.h>
//#include <netinet/in.h>
//#include <arpa/inet.h>
//#include <netdb.h>

//----------------------------------------------------------
// Defines
//----------------------------------------------------------
#define _POSIX_SOURCE  1   /* POSIX comliant source (POSIX)*/
#define BUFFSIZE       256
#define FALSE          0
#define TRUE           1

//----------------------------------------------------------
// Globals
//----------------------------------------------------------

//----------------------------------------------------------
// Prototype
//----------------------------------------------------------
int main(int argc, char *argv[]);

//----------------------------------------------------------
// Code
//----------------------------------------------------------

/***********************************************************
** Function : 
** Category : 
** Parameter: 
**          : 
** ---------------------------------------------------------
** return   : normal end :0
**          : error      : -1  error progess is upper routine.
** note     : 
**          :
************************************************************/
int main(int argc, char *argv[])
{
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in server;
//int sock;
char buf[32];
char *deststr;
unsigned int **addrptr;

/*******************************************************
** Initialize 
********************************************************/
if (argc != 2) {
printf("Usage : %s dest\n", argv[0]);
return 1;
}
deststr = argv[1];
if (WSAStartup(MAKEWORD(2,0), &wsaData) == SOCKET_ERROR) {
printf ("Error initialising WSA.\n");
return -1;
}

sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("socket");
return 1;
}

/*******************************************************
** Process 
*******************************************************/
//------------------------------------------------------
// (1)
//------------------------------------------------------
server.sin_family = AF_INET;
server.sin_port = htons(50000);
server.sin_addr.s_addr = inet_addr(deststr);

//------------------------------------------------------
// (2)connect
//------------------------------------------------------
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) != 0) {
perror("connect");
return 1;
}

//------------------------------------------------------
// (3)
//------------------------------------------------------
char vect[512]={0};
int get=recv(sock,vect,512,0);
printf("read=%s\n", vect);
/*******************************************************
** Terminate 
*******************************************************/
//close(sock);
closesocket(sock);
WSACleanup();

return 0;
}


//EOM

2014年1月4日土曜日

Tools : scale down image file

OpenCV を使って、画像ファイルを縮小するツール

単純に、長辺の画素サイズをして指定して縮小します。

縦横は、関係なくて、長辺ね。

一括処理するときに使ってまーしゅ。

何気に、便利よ

makefileもドーンしておきます。

Windowsでも、Linux環境でもそのまま動くはず。

Windows環境は、この前の前の投稿のMinGWと、MSYSでの環境を作ります。

resizeImg 元イメージファイル    縮小ファイル名     縮小後の長辺の画素数

あとは、ソース見てね。

Peace!!


//---------------------------------------------------------
// Function  : resize image data
// File Name : resizeImg.cpp
// Library   : OpenCV2
// Author    :
// Date      :
//---------------------------------------------------------

//----------------------------------------------------------
// Includes
//----------------------------------------------------------

#include <stdio.h>
#include "cv.h"
#include "cxcore.h"
#include "cvaux.h"
#include "highgui.h"

//----------------------------------------------------------
// Defines
//----------------------------------------------------------
#define _POSIX_SOURCE  1   /* POSIX comliant source (POSIX)*/
#define BUFFSIZE       256
#define FALSE          0
#define TRUE           1

//----------------------------------------------------------
// Globals
//----------------------------------------------------------

//----------------------------------------------------------
// Prototype
//----------------------------------------------------------

//----------------------------------------------------------
IplImage *srcImg = 0;
IplImage *dstImg = 0;

//**********************************************************
// Function :
// Category : OpenCV + OpenNI2
// Parameter:
//          :
// ---------------------------------------------------------
// return   : normal end :0
//          : error      : -1  error progess is upper routine.
// note     :
//          :
//***********************************************************
int main( int argc, char** argv ){

int iRez, iRezX, iRezY;
float fRatio;
char* filename;

//******************************************************
// Initialize
//******************************************************

if (argc != 4) {
printf("resizeImage1 inFile outFile maxResolution.\n");
return -1;
}

filename = argv[1];
iRez = atoi(argv[3]);

//******************************************************
// Process
//******************************************************
//------------------------------------------------------
// (1) set resize parameter
//------------------------------------------------------
    // Set original iamge
    if( (srcImg = cvLoadImage( filename, 1)) == 0 ) {
        return -1;
    }

printf("size width=%d,  heigh=%d\n", srcImg->width, srcImg->height);
if (srcImg->width > srcImg->height) {
fRatio = (float)iRez / (float)srcImg->width;
iRezX  = iRez;
iRezY  = (int)((float)srcImg->height * fRatio);
} else {
fRatio = (float)iRez / (float)srcImg->height;
iRezX  = (int)((float)srcImg->width * fRatio);
iRezY  = iRez;
}

//------------------------------------------------------
// (2) execute resizing
//------------------------------------------------------
// create save image buffer
    dstImg = cvCreateImage( cvSize(iRezX, iRezY), IPL_DEPTH_8U, 3);

// resize
cvResize(srcImg, dstImg, CV_INTER_CUBIC);

//------------------------------------------------------
// (3) Display
//------------------------------------------------------

    // display window
    //cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
    //cvNamedWindow("Resize", CV_WINDOW_AUTOSIZE);

    // display
    //cvShowImage("Image", srcImg);
    //cvShowImage("Resize", dstImg);

    // enter key
    //cvWaitKey(0);
 
    //Save
    cvSaveImage(argv[2], dstImg);

//******************************************************
// Terminate
//******************************************************
    cvReleaseImage(&srcImg);
    cvReleaseImage(&dstImg);

cvDestroyAllWindows();

    return 0;
}


-----------------------------------------------------------------------


TARGET = resizeImg1
CC = g++
OBJS = $(TARGET).o
CFLAGS = -Wall -O2
LDFLAGS = -lm
OPENCVINC = `pkg-config --cflags opencv` -I/usr/include
OPENCVLIB = `pkg-config --libs opencv`

all: $(TARGET)

$(TARGET): $(OBJS)
$(CC) -o $@ $(OBJS) $(LDFLAGS) $(OPENCVLIB)

.cpp.o:
$(CC) -c $< -o $@ $(CFLAGS) $(OPENCVINC)

.c.o:
$(CC) -c $< -o $@ $(CFLAGS) $(OPENCVINC)

clean:
rm -f $(TARGET) $(OBJS)

2014年1月2日木曜日

Source code management using Google Drive

ちょっと、いろいろ整理中です。

ソース管理などは、こんな感じでやっています。


基本的には、真ん中のWindowsマシン上でMinGWをインストールして、CDTで開発

バックアップは、Google Driveを利用して自動バックアップ

これって、何も気にする必要がないので、超ラクチン

もちろん、ソースのリビジョン管理なんかはできないけど、

それぞれのソフトのタイミングをみて、tarファイル作るので、何の問題もない。



デバイスを制御する部分だけ、Raspberry Piや、BeagelBone Blackで開発する。

その時は、FileZillaを、ファイルエクスプローラとして使って、

コマンドはputtyでssh接続してたたく。

真ん中のPCにクロス開発環境を載せる方法もあるけど、

デバイス関連のソフトは、CPUパワーを必要としないので、わざわざ載せる必要はない。

OSは、ArchLinuxのRolling Release(RR)で、いつも最新。

問題が発生するのではと思ったのだけど、RRだからって何の問題も発生しない。

基本、gcc,  g++でしか開発をしないので、関係ないかも。


ロボットは、Raspberry PiやBBBで作っているので、

真ん中のマシンで作ったコードを、Raspberry PiやBBBのマシンでBuildするけど、

問題は、発生していない。


というか、過去の経験から、変数の定義方法から始まって、

問題が起こらないようにしている。


Google Drive様様で、ごぜいましゅ。ちなみに、25GBの無料利用です。

また、現在開発中のクラウドも、25GBあれば十分。

農業クラウドで、日本の企業が有料でサービスしているけど、

そのような有料は使わなくてもよい。

僕のロボットシステムと、農業生産管理のシステム発表したら、

みんなGoogleでやるんじゃないの?

Peace!!

Setting : MinGW and MSYS

元旦も、お仕事

画像処理径は、やっぱりCore i7で、高速処理するのが良い。

今までは、勉強不足でWindowsの開発環境と、Linuxの開発環境をそれぞれ作っていたのだけど、

Makwfileの変換ツールとか、ちょっとした小ネタのツールで、問題はなく相互で開発をしていた。

ただ、も一度考えると、無駄かなぁと考えて、

Eclips CDTの為に、インストールしていたMinGWで共通の環境を作ってみようと、

元旦に設定した時のメモ

POSIX thread も追加でインストール


(1) MinGWと、MSYSのインストール

これは、沢山説明しているサイトがあるので、そちらを見てチョンマゲ。

ただ、CDTを使うなら、C:\MinGWに、インストールする事

これも、忘れちゃダメよ

mingw-get update

mingw-get upgrad

mingw-get install xxxx              xxxxは、欲しいソフト

pkg-configは、下のURLから4つのパッケージをdownload、解凍しC:\mingwに上書き

http://www.gtk.org/download/win32.php

gettext-runtime
glib
gtk+
pkg-config

(2) MSYSの設定

起動時の環境変数、Aliasなどの設定

これは、.bashrcで行う。ついでに、

自分のサンプル

if [ -n "${PS1:-}" ]; then
    export PS1="\[\e]0;\w\a\]\n\[\e[35m\]\D{%H%M%S} \[\e[32m\]\u
\[\e[0m\]\n\$ "
fi

umask 22

export LC_ALL=C
export LANGUAGE=en_US.UTF-8

export C_INCLUDE_PATH=/e/opencv/build/include
export CPLUS_INCLUDE_PATH=/e/opencv/build/include
export LIBRARY_PATH=/e/opencv/build/x86/mingw/lib
export PKG_CONFIG_PATH=/e/opencv/build/x86/pkg-config

#ALIAS set
alias ls='ls --color=auto'
alias ll='ls -al'
alias l='ls'
alias h='history 100'
alias cdhttp='cd /var/http'

alias n='cd /home/Naoki;ls -al --color=auto'
alias rb='cd /f/robot/2W/2w/stereo'


ついでに、.profile

exec /bin/bash


(3) OpenCVのライブラリー

前の投稿で記述したMinGWのOpenCVの、ライブラリー名を変更
make などをすると、ライブラリーが無いとか、メッセージがでるので、

当該のライブラリーをコピーして、リネームする。

それぞれの人の環境で違うとおものうで、、、、手作業


(4) Makfileは、Linuxと同じものが使える

CDT上で開発するけど、結構、makeする事が多い。

MSYSは、bashシェル上が動くから、ちゃんとpkg-configも展開される。

ただし、opencvは、2.4.7から、mingw用ライブラリーは

自分でbuildしなければならなかった。

その時に、unix-installにできるopencv.pcは、WindowsのドライブがE:などのように

指定される。これは、これで良いのだが、Msys上では、E:は変換されない

従って、新たにpkg-configというディレクトリーを作って、

ドライブ指定を E: から /e/ に変更したopencv.pcを作っておく。

それをexport PKG_CONFIG_PATH=/e/opencv/build/x86/pkg-config と、

.bashrcで設定している。

これで、Mkafileは、Msys(Windows)と、Linuxで同じものが使える。

例えば、、、、

TARGET = pp
CC = g++
OBJS = $(TARGET).o
CFLAGS = -Wall -O2
LDFLAGS = -lm
OPENCVINC = `pkg-config --cflags opencv` -I/usr/include
OPENCVLIB = `pkg-config --libs opencv`

all:    $(TARGET)

$(TARGET):      $(OBJS)
        $(CC) -o $@ $(OBJS) $(LDFLAGS) $(OPENCVLIB)

.cpp.o:
        $(CC) -c $< -o $@ $(CFLAGS) $(OPENCVINC)

.c.o:
        $(CC) -c $< -o $@ $(CFLAGS) $(OPENCVINC)

clean:
        rm -f $(TARGET) $(OBJS)


(5) その他メリット

・gcc, g++  開発 は、超ラクかも

多少のリビジョンの違いはあるけど、WindowsとLinux側で、同じソースが動く

従って、Windosw側(MSYS)で開発して、Linuxにソースを送ってmakeするだけ。

だから、sambaなどで共有設定しておけば、面倒はかなり減る。

ただし、日本語は、わからない。僕は、日本語をソースコード内で使わない。


・ シェル類が、同じものが使える

ルートになるパス設定だけ、環境変数を読むようにしておけば、

同じシェルが使える


ということで、「もっと早くやっとけばよかった」


追加 POSIX thread  ---------------------------------------------

ダウンロード   https://sourceware.org/pthreads-win32/

The folder "Pre-built.2" contains the folders "lib" and "include", copy its contents into the MinGW folders of the same name. 

The folder "dll" contains pthreadGC2.dll and pthreadGCE2.dll , copy to MinGW/lib.

Important if using exception handling: Compile your application with the additional compiler switch "-mthreads". 

Peace!!