2018年2月7日水曜日

memo : Repeat on the command line

個人的なメモ、、、
コマンドラインで繰り返し処理をする。


while true; do date; sleep 1s; done
i=1; while [ $i -le 10 ]; do echo $i; i=$(expr $i + 1);done
watch -n 1 date

Peace!!

2018年2月6日火曜日

An installation of opencv2.4.13.5 on raspberry Pi

raspberry piでopencv 通常にインストール(apt-get) すると
なんと、2.4.9という4年前のモノ

なんでなんだろう。。。

そんな事より、都合で2.4.X使いたいので、buildしてインストールする。
現時点は、2.4.13.5。

いろいろ面倒な事をしたくなので、通常通りにインストール
sudo apt-get -y install libopencv-dev

これにかぶせる形で、インストールする
C言語だけしか使わないので余計なものはインストールしない
とは言っても、最初の通常インストールは意味なかったりして。
wget https://github.com/opencv/opencv/archive/2.4.13.5.zip
unzip 2.4.13.5.zip

cd opencv-2.4.13.5
mkdir build
cd build

sudo apt-get install -y build-essential git cmake pkg-config cmake-qt-gui mesa-utils  libgl1-mesa-dri libjpeg-dev libtiff5-dev libpng12-dev libjasper-dev  libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libgtk2.0-dev libprotobuf-dev protobuf-compiler  libatlas-base-dev gfortran libeigen3-dev libv4l-dev python3-dev libqtgui4 libqt4-test libqt4-opengl-dev libvtk6-dev

cmake -D CMAKE_BUILD_TYPE=RELEASE      -D CMAKE_INSTALL_PREFIX=/usr/local      -D INSTALL_PYTHON_EXAMPLES=OFF       -D ENABLE_NEON=ON      -D WITH_TBB=OFF -D BUILD_TBB=OFF       -D WITH_QT=OFF -D WITH_OPENGL=OFF      -D BUILD_opencv_freetype=OFF      -D BUILD_EXAMPLES=OFF -D WITH_VTK=ON ..

make -j4
sudo ldconfig

例の如く小一時間





2.4.13.5 だす
cd samples/c
./build_all.sh
./facedetect  --cascade="../../data/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 ./lena.jpg


Peace!!

2018年2月1日木曜日

A setting realvnc server

今まで、気が付かなったけどVNCサーバが標準でインストールされている。
使う使わないは、raspi-config  で設定
ただ、デフォルトの画面サイズだと、拒否感満載
画面サイズのは変更方法
因みに新たにインストールする時は、、、
    sudo apt-get install realvnc-vnc-server
     sudo systemctl enable vncserver-x11-serviced.service
     sudo systemctl start vncserver-x11-serviced.service

https://elinux.org/RPiconfig#Video_mode_options

ここを参考に下記リストを参照して /boot/config.txt に赤字を追加する
画面の大きさは、hdmi_modeで設定
hdmi_mode=82 1080p 60 Hz

hdmi_mode=42   1400x1050  60 Hz
160206追記はじめ
OpenGLのドライバーを有効にすると、画面サイズがデフォルト画面になってしまう。従って、RealVNCを使うときは、OpenGLドライバーとdisableする。
赤字部分。下のconfig.txtの下記部分を比較して設定する事。
画面の感じは、85番が一番よいかも。。。

hdmi_ignore_edid=0xa5000080
hdmi_group=2
# RealVNC setting
# when  use RealVNC, OpenGL driver disable as below
# dtoverlay=vc4-kms-v3d
# 16 1024x768  60Mhz
# 42 1400x1050 60Mhz
# 82 1080
# 85 720p
hdmi_mode=85

160206追記終わり

sudo vi /boot/config.txt
cat /boot/config.txt
# For more options and information see
# http://rpf.io/configtxt
# Some settings may impact device functionality. See link above for details

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
#hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1
hdmi_ignore_edid=0xa5000080
hdmi_group=2
hdmi_mode=85

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
dtparam=i2s=on
#dtparam=spi=on

# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi

# Additional overlays and parameters are documented /boot/overlays/README

