2019年6月30日日曜日

mlkit#901 シンプルに動かす 変更編

Google FireBaseは、凄いスピードで進化している。
サンプルプログラムも、どんどん変わっている。
ただし、どんどん洗礼化されているので、コードを見ることはMlKitを活用する上では
欠かせない。
そして、それをベースに検証もするのだけど、新しい依存するモジュールが動かなくなっていたりと、、、
今回は、ビデオ画像を認識の元データとして使う場合の設定と、
Version Controlのメモ

(1)ビデオ画像を使う

カメラとGraphicのオーバーライト処理が必要になるわけで、
それは、プログラムをガンガンいじるイメージではなく、
カメラとオーバーライトを、Layoutで設定し
IFを使って取得して処理をする感じ。
その全体像が分かる写真がした。僕は、わかる。メモだからいいでしょう(笑)
オッチョコチョイナ僕が時間を使ってしまったのが、
#901が、カメラとオーバーライト処理のモジュールがcommonにまとめられた事に
頭がついていかず、以前の場所を指定したまま処理をしたので、落ちまくり。
プログラムの方ばっかりを見ていたけど、実はレイアウト定義だった。

(2) Version Control

Android Studioにクラスを作るのだけど、階層構造で表示される画面には、
クラスが赤くなったまま。かつクラスを活用することができない。
これも、数時間使ってしました。

File > Setting > Version Control 
あれ? Gitになっている。これをnoneの指定にするとお見事!
 
 Androidのプログラムばっかり作っているわけではなく、
物忘れも早くなり、こんな事を繰り返しながら進んでいます。
#901になって認識速度、むっちゃ早くなった。

で、良いアイデアが下りてきたのだぁ (^^)/

AndroidManifestも今回は、理解できてうれしかったなぁ。
モジュールを沢山作っても、交通整理して使える。
これは楽しいのでした。



追記

(3) Android 9(Pie)のセキュリティ

実は、セキュリティが厳しくなっており、HTTP通信を使う場合には、
セキュリティ設定をしないとならないのだぁ
いろいろなセキュルティ指定の方法があるけど、一番簡単なでも推奨されないやり方で一応、一応、一応の設定。
おまじないは、、、
android:usesCleartextTraffic="true"

Peace!! 

mlkit#901をシンプルに動かすためのメモ

起動までをメモ

1.windows に gitをセットアップ
ダウンロードして、インストール
https://gitforwindows.org/
何故か、画面のdownloadボタンの動きがおかしく、画面左上のバージョンをクリックして、変わった画面から64bit版をダウンロード

2.firebase quickstart-android ダウンロード
上記でセットアップした、Git Bashを使う。
セットアップしたいディレクトリーに移動をしコマンド入力する。
git clone https://github.com/firebase/quickstart-android.git

3.Firebase構成ファイルの追加
ディレクトリーmlkit/appに配置する
Firebaseに登録した時に、DownloadしたJsonファイル

4.Firebase AndroidManifast.
mlkitは、日々変更が加えられている。昨年のmlkit内容とは変わっている。
特に、僕が最初に使った時からは、kotlinのサンプルが追加されており、
起動時の画面でjava、kotlinの選択画面が現れる。


これは不要なので、Manifestを書き換えて、起動画面を変える。
インストール後のAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.google.firebase.samples.apps.mlkit">

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/MaterialTheme">
        <meta-data
            android:name="com.google.firebase.ml.vision.DEPENDENCIES"
            android:value="barcode,face,ocr,ica" />

        <activity
            android:name="com.google.firebase.samples.apps.mlkit.java.ChooserActivity"/>

        <activity
            android:name="com.google.firebase.samples.apps.mlkit.kotlin.ChooserActivity"/>

        <activity
            android:name="com.google.firebase.samples.apps.mlkit.EntryChoiceActivity"
            android:exported="true"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".java.LivePreviewActivity" android:exported="true">
        </activity>

        <activity android:name=".kotlin.LivePreviewActivity" android:exported="true"/>

        <activity android:name=".java.StillImageActivity"
            android:exported="true">
        </activity>

        <activity android:name=".kotlin.StillImageActivity"
            android:exported="true"/>
    </application>

</manifest>

