2020年1月3日金曜日

国際ロボット展に出展しました

2019年12月18日~ 東京ビックサイトで開催された国際ロボット展に出展しました。

サービスロボットゾーンの奥の角に2ブース
展示したのは、
低速度自律走行コントローラ
19.8万円のATVキット
AGVキットの応用例
等々

で、、、、、
大変なことに、

で、、、、、
AGVキットやりきろう!!!と決心しました。

「人が運ぶ」を無くす

この目標を掲げて邁進します。

どうぞよろしくお願い致します。

蒲谷直樹@フューチャアグリ株式会社






2019年10月5日土曜日

Raspberry Pi 開発をVMwareで行う

標題のまんまですが、、、
Raspberry Piを同じ環境を作れるので、大変便利です。


Desktopの表示サイズの設定は、下記のツールで行う。
デフォルトのままは、800 x 600
Raspberry Pi > Preferences > Screen Configuration

ネットワーク設定は、NATで構築
Windowsのアダプターは、VMnet8
VMware側の設定は、このツールでおなう。
編集 > 仮想ネットワークエディター


こんな感じ

ホストオンリーに印がついているのは、既にNAT接続しているので、NAT一つ制限の為にこのような表示になっている。
最初の設定の時はNATを指定している。

Peace!!

2019 国際ロボット展に出展します

僕、国際ロボット展に出展します。12 月 18日(水)~21日(土)

サービスロボットゾーンです。

僕でなくて、フューチャアグリ株式会社です。(笑)

内容は、

低速度自律走行UNIT

低コスト自律走行AGV

不整地自律走行ロボット

その他、いろいろ

是非、お越しください。

Peace!!



2019年9月9日月曜日

Build TensorFlow Lite on Raspberry Pi 4

TesorFlow Lite Raspberry Pi 用の libtensorflow-lite.a を作る
TensorFlowの当該のページ通りにすればよい。
他のページは見ない方が良い
About 40 minutes.

Build TensorFlow Lite for Raspberry Pi

cd ~/prj
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
./tensorflow/lite/tools/make/download_dependencies.sh
./tensorflow/lite/tools/make/build_rpi_lib.sh
ls -al tensorflow/lite/tools/make/gen/rpi_armv7l/lib
   drwxr-xr-x 2 root root     4096 Sep  9 02:32 .
   drwxr-xr-x 5 root root     4096 Sep  9 02:32 ..
   -rw-r--r-- 1 root root 12164884 Sep  9 02:32 benchmark-lib.a
   -rw-r--r-- 1 root root  5796642 Sep  9 02:32 libtensorflow-lite.a

上記のページでは
tensorflow/lite/tools/make/gen/lib/rpi_armv7/libtensorflow-lite.a
ちょっと違う(笑)

Peace!!

Build Bazel(0.29.0) on Raspberry Pi 4

Bazel 0.26.0, 0.29.0のbuildです。

1.準備

sudo apt install openjdk-8-jdk

jdk は下記では8がサポート対象となっている
8にしないとエラーが発生する。このような対応不能なエラーが発生した。
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (g1ConcurrentMark.cpp:1666), pid=5210, tid=5234
#  fatal error: Overflow during reference processing, can not continue. Please increase MarkStackSizeMax (current value: 2097152) and restart.
#
# JRE version: OpenJDK Runtime Environment (11.0.3+7) (build 11.0.3+7-post-Raspbian-5)

https://docs.bazel.build/versions/master/install-compile-source.html

もし違う場合には、確認して変更またはインストールする
下の例は0だったので、2に変更した後に、再度確認した画面
sudo update-alternatives --config javac

There are 2 choices for the alternative javac (providing /usr/bin/javac).



  Selection    Path                                          Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-11-openjdk-armhf/bin/javac   1111      auto mode
  1            /usr/lib/jvm/java-11-openjdk-armhf/bin/javac   1111      manual mode
* 2            /usr/lib/jvm/java-8-openjdk-armhf/bin/javac    1081      manual mode

Press <enter> to keep the current choice[*], or type selection number:

2. ソースのダウンロード

mkdir ~/prj/bazel;cd ~/prj/bazel
$ wget https://github.com/bazelbuild/bazel/releases/download/0.29.0/bazel-0.29.1-dist.zip
$ unzip bazel-0.29.0-dist.zip

3. build前の設定と変更

環境変数追加
$ EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk"