# Enable audio (loads snd_bcm2835)
#dtparam=audio=on
# dtoverlay=i2s-mmap
dtoverlay=googlevoicehat-soundcard
# dtoverlay=googlevisionbonnet-myriad
# dtoverlay=aiy-io
# dtoverlay=aiy-leds
start_x=1
gpu_mem=128
# dtoverlay=dwc2

Peace!!


2018年1月30日火曜日

Google AIY Project Voice Kit (Photo only)

2台購入したので、さっそく組立、、、20分位/台
まだ動かないけど、写真だけアップ

意外と小さい

Peace!!



2018年1月17日水曜日

Learning sed for bash cgi processing

開発時には、何回も”ちょっとテスト”必要ですが、、、
今回は、sed使ってcurlで投げた引数の処理
curlで投げた先が、bashというのはご愛敬で、、、

あまりにも、久しぶりのsedを使った処理だったので、メモとして記録

端末側からは、、、

curl -X POST -d "qq=123&aaa=222" http://www.workrobot.co.jp/api/rdcs/v2/mng/robot/net/net_setting

実行結果は、、、
POST
14

key1: qq  value1: 123
key2: aaa  value2: 222

success command

サーバ側のスクリプトは、、、
#!/bin/bash

#touch `/bin/hostname`

#cat - > qq
#cat -  > qq
read STRING

echo $REQUEST_METHOD
echo  $CONTENT_LENGTH
echo
value=`echo "${STRING}" | sed -e "s/.*=\(.*\)/\1/"`
str=`echo "${STRING}" | sed -e "s/\(.*\)=.*/\1/"`
key=`echo "${str}" | sed -e "s/.*&\(.*\)/\1/"`

#echo $str
str2=`echo "${str}" | sed -e "s/\(.*\)&.*/\1/"`
value1=`echo "${str2}" | sed -e "s/.*=\(.*\)/\1/"`
key1=`echo "${str2}" | sed -e "s/\(.*\)=.*/\1/"`
echo "key1:" ${key1} " value1:" ${value1}
echo "key2:" ${key} " value2:" ${value}
echo
echo "success command"

sedの呪文の世界(笑)

Peace!!


MultiProcess or MultiThread

メモメモ、、、、

僕は、自律制御の仕組を開発している。
もう、3年程度たつので、現在のモノをスマートにブラッシュアップしたくていろいろ検討中
内部では、様々な処理をマルチタスクで行っているが、いよいよスパゲティー状態。それと、いろいろなノウハウもたまり、、、

再実装を考えた場合、マルチタスクのシステムなので、
それをどう実現する様に、改めて考えている。
技術的には、マルチスレッドやマルチプロセスなどのテクニックの利用となる。
ネットには、一般論や解りやすい事例は書いてあるけど
自分の技術選択に必要な情報はほとんどない
で、自分で決めるわけだけど、、、
以下は、まとまっていないけど、、、

技術選択基準は、
・堅牢なシステムの実現
・開発効率、特に検証・デバッグのやりやすさ
・システムの拡張のしやすさ

・堅牢性
ロボットのコントローラなので、堅牢な作りにする必要がある。
堅牢とは、、、、
・目的の機能を誤りなく実行し続ける事。
・想定内の異常が発生した場合、所定の手続きで、必要な処置を行い決められた状態に移行する事

人それぞれによって異なる訳で、、、
実際は、システムデザイン、プログラムデザインに係わる事なんだけど、、、
一つのタスクだけで動くわけではないので、
マルチに動くタスクをどのように管理するのか?
それが、重要で、、、
となると、
マルチスレッド、マルチプロセスどちらを上の基準から選択するのか?

自分の堅牢の定義が世間一般的なのかはさておき、、、
マルチタスクの視点から言えば、徹底的なモジュール化をベースに、モジュール結果の評価を正しく行い、次の処理へとつなぐこと。
では、スレッドとプロセスどちらが適しているのだろうか、、

その前に、
マルチスレッドと、マルチプロセスの復習
・マルチプロセスは、複数の独立したプロセスで並列処理する事
・マルチスレッドは、一つのプロセス内で並列処理する事