変更後のAndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.google.firebase.samples.apps.mlkit">

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/MaterialTheme"
        tools:ignore="GoogleAppIndexingWarning">
        <meta-data
            android:name="com.google.firebase.ml.vision.DEPENDENCIES"
            android:value="barcode,face,ocr,ica" />

        <activity
            android:name="com.google.firebase.samples.apps.mlkit.java.ChooserActivity"
            android:exported="true"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".java.LivePreviewActivity"
            android:exported="true" />

        <activity android:name=".java.StillImageActivity"
            android:exported="true">
        </activity>

    </application>

</manifest>

あとは、ソースを眺めて確認、確認

Peace!!



2019年6月4日火曜日

mysqlのバックアップメモ

忘備録

1. backupシェル

#!/bin/sh
# Set mask for other user cann't read
umask 077

# backup file
# Retention period
period=31

# directory for backup files
dirpath='/home/pi/backup/mysql'

# backup file naming
filename=`date +%y%m%d`

# excute
mysqldump --opt --all-databases --events --default-character-set=binary -u root --password=xxxxxxxxx | gzip > $dirpath/$filename.sql.gz

# delete old backup files
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/$oldfile.sql.gz

2. sudo  crontab -l

0 2 * * *  /home/pi/prj/sql/mysql_backup.sh > /tmp/cron-bk.stdout 2 > /tmp/cron-bk.stderr || [ $? -eq 1 ]

3. WIndowsマシンへのバックアップ

Peace!!

cron 設定の悲劇

cron使って、mysqlのデータバックアップを行う設定をしたのだけど、、、

ネット情報をまともに信じてしまい半日無駄にしたというアルアル

ネットでは、コマンドの前に "root"が入っていた。
何も考えすに、そのまま転記し起動時間だけ変更
手動では動くshellが、errorになる

結局、crontabの書式のように 起動時間設定の後は

コマンド

コマンド

です。

起動ユーザなんて入れてはいけない

他の機種とOSの場合は解らないが
Raspberry Piと、Stretchは コマンド

Peace!!

2019年6月2日日曜日

mysqlでインポートしたDBのユーザのパスワード再設定

mysql + raspberry pi で、業務システム開発中

当然バックアップとりますが、それを開発用のマシンにインポートのメモ

mysql -uroot -prルートのパスワード  < 190530.sql

開発用のユーザ(xxx)でログインできない

$ mariadb -uthn -p
Enter password:
ERROR 1045 (28000): Access denied for user 'xxx'@'localhost' (using password: YES)

$mariadb -uroot -p

update mysql.user set password=PASSWORD('1234567') where user='xxx';

ただ、上記の処理をしてもダメな時があり、、、

MariaDB [(none)]> flush privileges;
MariaDB [(none)]> show grants;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*8637AD513CC7ED5F46D72CD7C3C587CFC9522613' WITH GRANT OPTION |
| GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION                                                                          |

+----------------------------------------------------------------------------------------------------------------------------------------+

あれ?
MariaDB [(none)]> grant all privileges on *.* to 'thn'@'localhost';
MariaDB [(none)]> flush privileges;

OK

Peace!!

2019年4月29日月曜日

自律搬送クローラロボットの開発情報のまとめページ

某自動車メーカと共同開発のクローラを使った自律走行ロボット

ところで、開発でバタバタでベースになるソフトなどが整理できていない。
これはやばいので、ここで整理。

ロボットシステム開発の基本的な考え方
「安全を最優先、次にパフォーマン→最もコンパクト、最速に動くシステム」

従って、安全を最優先にしたアーキテクチャーのもとに、C言語で開発している。
アーキテクチャーはこんな感じ(笑)

もちろん、Pythonも使わないとならないところでは使っているけど
例えば、linux の top コマンドで確認し見るとよい。
pythonがどれだけCPU負荷をかけるのか?

ロボット制御システム
RDCS  僕が開発した、汎用のロボット制御システム
数百人の人、数百台のロボットが、数百の仕事を、数百の場所で協調分散しながら、
安全第一に行う為の基本プラットフォームと、
自律搬送、pickingなどの制御システムなどで構成されている

7月位にAGV部分は切り出して、Amazonで販売しようと計画中
駆動系のドライバーの追加により、どのような搬送機器もロボット化可能

この中は複雑で、SLAMや、4次元のMappingシステムが実装されていたり
良く説明できませんが、自律走行に必要な機能の塊ね。

C言語で記述、APIはC言語、python
  RDCSとは(6年前の投稿)---> What's RDCS

1.ハードウェア

1.1 ベース車体

某社のCAN制御可能なクローラ。もともとは除雪機なのだぁ。
積載重量
傾斜20度:130Kg
平地:200Kg