2つのファイルを変更
compile.sh
before
bazel_build "src:bazel_nojdk${EXE_EXT}" \
  --action_env=PATH \
  --host_platform=@bazel_tools//platforms:host_platform \
  --platforms=@bazel_tools//platforms:target_platform \
  || fail "Could not build Bazel"

after
bazel_build "src:bazel_nojdk${EXE_EXT}" \
  --host_javabase=@local_jdk//:jdk \
  --action_env=PATH \
  --host_platform=@bazel_tools//platforms:host_platform \
  --platforms=@bazel_tools//platforms:target_platform \
  || fail "Could not build Bazel"

scripts/bootstrap/compile.sh
before
  run "${JAVAC}" -classpath "${classpath}" -sourcepath "${sourcepath}" \
      -d "${output}/classes" -source "$JAVA_VERSION" -target "$JAVA_VERSION" \
      -encoding UTF-8 ${BAZEL_JAVAC_OPTS} "@${paramfile}"

after
  run "${JAVAC}" -classpath "${classpath}" -sourcepath "${sourcepath}" \
      -d "${output}/classes" -source "$JAVA_VERSION" -target "$JAVA_VERSION" \
      -encoding UTF-8 ${BAZEL_JAVAC_OPTS} "@${paramfile}" -J-Xmx1024M

で、Go!!!
time comple.sh

この文字列が出ればOK
Build successful! Binary is here: /home/pi/tmp/output/bazel

次にコピーして完了
sudo cp output/bazel /usr/local/bin

tころで、こんなエラーがでた。
これは、上記の一番目の変更をしなかったから。。。
ERROR: /tmp/bazel_SwJ5aUhR/out/external/bazel_tools/tools/jdk/BUILD:492:14: Configurable attribute "actual" doesn't match this configuration: Could not find a JDK for host execution environment, please explicitly provide one using `--host_javabase.`

Peace!!

2019年8月31日土曜日

OpenCV4 Stereo matching

Stereo matchingは古くからある重要な手法。
僕も、いろいろな場面で使っている。
OpenCV4をセットアップしたあと、cpp ディレクトリーに移動

g++  `pkg-config opencv4 --cflags --libs` stereo_match.cpp -o stereo_match -std=c++11 -latomic

stereo_match ../data/aloeL.jpg ../data/aloeR.jpg --algorithm=sgbm --blocksize=3 --max-disparity=128

こんな感じでbuild とコンパイル

で、いろいろパラメータ変えるとこんな感じ


更にフィルターをかけて、、

 pip3 install scikit-learn
 sudo apt install python3-sklearn

import numpy as np
from sklearn.preprocessing import normalize
import cv2

print('loading images...')
imgL = cv2.imread('../data/aloeLs.jpg')  # downscale images for faster processing if you like
imgR = cv2.imread('../data/aloeRs.jpg')

# SGBM Parameters -----------------
window_size = 3
left_matcher = cv2.StereoSGBM_create(
    minDisparity=0,
    numDisparities=80,
    blockSize=1,
    P1=8 * 3 * window_size ** 2,
    P2=32 * 3 * window_size ** 2,
    disp12MaxDiff=1,
    uniquenessRatio=15,
    speckleWindowSize=0,
    speckleRange=2,
    preFilterCap=63,
    mode=cv2.STEREO_SGBM_MODE_SGBM_3WAY
)
right_matcher = cv2.ximgproc.createRightMatcher(left_matcher)

# FILTER Parameters
lmbda = 80000
sigma = 1.2
visual_multiplier = 1.0
wls_filter = cv2.ximgproc.createDisparityWLSFilter(matcher_left=left_matcher)
wls_filter.setLambda(lmbda)
wls_filter.setSigmaColor(sigma)

print('computing disparity...')
displ = left_matcher.compute(imgL, imgR)  # .astype(np.float32)/16
dispr = right_matcher.compute(imgR, imgL)  # .astype(np.float32)/16
displ = np.int16(displ)
dispr = np.int16(dispr)
filteredImg = wls_filter.filter(displ, imgL, None, dispr)  # important to put "imgL" here!!!

filteredImg = cv2.normalize(src=filteredImg, dst=filteredImg, beta=0, alpha=255, norm_type=cv2.NORM_MINMAX);
filteredImg = np.uint8(filteredImg)
cv2.imshow('Disparity Map', filteredImg)
cv2.waitKey()
cv2.destroyAllWindows()