ブラウザーや、ウェブサーバーはマルチスレッドになっている。
ブラウザーのファイルダウンローなどはスレッド、また画面に現れるダイアログボックスもスレッド。そうしないと、ファイルのダウンロード終了までブラウザーが固まってしまうから、、、時間のかかる処理を別に動かす。また、タグもそれぞれ別スレッド。そうしないとブラウザープログラムで一つのサイトしか表示できない。
Webブラウザーも、アクセスしてくる要求毎にスレッド対応。以前は、fork()だったけど、アクセスが多くなると起動時のオーバヘッドの高いfork()では、感じる遅延が発生する。
この二つの例は、同一機能を並列的に複数行う事と考えても良い。
つまり、機能のクローン化。ダイアログをスレッドかするのは、クローン化というよりは時間差により遅延解消
そうみると、
・機能のクローン化
・時間差処理の外だし
と考えてもよい。
マルチプロセスも、機能のクローン化
両方ともに、良い点や考慮しなければならない事があり、決定的な優劣はつけにくい。

ところで、僕は何の為にマルチタスクにするのか?
それを再度考えると、、、
このような機能構成のロボットコントローラーを開発するのが目的であり、
よくよく構成をみると、マルチプロセスか、マルチスレッドなのか
どちかの技術で決められない事がよく解る。
あさはかな自分、反省


これを、先ほどの求める事などを組合わせて考えると、、、
青いBoxはマルチスレッドで機能クローン化を図った方がよい所、
赤い線の部分は、プロセスとして運用した方が良い所、、、

マルチプロセスと、マルチスレッドの組合せで構成するというのが
先の技術選択基準を満たすと今は考えている。

という事は、今度は、プロセス間通信をどうするかという事だけど、、、
それは、Share Memoryをベースにして同期処理などを取る仕組みを創る事にした。

という事、細かい部分に入りながら、地道な改良を始める

とりとめもない、自分のメモ、、、

Peace!!

2018年1月14日日曜日

how to use Jansson

Janssonインストールしたけど、どう使うのか?
webにも、あんまり細かい事は出ていない
例えば、こんなデータの場合は?

[
{
    "RdcsId":"rcmp-r41",
    "Status":1,
    "NetIdLocal":"kk",
    "Agent":null,
    "Category":"4WD",
    "PlatformRbt":null,
    "NowRole":"tk001",
    "OsVersion":"4957-v7#1047",
    "Role": {
        "Execute": "tk001",
        "LoadId": [
            "tk001", "tk0201", "mv0459"
        ],
        "Status": "Safe"
    }
},
{
    "RdcsId":"rcmp-r42",
    "Status":2,
    "NetIdLocal":"kk",
    "Agent":null,
    "Category":"4WD21",
    "PlatformRbt":null,
    "NowRole":"tk022",
    "OsVersion":"4957-v7#1047",
    "Role": {
        "Execute": "tk001",
        "LoadId": [
            "tk001", "tk2222", "mv0459"
        ],
        "Status": "wait"
    }
},
{
    "RdcsId":"rcmp-r43",
    "Status":3,
    "NetIdLocal":"l0",
    "Agent":null,
    "Category":"4WD23",
    "PlatformRbt":null,
    "NowRole":"tk033",
    "OsVersion":"4957-v7#1047",
    "Role": {
        "Execute": "tk001",
        "LoadId": [
            "tk001", "tk3333", "mv0459"
        ],
        "Status": "Safe"
    }
}
]

こういうデータに対しての使用方法を理解しないと困るので、、、
プログラムを作って、検証した。
で、一応、使い方は理解できたかもという話
インターネット経由のデータ処理が多いけど、プログラムのファイル読み込み部分がcurlのツールになる。
それは、JanssonのTutorialを見ればわかるので、、、
で、結果は、こんな感じで、、、まぁ、自己満足でごめんなさい。
プログラムはこんな感じ、、、
プログラムは、試行錯誤の跡、たっぷり(笑)
あっ
追記:Raspberry Piで、curlモジュール使うとき
sudo apt-get install libcurl4-openssl-dev