1.2 コントローラ

Raspberry Pi 3B+ (メイン) + 用途に応じた性能のRaspberry Pi

1.3 システム通信(CAN Ver 2.0)

CANネットワークを2系統制御する。
・駆動系CAN
駆動系を制御するCANネットワーク。仕様は駆動系メーカの仕様に準拠する。
・RDCS CANネットワーク
RDCS内の通信を制御するネットワーク。
ロボット内に複数のRaspberry Piを搭載し、協調分散処理が可能となる。

PICAN DUO  Rev 01/16
MCP2515  このようなモノ

1.4 車体制御

センサー制御ボード (クローラ側センサーを始動位置/走行位置にする為の工作)
ロボット制御側CANネットワーク通信基板

1.5 稼働状態を外部から確認可能なデバイス

FULL Color LED 2個
16x2 桁 LCD

1.6 操作デバイス

スマフォ
Joystick  (bluetooth接続)

1.7 センサー系

GPS (マゼランジャパン社製のGPSを借用。今後は秋月で売っているモノでOK)
Lidar(主にAGV用)
Intel D4351 (ToFセンサー)
Intel T265(自己位置推定)
ステレオカメラ(今後は不使用の予定)
VL53X0L(衝突防止センサー)
積載重量センサー
基準点センサー(AGVにおいて、作業空間の基準点になるもの)

1.8 Edge Device

Movidius または、Coral (検証中)

1.9 通信

Wifi
Bluetooth
920MHz帯通信 (マルチホップ通信)

2.ソフト

2.1 自律走行システム

前述「ロボット制御システム」参照

2.2 Raspberry Pi OS

Rasbian Stretch
Raspberry Piに最も最適化されたOS。
いろいろなOSでテストしたけどパフォーマンが最も高い。
本当は、ArchLinuxに期待してたけど、Rasbianにはかなわない。

・service (/lib/systemd/system)
lighttpd.service

・service (/etc/systemd/system)
pigpiod.service
hndjs.service
rdcs_joystick.service
rdcs_if_01.service

・/etc/rc.local
home/pi/prj/hnd/bin/setcan.sh

2.3 各種ソフト

個別にインストールする必要があるソフト

・インストール基本
/home/pi/rdcs/bin , src, etc
/var/www/api/rdcs/v1/bin, etc. tmp

・環境変数
~/.bash_profile
RDCS=/home/pi/prj/rdcs
export PATH=".:$RDCS/bin:/home/pi/bin:/home/pi/.pyenv/bin:$PATH"$

・CAN関連
システムの中では、C言語で制御している
PICAN DUO  : 2系統のCANネットワークを制御する
MCP2515  : RDCSのCANネットワークノード。120Ωでターミネーター両端設定

・pigipio
システムの中では、C言語 + python (非同期処理)で開発している
PWM制御をすためのユーティリティ。Raspberry Piでは最も性能が良い。
インストールは、sudo apt install pigpio

・HTTP通信
C言語で開発している。
lighttpd 軽量高速なWebサーバを使って外部から制御可能
インストール

・深層学習
Python + C++言語で開発している
Tensorflow
インストールはネットで最新情報を探してください。

・画像処理
OpenCV 4.0
システムの中では、C++ & C言語で開発している
インストール

・Lidar
システムの中では、C言語で制御している
インストール

・Full Color LED
システムの中では、C言語で制御している
インストール

・16x2 LCD
システムの中では、C言語で制御している
インストール

・Bluetoothとjoystick
システムの中では、C言語で制御している

インストールと設定、確認
sudo apt-get install joystick
sudo apt-get install -y pi-bluetooth
sudo apt-get install libbluetooth-dev
sudo apt-get install joystick
sudo apt-get install jstest-gtk

bluetoothctl
scan on
scan off
pair XXXXXXXXXXXXX
trust XXXXXXXXXXXXX
show
info
exit

3.クラウド

3.1 インターネット上にクラウド
それを経由して全世界にあるロボットを制御することが可能。
そしてそれらのデータを再活用することができる。

3.2 ローカルサーバ

企業によってはクラウド接続が許されない場合がある。
その場合にはローカルサーバを設置して運用を行う。
また同一企業内ならローカルサーバを接続し様々な情報の共有も可能となる。

4.連動システム(利用者の目的)

4.1 倉庫管理システム

深層学習を活用したUIに、Android スマフォン を使うシステム
実在庫誤差3%以下を目指して、受け入れから払い出しまで一貫した
処理を提供する。またAGVと連動して、さらなる効率化を図る。

