とっても、忙しくて更新する事ができませんでした。
開発している事、日々思う事を、また書いていきます。
よかった、読んでください。
ロボット使ってトマト作れば楽だなぁ...やってみっか!
農業ロボット開発記録
日本中で100台以上動かしちゃった(^^)/
I'm developing robots that do tomato harvesting, settled planting ,,,,and many tasks.
The goal of production cost of robot is $2,000 per unit.
Because it is necessary a lot of robots, in order to innovate the farming.
I use Raspberry Pi as robot controller to develop low cost robots.
TOMATO FARM website -> CLICK!
なんと、、、
絶望的になりながら、、、這いつくばって解決のメモ
このバージョンのお話
implementation 'com.google.firebase:firebase-ml-vision
結局、build.gradleの
// ML Kit dependencies
implementation 'com.google.firebase:firebase-ml-vision:'
// Image Labeling model.
implementation 'com.google.firebase:firebase-ml-vision-image-label-model:20.0.2'
// Face model
implementation 'com.google.firebase:firebase-ml-vision-face-model:20.0.2'
// Custom model
implementation 'com.google.firebase:firebase-ml-model-interpreter:'
// Object model
implementation 'com.google.firebase:firebase-ml-vision-object-detection-model:19.0.6'
// AutoML model
implementation 'com.google.firebase:firebase-ml-vision-automl:18.0.6'
implementation 'com.google.firebase:firebase-ml-common:22.1.2'
implementation 'com.google.android.gms:play-services-vision-common:19.1.3'
implementation 'com.google.firebase:firebase-core:20.0.1'
を、変更して
// ML Kit dependencies
//implementation 'com.google.firebase:firebase-ml-vision:'
// Image Labeling model.
implementation 'com.google.firebase:firebase-ml-vision-image-label-model:20.0.2'
// Face model
implementation 'com.google.firebase:firebase-ml-vision-face-model:20.0.2'
// Custom model
//implementation 'com.google.firebase:firebase-ml-model-interpreter:'
// Object model
implementation 'com.google.firebase:firebase-ml-vision-object-detection-model:19.0.6'
// AutoML model
implementation 'com.google.firebase:firebase-ml-vision-automl:18.0.6'
implementation 'com.google.firebase:firebase-ml-common:22.1.2'
implementation 'com.google.android.gms:play-services-vision-common:19.1.3'
implementation 'com.google.firebase:firebase-core:20.0.1'
OKになりました。つまり、、、
https://firebase.google.com/docs/android/setup?hl=ja
自動的にアップデートして非推奨ライブラリーが残っており、かつ完全な構文でなかったので、エラー
で、も、、、、上部のエラーがなくなっただけ
実はこのファイルの、エラーが発生しても、値を設定して、依存関係を定義する
// ML Kit dependencies
implementation 'com.google.firebase:firebase-ml-vision:24.1.0'
// Custom model
implementation 'com.google.firebase:firebase-ml-model-interpreter:22.0.4'
// ML Kit dependencies
implementation 'com.google.firebase:firebase-ml-vision:24.1.0'
// Image Labeling model.
implementation 'com.google.firebase:firebase-ml-vision-image-label-model:20.0.2'
// Face model
implementation 'com.google.firebase:firebase-ml-vision-face-model:20.0.2'
// Custom model
implementation 'com.google.firebase:firebase-ml-model-interpreter:22.0.4'
// Object model
implementation 'com.google.firebase:firebase-ml-vision-object-detection-model:19.0.6'
// AutoML model
implementation 'com.google.firebase:firebase-ml-vision-automl:18.0.6'
implementation 'com.google.firebase:firebase-ml-common:22.1.2'
implementation 'com.google.android.gms:play-services-vision-common:19.1.3'
implementation 'com.google.firebase:firebase-core:20.0.1'
これで、sync はOK!
でも、、、
Unsupported class file major version 61
% java --version
openjdk 17.0.1 2021-10-19
OpenJDK Runtime Environment (build 17.0.1+12-39)
OpenJDK 64-Bit Server VM (build 17.0.1+12-39, mixed mode, sharing)
とりあえず、確認のためにに、下記のコードでテスト
build は、こんな感じ
gcc -Wall -o tst tst.c -lmysqlclient -L/usr/lib64/mysql/
サンプルは以下、、、
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
int main(void){
MYSQL *conn = NULL;
MYSQL_RES *resp = NULL;
MYSQL_ROW row;
char sql_str[255];
char *sql_serv = "localhost";
char *user = "xxxxx";
char *passwd = "yyyyyy";
char *db_name = "dddd";
memset( &sql_str[0] , 0x00 , sizeof(sql_str) );
// mysql接続
conn = mysql_init(NULL);
if( !mysql_real_connect(conn,sql_serv,user,passwd,db_name,0,NULL,0) ){
// error
printf(" connect error\n");
exit(-1);
}
// クエリ実行
snprintf( &sql_str[0] , sizeof(sql_str)-1 , "select * from test" );
if( mysql_query( conn , &sql_str[0] ) ){
// error
mysql_close(conn);
exit(-1);
}
// レスポンス
resp = mysql_use_result(conn);
while((row = mysql_fetch_row(resp)) != NULL ){
printf( "%d : %s\n" , atoi(row[0]) , row[1] );
}
// 後片づけ
mysql_free_result(resp);
mysql_close(conn);
return 0;
}
開発環境をつくりたいので、、、
sudo dnf install mariadb-devel
Last metadata expiration check: 2:57:12 ago on Sun Dec 5 19:09:59 2021.
Error:
Problem: package mariadb-devel-3:10.3.28-1.module+el8.4.0+427+adf35707.x86_64 requires mariadb-connector-c-devel >= 3.1.11, but none of the providers can be installed
- package mariadb-connector-c-devel-3.1.11-2.el8_3.i686 requires libmariadb.so.3, but none of the providers can be installed
- package mariadb-connector-c-devel-3.1.11-2.el8_3.x86_64 requires mariadb-connector-c = 3.1.11-2.el8_3, but none of the providers can be installed
- package MariaDB-shared-10.6.3-1.el8.x86_64 obsoletes mariadb-connector-c provided by mariadb-connector-c-3.1.11-2.el8_3.i686
- package MariaDB-shared-10.6.3-1.el8.x86_64 obsoletes mariadb-connector-c provided by mariadb-connector-c-3.1.11-2.el8_3.x86_64
- problem with installed package MariaDB-shared-10.6.5-1.el8.x86_64
- package MariaDB-shared-10.6.4-1.el8.x86_64 obsoletes mariadb-connector-c provided by mariadb-connector-c-3.1.11-2.el8_3.i686
- package MariaDB-shared-10.6.4-1.el8.x86_64 obsoletes mariadb-connector-c provided by mariadb-connector-c-3.1.11-2.el8_3.x86_64
- package mariadb-devel-3:10.3.28-1.module+el8.4.0+427+adf35707.x86_64 conflicts with mysql-devel provided by MariaDB-devel-10.6.5-1.el8.x86_64
- conflicting requests
- package MariaDB-shared-10.6.5-1.el8.x86_64 obsoletes mariadb-connector-c provided by mariadb-connector-c-3.1.11-2.el8_3.i686
- package MariaDB-shared-10.6.5-1.el8.x86_64 obsoletes mariadb-connector-c provided by mariadb-connector-c-3.1.11-2.el8_3.x86_64
- installed package MariaDB-shared-10.6.5-1.el8.x86_64 obsoletes mariadb-connector-c provided by mariadb-connector-c-3.1.11-2.el8_3.i686
- installed package MariaDB-shared-10.6.5-1.el8.x86_64 obsoletes mariadb-connector-c provided by mariadb-connector-c-3.1.11-2.el8_3.x86_64
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
エラー、、、、
いろいろ探して、、、
$ sudo dnf -y install MariaDB-devel ;
Last metadata expiration check: 2:57:42 ago on Sun Dec 5 19:09:59 2021.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Installing:
MariaDB-devel x86_64 10.6.5-1.el8 mariadb 7.9 M
Transaction Summary
================================================================================
Install 1 Package
Total download size: 7.9 M
Installed size: 49 M
Downloading Packages:
MariaDB-devel-10.6.5-1.el8.x86_64.rpm 2.8 MB/s | 7.9 MB 00:02
--------------------------------------------------------------------------------
Total 2.8 MB/s | 7.9 MB 00:02
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Running scriptlet: MariaDB-devel-10.6.5-1.el8.x86_64 1/1
Installing : MariaDB-devel-10.6.5-1.el8.x86_64 1/1
Running scriptlet: MariaDB-devel-10.6.5-1.el8.x86_64 1/1
Verifying : MariaDB-devel-10.6.5-1.el8.x86_64 1/1
Installed:
MariaDB-devel-10.6.5-1.el8.x86_64
Complete!
僕は、日本中で動いているロボットを統合的にシステム管理している。これをRDCS Serverと呼んでいる。実体は某社のVPS上に構築している。
ところが、、、
CentOS 8 のサポートが、12月31日に終了という事で、移行の必要性があった。いろいろ調査した結果、Rocky Linuxに移行することにした。というか、、、Google、Microsoft、Amazonが支持をしているからが大きい。安易だなぁ、、、
また、これまで、自作DBで管理していたけど、思ったより管理データが多くなってきたので使い慣れているMariaDBに移行する事も決めた。
これは簡単で、Rocky Linuxが提供しているツールで10分程度で終了。
How to Migrate to Rocky Linux from CentOS Stream, CentOS, Alma Linux, RHEL, or Oracle Linux
MariDBは、下記のページの通りにする。
How to Install MariaDB on Rocky Linux 8
ここに書いてあるように、defaultのままでインストールすると10.3がインストールされる。現在の最新版は10.6なので記述してあるようにインストールする。
この説明は、丁寧な説明なのでこの通りにすれば良い。
すんなりすんで、よかったです。
インストール直後は、設定が行われていない。
文字コードを、utf8mb4 に設定する。 詳しくはこちら
手順の抜粋
「mysql -u root -p」でMariaDBにログインします。
定期的にロボットの状態を把握したいので、遅ればせながらTwitterで確認できるようにした。その時の忘備録
既にある、または新しいアカウントで行う。今回は公開したく無いので新しいアカウントを作成した。
ネットの情報の通りに、https://apps.twitter.com/ にアクセスして開発者登録する。
その後、Developer Portalで、追加情報を入力した。実は、この部分がネットの情報と違った。
でも作業は同じなので、後から同じことをできるようにメモしておく。
In your words
In English, please describe how you plan to use Twitter data and/or APIs. The more detailed the response, the easier it is to review and approve.
ここには英語で何をするのかを記述する。最低でも200文字が必要
僕は、複数種類のロボットの開発をしている。それらのロボットの状態を統合的に管理する必要がある。ロボットを統合管理するサーバーが、自動的に15分毎にロボット達の状態を集約して、ツイートする。そのツイートにより効率的に全体が把握できる
I am developing multiple types of robots. It is necessary to manage the state of those robots in an integrated manner. The server that manages the robots in an integrated manner automatically aggregates the states of the robots every 15 minutes and tweets them. You can grasp the whole efficiently by the tweet.
Are you planning to analyze Twitter data?
Will your app use Tweet, Retweet, Like, Follow, or Direct Message functionality?
Please describe your planned use of these features.
The application uses the tweet function. The robot management system aggregates and tweets every 15 minutes.
Do you plan to display Tweets or aggregate data about Twitter content outside Twitter?
これはNo
Will your product, service, or analysis make Twitter content or derived information available to a government entity?
これも、No
NEXTボタンを押下する。すると下の画面
次に、Keyデータを取得する。
API Key and Secret Regenerateボタンを押下
これで準備OK
sudo pip3 install twython
確認は、、、
python3 -c "import twython"
vi auth.py
consumer_key = 'API Key'
consumer_secret = 'API Key Secret'
access_token = 'Access Token'
access_token_secret = 'Access Token Secret'
vi tst.py
from twython import Twython
from auth import (
consumer_key,
consumer_secret,
access_token,
access_token_secret
)
twitter = Twython (
consumer_key,
consumer_secret,
access_token,
access_token_secret
)
message = "100-100-101"
twitter.update_status(status=message)
print("Tweeted: " + message)
これで実行したらOKです。
ちなみに同じメッセージを繰り返すとエラーになる。
twython.exceptions.TwythonError: Twitter API returned a 403 (Forbidden), Status is a duplicate.
Peace!!
これは良いコラムで、これを読むと表題の事がわかる
https://jp.reuters.com/article/column-daisaku-ueno-idJPKBN2HV31K
MacからRaspberry Piにsshで入ると、接続状態が悪くなり、じきにこのメッセージが表示され接続途絶える。
がネット探すと、この問題の解決策がいろいろでている。
多くは、~/.ssh/config に
Host *
ServerAliveInterval 60
TCPKeepAlive yes
このおまじないを加える。
でも、足りないみたいで、結局行き着いた先は、
Host *
ServerAliveInterval 60
TCPKeepAlive yes
IPQoS=lowdelay
こんな感じ。
これで、Macのターミナルからのssh, AtomのFtp-Remote-Editもストレスフリーになった。
でも、このおまじないをしなくても、FileZillaで接続した時は問題なかった。
という事は、MacとAtom(package)の実装の問題。
忘備録
(1) 一枚複製
Raspberry Pi desktop のSDカードコピーツールを使って行なう
(2) 複数枚作成
今まで使っていたWin32diskImager が何故か? 起動しなくなったのでMacで、、、
・元になるSDカードのimageをMacのdisk のコピーする
diskutil list
diskutil umountDisk /dev/disk2
sudo dd if=/dev/rdisk2 of=dev11080_YYYYMMDD.img bs=1m
・複製
mac にRaspberry Piの 'Raspberry Pi imager'をRaspberry Piの本家よりダウンロード
このツールで複数枚のSDカードを作成する
Peace!!
あくまでも、僕の場合
風の歌を聞け
1973年のピンボール
羊をめぐる冒険
初期の3部作。特に上の2作を読んだ時は、自分の中の「本当はこうしたいんだ」と思っている、もう1人の自分と出会った様で吸い込まれる様に、その本の空間に入り混んだ
羊をめぐる冒険は、ピンクの羊が大学時代に付き合っていた、新宿の文化服装学院でデザイナーを目指していた、とんがったちょっと変わった彼女と重なり、もう1人の自分ではなく、その彼女と本の空間の中でデートしているようだった。
その後の作品も、ノルウェーの森までは、作品の空間を共有できた。村上春樹の作品の空間で、現実社会で生きざるおえない自分の中から、本当らしい’僕’が羽を伸ばせる解放感を楽しんでいた。
村上春樹に興味を持ち、彼が好きだという作家の本も読んだ
トルーマン・カポーティ
スコット・フィッツジェラルド
カポーティ、フィッツジェラルドの作品もそれぞれの空間が好きになり、特に彼の空間にある狂気が、自分の隠れていた’僕’の狂気のようで、のめり込んでしまった。
そして、サリンジャー
もちろん、「ライ麦畑でつかまえて」は、読んでいたし、俗世と離れて生活している事も知っていた。
そして
Franny and Zooey
知ってしまった。
バナナボートで、俗世から離れたしまったサリンジャーを、
Frannyのように追う彼の姿を。。。
あとは、少しづつ、続けます。。。
Raspberry Pi上で、自律走行システムの研究開発するのが僕の仕事
通常は、MacからRaspberry Piにssh接続し、FileZIllaの機能でRaspberry Pi内をツリー表示してコードの修正やファイルの転送を行っていた。まぁ、それなりに便利で、特に問題もなく開発をしていた。
FileZillaに登録するeditorはatomを使っていた。ただ、その使い方は単なるeditorでpackageも入れすに、ただeditorとして使っていた。
ネットで「atomのpackage」使うと便利になるというので試しにftp系のpackageをいくつか試してみた。atomにpackageをインストールする時に、"ftp"で検索すると複数のpackageがあり、最もインストールが多かったのは、remote-ftp。正直にいって使いにくい。
次に確かめたのが、ftp-remote-edit
これが僕には、ドンピシャ!!
・登録したserverを階層構造で見れる
・ディレクトリー内のイメージデータも表示できる
・Macから、drag&dropでファイル転送ができる
・Raspberry Piのコマンド画面操作ができる
つまり、以下の2つのアプリケーションでやっていた事が、Atomの画面の中で完結する
・Macターミナル -> ssh
・FileZilla
これは、通常Mac Proで開発してうる僕にはとっても重要で、画面の中に複数のアプリケーションを表示する必要がなく、画面がスッキリし頻繁な画面操作も回避できる。
知ろうとしない事、これはとっても恐ろしい事だ
この歳になって、改めて気づいた。
追加
編集した内容をプリンターに出力する時に使うpackage
print-code
いろいろ出力系のpackage試したけど、他と違ってプリンターのドライバーをきちんと制御しているので現状ではNo1
Peace!!
会社での搬送ロボットのテストは、wifi の電波距離の関係でテストの準備が大変でした。
あっ、単純に中継機で伸ばせばいいじゃん
会社のルータを、中継機にしてもよいけど、搬送ロボットの距離を伸ばしたのでモバイル電源で稼働する中継機を探しました。
車検をオートバイ屋さんに頼むと高いので、ユーザ車検をしました。
初めてなので、いろいろ情報を集めましたが、やはりドキドキでした。
振り返ると、、、
・検査は、意外とアッサリ終わるなぁ
・書類作成は、事務所の例示が理解しやすく、職員の方々も親切
プロしかできないと思っていた、車検のイメージが大きく変わりました。
・申請書類
印紙を購入する所で、書類もあり、かつ印紙も貼って頂けた。
検査場の申請場所では、手続き書類の書き方などの例が分かりやすく、その通りに書けば良い。3枚記述するけど、車検書の内容で、ナンバー、車体番号、氏名、住所を繰り返す
・点検整備記録
インターネットでダウンロードして、自己整備をして記述した。
タイヤの溝、ブレークパッドの厚さなどは計測して記述した。排ガスの濃度などは計測できないので、空欄のままにした。
ポイントは、光軸調整。自分なりにやってみたけど、不安があったので検査場の近くのテスト屋さんで再確認。なるほど、、、と思い、自分のやり方でOKだと思った。
・自賠責保険
印紙購入する所で場所を聞いて、同じ構内にあるその場所に行って購入した。
申請書を渡した後に、指定された場所にバイクに行く。
5分程度待って、新しい車検書、ステッカー、点検整備記録を返してもらい
終了!
受付開始から、40-50分でした。
Peace!!
たくさんの企業さんに、導入頂きブラッシュアップを続けてきました。
貧乏企業なので、型を作ることもできず、レーザーカッターで木製のケース作って何とかまとめています。写真は、僕が開発で使っているモノです。
前面には、ステレオカメラ、背面にはタッチパネルが付いて、とりあえずまとまった感じです。
内部には、フェイルセーフと性能を考えてRaspberry Pi4が2つ入って、さらにAIのエッジデバイス、センサー、LED等々、、、これにモータドライバーをつけて、モータを接続すれば自律走行するわけだけど、、、
まぁ、のちのち詳しく
Peace!!