Peace!!

-------------- build ------------------------------------
gcc tst4.c -o tst4 -ljansson

-------------- program --------------------------------

#include <stdio.h>
#include <jansson.h>

//#define PRS(A)  printf("----->%s\n", A)

/************************************************/
int main(int argc, char *argv[])
{
    size_t i;
    int iCnt;

    json_t *root;
    json_error_t error;
    
    FILE    *outfl;

    /********************************************
    **     check arguments
    ********************************************/
    if(argc != 8){
        fprintf(stderr, "usage: %s file dumpfile keyword obj child-obj child-obj-array key\n\n", argv[0]);
        return 2;
    }
    
    if ((outfl = fopen(argv[2], "w")) == NULL) {
        fprintf(stderr, "error: file open.(%s)\n", argv[3]);
        return 1;
    }

    /********************************************
    **     convert jansson memory data
    ********************************************/
root = json_load_file(argv[1], 0, &error );
    if(!root){
        fprintf(stderr, "error: on line %d: %s\n", error.line, error.text);
        return 1;
    }

    // check array data
    if(!json_is_array(root)){
        fprintf(stderr, "error: root is not an array\n");
        json_decref(root);
        return 1;
    }

    iCnt = json_array_size(root);
    printf("array counts = %d\n", iCnt);
    
    for(i = 0; i < iCnt; i++){
        json_t *data, *value, *obj, *objv, *obj1, *obj11, *obj111;

        /*****************************************
        **     1. get one object
        *****************************************/
        // get obj
        data = json_array_get(root, i);
        json_dumpf(data, outfl, 256);
        
        if(!json_is_object(data)){
            fprintf(stderr, "error: data %d is not an object\n", (int)(i + 1));
            json_decref(root);
            return 1;
        }

        // get value
        value = json_object_get(data, argv[3]);
        if(!json_is_string(value)){
            fprintf(stderr, "error: obj no. %d: keyword:%s is not a string\n", (int)(i + 1), argv[3]);
            return 1;
        }

        /*****************************************
        **     2. get object in object
        *****************************************/
        // get obj
        obj = json_object_get(data, argv[4]);
        if(!json_is_object(obj)){
            fprintf(stderr, "error: obj %d: is not an object\n", (int)(i + 1));
            json_decref(root);
            return 1;
        }

        // get value obj,obj
        objv = json_object_get(obj, argv[5]);
        if(!json_is_string(objv)){
            fprintf(stderr, "error: objv no. %d: keyword:%s is not a string\n", (int)(i + 1), argv[5]);
            return 1;
        }
        
        /*****************************************
        **     3. get array value in object
        *****************************************/
        // get obj
        obj1 = json_object_get(data, argv[6]);
        //json_dumpf(obj1, stderr, 256);printf("\n");
        if(!json_is_object(obj1)){
            fprintf(stderr, "error: obj1 %d: is not an object\n", (int)(i + 1));
            json_decref(root);
            return 1;
        }

        // get value obj,obj
        obj11 = json_object_get(obj1, argv[7]);
        //printf("------------------------\n");
        //json_dumpf(obj11, stderr, 256);printf("\n");
        if(!json_is_array(obj11)){
            fprintf(stderr, "error: obj11 no. %d: keyword:%s is not a object\n", (int)(i + 1), argv[6]);
            return 1;
        }
        obj111 = json_array_get(obj11, 1);
        if(!json_is_string(obj111)){
            fprintf(stderr, "error: obj111 no. %d: keyword:%s is not a string\n", (int)(i + 1), argv[7]);
            return 1;
        }
        /*****************************************
        **     4. print value
        *****************************************/
        printf("key:%s  value:%s obj:%s obj111:%s\n", 
            argv[3], json_string_value(value), json_string_value(objv),
            json_string_value(obj111));
    }
    
    /*********************************************
    **                                          **
    **     terminate                            **
    **                                          **
    *********************************************/
    json_decref(root);
    fclose(outfl);
    return 0;

}