DBは、Raspberry Pi 3B+、DBはMariaDB。

少しづつ追記します。
いろいろ開発したなぁ。。。

Peace!!

軽量高速Webサーバ lighttpd 1.4.54 を一発でbuild & installする スクリプト

lighttpd 1.4.54 を一発で、僕の環境用にBuild, インストールします。
ヒアドキュメントのエスケープシーケンスは'\'でした。

lighttpd 最新版のチェックはしてください。
URLは、こちら

Peace!!



#!/bin/bash

HOME=/home/pi
VER=1.4.54

if [ -e $HOME/tmp ]; then
    cd $HOME/tmp
else
    mkdir $HOME/tmp
    cd $HOME/tmp
fi

##########################
# 1. build lighttpd
##########################
wget https://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-$VER.tar.gz
tar xvf lighttpd-$VER.tar.gz
cd  lighttpd-$VER
sudo apt-get -y install libpcre3-dev bzip2 libbz2-dev
./configure
make
sudo make install
sudo ldconfig

##########################
# 2. setup config
##########################
sed -i -e "s/srv/var/g" doc/config/lighttpd.conf
sed -i -e "s/server.use-ipv6/\#server.use-ipv6/g" doc/config/lighttpd.conf
sed -i -e "s/server.username  = \"lighttpd\"/server.username  = \"www-data\"/g" doc/config/lighttpd.conf
sed -i -e "s/server.groupname = \"lighttpd\"/server.groupname = \"www-data\"/g" doc/config/lighttpd.conf
sed -i -e "s/server_root + \"\/htdocs\"/server_root/g" doc/config/lighttpd.conf

sed -i -e "s:\#include \"conf.d/cgi:include \"conf.d/cgi:g" doc/config/modules.conf

sudo mkdir /etc/lighttpd
sudo cp doc/config/lighttpd.conf /etc/lighttpd
sudo cp doc/config/modules.conf /etc/lighttpd
sudo cp -r doc/config/conf.d /etc/lighttpd
sudo mv /etc/lighttpd/conf.d/cgi.conf /etc/lighttpd/conf.d/cgi.conf.org

cat << EOF > /tmp/cgi.conf
#######################################################################
##
##  CGI modules
## ---------------
##
## See https://redmine.lighttpd.net/projects/lighttpd/wiki/docs_modcgi
##
server.modules += ( "mod_cgi" )

##
## Plain old CGI handling
##
## For PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini.
##
#cgi.assign                 = ( ".pl"  => "/usr/bin/perl",
#                               ".cgi" => "/usr/bin/perl",
#                               ".rb"  => "/usr/bin/ruby",
#                               ".erb" => "/usr/bin/eruby",
#                               ".py"  => "/usr/bin/python" )
#
##
## to get the old cgi-bin behavior of apache
##
## Note: make sure that mod_alias is loaded if you uncomment the
##       next line. (see modules.conf)
##
#alias.url += ( "/cgi-bin" => server_root + "/cgi-bin" )
alias.url += ( "/api" => server_root + "/api" )
\$HTTP["url"] =~ "^/api" {
   cgi.assign = ( "" => "" )
}
############################
############################
EOF

sudo cp /tmp/cgi.conf /etc/lighttpd/conf.d

##########################
# 3. setup systemd
##########################
sudo mkdir /var/log/lighttpd
sudo chown www-data:www-data /var/log/lighttpd

cp  doc/systemd/lighttpd.service  doc/systemd/lighttpd.org
sed -i -e "s/sbin/local\/sbin/g" doc/systemd/lighttpd.service
sudo cp doc/systemd/lighttpd.service /lib/systemd/system
sudo systemctl enable lighttpd.service
sleep 1
sudo systemctl start lighttpd.service

##########################
# 3. test lighttpd
##########################
sudo mkdir /var/www
sudo mkdir /var/www/api

cat << EOF > index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>lighttpd alive</title>
</head>
<body>
<p>lighttpd server success.</p>
</body>
</html>
EOF

sudo cat << EOF > tst.c
#include <stdio.h>
void main(){
    printf("Content-type: text/plain\n\n");
    printf("Hello, World!");
    return;
}
EOF

gcc tst.c -o tst

sudo mv index.html /var/www
sudo mv tst.c /var/www/api
sudo mv tst /var/www/api
sudo chown -R www-data:www-data /var/www

exit 0