Peace!!


stm1 imgKittyl.bmp imgKitty.bmp  --algorithm=sgbm --blocksize=1 --max-disparity=64


stm1 imgKittyl.bmp imgKitty.bmp  --algorithm=sgbm --blocksize=1 --max-disparity=80

stm1 imgKittyl.bmp imgKitty.bmp  --algorithm=sgbm --blocksize=9 --max-disparity=64


2019年8月21日水曜日

Oracle SQL*Plus。MinGW32は癖がある (笑)

Oracle SQL*Plusを使うなんて20年ぶり
Windows環境で実行させて、結果をLinux環境に送り別の処理をする。

例えば、前日に新規登録されたデータだけを、翌日に抽出する場合。
Linux環境では、localtime_rで比較的簡単に日付指定の文字列を作れる。
ところが、Windows環境のMinGWは基本的にWindowsに依存しているので、
同じgccを使っても、localtime*は使用できない。
gccでも、違うんだぁ

Msys MinGWは、その環境で作った実行モジュールをWindowsのコマンドプロンプトで実行できない。
それをするなら、MinGWだけをインストールする必要がある。
MinGW | Minimalist GNU for Windows

でも、MinGWはWindowsに依存しているのでLinuxとの違いが発生する。
多分、今回のlocaltime*だけだと思うけど、、、

まぁ、やるといろいろ起こります。勉強勉強

で、今回のソースをドーンと

Peace!!


SQL*Plusを起動するバッチ

@ECHO OFF
:START
ECHO ---------------------------------------------------
ECHO 前日新規に登録された品目情報を出力します。
ECHO ---------------------------------------------------
CD %~dp0
DEL hinsabun.csv
hinsabun.exe > hinsabun.sql
@ECHO SQLを実行中です。しばらくお待ち下さい..
@ECHO -------------------------------
sqlplus /nolog @"hinsabun.sql" USER PASSWORD 192.168.XXX.XXX/ORCL
@ECHO -------------------------------
@ECHO 完了しました。
EXIT

localtime_r を使わない処理

#include <stdio.h>
#include <string.h>
#include <time.h>

#define PRS(A)  printf("%s\n", A)
char    *mn[]= {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

int main(int argc, char* argv[]){
    char    szTime[15];
    char    szBuf[256], szBuf1[64];
    char    szMn[4], szDmy[10];
    int     n = 1, iDay, i, iMn, iYr;
    struct tm tm;
    time_t t;
    
    time(&t);
    t -= (86400 * n);
    strcpy(szBuf1, ctime(&t));
    strcpy(szDmy, strtok(szBuf1, " "));
    strcpy(szMn, strtok(NULL, " "));
    iDay = atoi(strtok(NULL, " "));
    strcpy(szDmy, strtok(NULL, " "));
    iYr = atoi(strtok(NULL, " "));
    for (i = 0; i < 12; i++) {
        if (strcmp(szMn, mn[i]) == 0){
            iMn = i + 1;
            break;
        }
    }
    sprintf(szTime, "%04d%02d%02d", iYr, iMn, iDay);

    //localtime_r(&t, &tm);
    //sprintf(szTime, "%04d%02d%02d%02d%02d%02d",
    //        tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
    //        tm.tm_hour, tm.tm_min, tm.tm_sec);
    //sprintf(szTime, "%04d%02d%02d",
    //          tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
    
    PRS("connect &&1/&&2@&&3");
    PRS("spool off");
    PRS("set echo off");
    PRS("set heading off");
    PRS("set termout off");
    PRS("set pause off");
    PRS("set pagesize 0");
    PRS("set linesize 10000");
    PRS("--set trimout on");
    PRS("set trimspool on");
    PRS("set feedback off");
    PRS("set verify off");
    PRS("set colsep '|'");
    PRS("spool hinsabun.csv");
    sprintf(szBuf, "SELECT ITEM_CD, ITEM_DIV, ITEM_NAME1, ITEM_NAME2, STD_UNIT, STD_UNITPRICE, UNIT2, UNIT_CONV_RATE,ITEM_NAME4,REGIST_DATE, UPDATE_DATE from DFW_M040M where REGIST_DATE >= to_date('%s', 'yyyymmdd');", szTime);
    PRS(szBuf);
    PRS("spool off");
    PRS("exit");
    
    return 0;
}

Peace!!