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.53 を一発でbuild & installする スクリプト

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

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

Peace!!



#!/bin/bash

HOME=/home/pi
VER=1.4.53

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

2019年4月25日木曜日

Raspberry Piで、低コスト Lidar SLAMTEC RPLIDAR A2 を使う

自律走行といえば、SLAM。
SLAMと言えば、Laidr
Lidarと言えば、高い
でも、えええええ、、、という事で、これ!


上を見ればきりがないけど、これで十分

ソフトはここからdownloadし、解凍する。

cd rplidar_sdk-master/sdk
make
cd output/Linux/Release
./ultra_simple


距離はmm単位。正面がtheta 0

次に、
./simple_grabber /dev/ttyUSB0


フフフ、良い感じでしょう(^^)

Peace !

2019年4月24日水曜日

Raspberry Pi と ネットワークプリンターを接続する

なんというか、あまりにもあっさりなので僕自身(@_@)

コマンドラインでやると大変なので、Desktop上からサクッと

1.cusp関連ソフトのインストール
Preference > add/remove software を使って, common unix printing systemをインストールする。

searchで、cuspと入れて検索するとターゲットになるソフトが一覧で現れる




必要なソフトを選択する。ここでドラーバーもインストールしたけど
それをここでするのか、後述でするのか?
僕は、個々でインストールしてしまった。

2.プリンターの選択
Preference > 印刷設定 を開くと下記の画面が出現する。Addを選択する


認証画面が現れるので、既にログインしているユーザのパスワードを入力する。
下記の画面が現れるので、Network Printer を選択すると、
現在ネットワークに接続されているプリンター一覧が現れる。
僕的には、おおおおおって感じで、感動しました。
昔は、プリンター接続するのが大変だったので、、、
対象のプリンターを選択して Forward ボタンを押下。
この時、右ペインの値は選択しない。


この画面が現れ、Print Test Page を押下するとプリンターに出力されます。




Peace !

2019年4月23日火曜日

Raspberry Pi にsamba を設定してwindows7 / 10で共有する

何も考えずにやったら、動かない(笑)

sudo apt-get -y update; sudo apt-get -y upgrade
sudo apt-get install samba
sudo vi /etc/samba/smbd.conf

設定ファイルの最後に追加、ネット見ながら設定

[WareHouseDB2]
   comment = Raspberry Pi
   path = /home/pi/Public
   guest ok = yes
   read only = no
   browsable = no
   force user = pi

sudo systemctl restart smbd

windows PCで、、、
あれ?見えない。

sudo systemctl status smbd

あれ?ない

sudo systemctl enable smbd
sudo systemctl start smbd

さぁ!

あれ?見えない。うーーーん

smbd.conf .....

あっ、、、
browsable = no
これを、
browsable = yes

sudo systemctl restart smbd

おおお!!!

Peace!!

2019年4月22日月曜日

Raspberry Piに lighttpd をインストールするスクリプト

僕の環境でlighttpdを一発で設定するスクリプト。
いくつか投稿しているけど、これが今の最新版。

ただし、/etc/lighttpd 以下は設定しない。
/etc/lighttpdの設定が必要な場合はこちら(step3,step4後半)を参照。

僕は、多数のRaspberry Piを使っている。その為に、PCでRasbianをSDカードを書き込んだ直後に/bootに環境設定用のデータを書き込み、それを最初のRaspberry Pi立上げ時に、シェルスクリプトでインストールする。
その時に、/etc/lighttpdも、設定してしまう。

それを前提にして、こんな感じで処理をする。

#!/bin/bash

HOME=/home/pi
VER=1.4.53

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 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

シェルは、これで終わり

次に確認で、以下の2つをブラウザーから順番に確認
http://192.168.xxx.yyy
http://192.168.xxx.yyy/api/test

これでうまくいけば、OK

Peace!!

2019年4月20日土曜日

合体(I2CキャラクターLCD & Full color LED PL9823 )

ロボット内の状態を外部から確認できるように、
ディスプレーと、LEDは必要
音も必要かなぁ。それは後、、、
まずは、スマフォで確認するよりはユーザに優しい
C言語で書いたから、負荷も最小限。
Pythonではこうはいかない。
性能を考えれば、少しでも軽く、早く!

今は、そういう時代ではないけどね。




Peace !!