いっしきまさひこBLOG

AI・機械学習関連、Web制作関連、プログラミング関連、旅行記録などなど。一色政彦。

ミニぷぱ(Mini Pupper)のPS4版/ROS版のキャリブレーションデータ

ミニぷぱでキャリブレーションをしたとき、のPS4版/ROS版ではデータの保存先が異なります。

PS4版

/home/ubuntu/Robotics/QuadrupedRobot/StanfordQuadruped/calibrate_tool.pyファイルの内容を確認するのが一番良いです。

コードを読むと、Raspberry Pi 4 Model Bボード上のEEPROM(不揮発性メモリ)に格納されています。これにより、PS4版のOSのmicroSDカードを差し替えても、キャリブレーションデータが引き継がれます。

このデータをROS版でも読み取ってくれればよいのですが、ROS版はファイルで管理されているようです。

ROS版

こちらは/home/ubuntu/catkin_ws/src/minipupper_ros/servo_interface/scripts/calibrate.pyファイルの内容を確認してください。

コードを読むと、/home/ubuntu/catkin_ws/src/minipupper_ros/servo_interface/config/calibration/calibration.yamlファイルとして保存されています。よって、ROS版のOSのmicroSDカードを差し替える場合は、このファイルをコピペすれば引き継げるのではないかと思います(やったことがないので不明)。

どちらかに統一してほしいけど、YAMLファイルの方が取り扱いはしやすいですね。

ROS版にはPS4版のようにGUIで作業できるキャリブレーションツールがありません。PS4版のキャリブレーションツールをROS版で使っても、EEPROMに保存されるだけなので意味がありません。キャリブレーションツールのコードは難しく無さそうなので、ROS版用に修正するということも不可能ではないのですが、そこまでするのは面倒なのですよね。

ミニぷぱ(Mini Pupper)ROS版のRaspberry Pi 4 Model BのGPIOピン

非常にニッチだと思いますが、ミニぷぱのROS版のGPIOピンの情報を共有します。

※書く必要もないと思いますが念のため。この記事の通りに実施して何か起きた場合の責任は筆者および本サイトは負いません。自己責任でお願いします。

GPIOピン

ミニぷぱのROS版でGPIOピンがどのように使われているかはコードを追いかけて調べるしかありません(たぶん、資料がなさそうです)。書き方が雑ですが、自分がコード上に書いたものをコピペしたためです。

自分がコードを調べてチェックした限りでは以下のように使われいるようでした。※勘違いや間違いがあるかもしれないので、あくまでヒントとして参照してください。

# - GPIO0 : ID_SD <Serial Data for HAT for EEPROM>
# - GPIO1 : ID_SC <Serial Clock for HAT for EEPROM>
# - GPIO2 : I2C SDA <Inter-Integrated Circuit> <Serial Data>
# - GPIO3 : I2C SCL <Serial Clock>
# - GPIO4 : "[Leg4]Left-Front-Calf" GPCLK0 <General Purpose Clock>
# - GPIO5 : "[Leg4]Left-Front-Thigh" GPCLK1
# - GPIO6 : "[Leg4]Left-Front-Hip" GPCLK2
# - GPIO7 : "[Leg3]Right-Back-Calf" SPI CE0 <Serial Peripheral Interface> <Chip Enable>
# - GPIO8 : "[Leg3]Right-Back-Thigh" SPI CE1
# - GPIO9 : "[Leg3]Right-Back-Hip" SPI MISO <Master In Slave Out>
# - GPIO10: "[Leg2]Left-Fore-Calf" SPI MOSI <Master Out Slave In>
# - GPIO11: "[Leg2]Left-Fore-Thigh" SPI SCLK <Serial Clock>
# - GPIO12: "[Leg2]Left-Fore-Hip" PWM0 <Pulse Width Modulation>
# - GPIO13: "[Leg1]Right-Fore-Calf" PWM1
# - GPIO14: "[Leg1]Right-Fore-Thigh "UART TXD <Universal Asynchronous Receiver Transmitter> <Transmit Data>
# - GPIO15: "[Leg1]Right-Fore-Hip" UART RXD <Receive Data>
# - GPIO16: "Battery Buzzer"
# - GPIO17: 
# - GPIO18: PCM_CLK <Pulse Code Modulation> <PCM Clock>
# - GPIO19: PCM_FS <PCM Frame Sync>
# - GPIO20: PCM_DIN <PCM Data In>
# - GPIO21: "Servo 2 control" PCM_DOUT <PCM Data Out>
# - GPIO22: 
# - GPIO23: 
# - GPIO24: "LCD RST <ReSeT control>"
# - GPIO25: "Servo 1 control"
# - GPIO26: "LCD LED <backlight LED control>" <for input>
# - GPIO27: "LCD DC <Data/Command (NOT MOSI!)>" <for output>

Raspberry Piの40ピン構成:

# 40-pins configuration of Raspberry Pi:
#    3V3  (1) (2)  5V
#  GPIO2  (3) (4)  5V
#  GPIO3  (5) (6)  GND
#  GPIO4  (7) (8)  GPIO14
#    GND  (9) (10) GPIO15
# GPIO17 (11) (12) GPIO18
# GPIO27 (13) (14) GND
# GPIO22 (15) (16) GPIO23
#    3V3 (17) (18) GPIO24
# GPIO10 (19) (20) GND
#  GPIO9 (21) (22) GPIO25
# GPIO11 (23) (24) GPIO8
#    GND (25) (26) GPIO7
#  GPIO0 (27) (28) GPIO1
#  GPIO5 (29) (30) GND
#  GPIO6 (31) (32) GPIO12
# GPIO13 (33) (34) GND
# GPIO19 (35) (36) GPIO16
# GPIO26 (37) (38) GPIO20
#    GND (39) (40) GPIO21

ミニぷぱ(Mini Pupper)のROS版で起動時に鳴かせて顔を表示させる方法

ミニぷぱのROS版を触っていて、少し知見がたまってきています。

非常にニッチだと思いますが、ミニぷぱのROS版をPS4版のように扱えないと感じる人も多いかと思うので、個人的に知っている内容を書いておきます。誰かに役立つといいけど。

※書く必要もないと思いますが念のため。この記事の通りに実施して何か起きた場合の責任は筆者および本サイトは負いません。自己責任でお願いします。

ROS版で起動時に鳴かせる方法

PS4版では起動時に鳴くので起動が分かりやすいです。なぜかROS版では実装してくれていません(もしかしたら最新版では対応済みかもしれません。確認していません)。

鳴き声の音声はこちらにあります: github.com

これを再生するだけです。再生コマンドはmpg123 /home/ubuntu/Music/power_on.mp3にようになります。このコマンド実行を、起動時のrc.localサービスで実行してもらいます: github.com

rc.localファイルは、

  • /home/ubuntu/minipupper_ros_bsp/mangdang/System/rc.local

にあります。私のrc.localファイルの中身は以下のようになっています。個人的にカスタマイズを試しまくっているので元と違うかもしれません。

#!/bin/bash
#
# 1.Initialize power switch and pwm units
# 2.start lcd
#
# Copyright (c) 2020, Mangdang Technology Co., Limited
#
#

#remove bluebooth cache
# sudo rm /var/lib/bluetooth/* -rf
# sleep 2

# get hardware version
# echo 27 > /sys/class/gpio/export
# echo in > /sys/class/gpio/gpio27/direction
# hw_version_io=`cat /sys/class/gpio/gpio27/value`
# echo 27 > /sys/class/gpio/unexport
# if [ "$hw_version_io" == "1" ]; then
#   sudo echo "P1" > /home/ubuntu/.hw_version
# else
#   sudo echo "MP" > /home/ubuntu/.hw_version
# fi

#export pwm channel
for i in $(seq 0 15)
do
    sudo echo $i > /sys/class/pwm/pwmchip0/export
    sudo echo  4000000 > /sys/class/pwm/pwmchip0/pwm$i/period
    sudo chmod  777  /sys/class/pwm/pwmchip0/pwm$i/duty_cycle
done

# init the Bluetooth
# sudo hciattach /dev/ttyAMA0 bcm43xx 115200 noflow -
# sleep 8
# sudo hciattach /dev/ttyAMA0 bcm43xx 115200 noflow -
# sleep 2

# init lcd
#python3 /home/ubuntu/minipupper_ros_bsp/mangdang/LCD/lcd_init.py

# set cpu performance
# Set the Frequency Governor to Performance (run CPU at maximum frequency) which determines the frequency policy. Default is On-Demand
# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
# conservative ondemand userspace powersave performance schedutil が利用可能
echo performance > /sys/bus/cpu/devices/cpu0/cpufreq/scaling_governor

# show wake-up-face (& means background job)
su ubuntu -l -c "python3 /home/ubuntu/minipupper_ros_bsp/mangdang/LCD/wake-up-face.py" &

# play sound (& means background job)
su ubuntu -l -c "mpg123 /home/ubuntu/Music/power_on.mp3" &

exit 0

音声コマンドは最後に実行しているsu ubuntu -l -c "mpg123 /home/ubuntu/Music/power_on.mp3" &ですね。/home/ubuntu/Music/ディレクトリに音声ファイルを配置しました。

このrc.localサービスを有効にするには、以下のコマンドを実行してください。

# Install mangdang wake-up service
cd /home/ubuntu/minipupper_ros_bsp/mangdang/System
sudo bash install.sh
sudo reboot

ROS版で顔を表示させる方法

顔もアニメーションさせたりいろいろとできるのですが、PS4版で動くとアニメーションするようなコードになっていたと思います。それを実装するのは面倒なので、取りあえず起動時にlogo用の顔(黄色と黒色が反転した顔)を表示させるようにしてみましょう。手間を省くため、上記と同じrc.localサービスを利用しました。

上のコードにあるsu ubuntu -l -c "python3 /home/ubuntu/minipupper_ros_bsp/mangdang/LCD/wake-up-face.py" &がその部分です。Pythonスクリプトを呼び出しています。そのスクリプトコードは以下の通りです。

import os
import sys

from PIL import Image

sys.path.append('/home/ubuntu/minipupper_ros_bsp')
sys.path.extend([os.path.join(root, name) for root, dirs, _ in os.walk('/home/ubuntu/minipupper_ros_bsp') for name in dirs])
# sys.path.append('/home/ubuntu/minipupper_ros_bsp/mangdang')
# sys.path.extend([os.path.join(root, name) for root, dirs, _ in os.walk('/home/ubuntu/minipupper_ros_bsp/mangdang') for name in dirs])
# from LCD.ST7789 import ST7789
from mangdang.LCD.ST7789 import ST7789


cartoons_folder = '/home/ubuntu/Pictures/'
disp = ST7789()


def main():
    """ To show wake-up-face
    """

    # Firstly, show logo
    #init st7789 device
    global disp
    disp.begin()
    disp.clear()
    image=Image.open(cartoons_folder + 'logo.png')
    image.resize((320,240))
    disp.display(image)


main()

####
#### run this script
####
# python3 /home/ubuntu/minipupper_ros_bsp/mangdang/LCD/wake-up-face.py

顔画像はこちらにあります: github.com

これらの画像ファイルを/home/ubuntu/Pictures/ディレクトリに配置しました。

仕組みさえ分かってしまえば特に難しいとろころはないのではないかと思います。その仕組みを説明する資料がないんですよね...。こんな感じでプログラミング次第で何でもできます。

ヒントとして、ROS版のこういったプログラム関連とそのインストール用ファイルは、

  • /home/ubuntu/minipupper_ros_bsp/mangdang

にまとめられています。それに対応するGitHubリポジトリが以下だと思います。

  • https://github.com/mangdangroboticsclub/minipupper_ros_bsp

また、ROS用のコマンドなど(ワークスペース)は、

  • /home/ubuntu/catkin_ws

というディレクトに入っています。それに対応するGitHubリポジトリが以下だと思います。

  • https://github.com/mangdangroboticsclub/minipupper_ros

ROS版でバッテリー電池不足時に鳴かせる方法

ついでにバッテリー電池不足時に鳴かせる方法も紹介しておきます。起動時に鳴かせる方法と基本的な考え方は同じです。電池がなくなったらsu ubuntu -l -c "mpg123 /home/ubuntu/Music/low_power.mp3"を実行するだけです。

バッテリー電池は/home/ubuntu/minipupper_ros_bsp/mangdang/FuelGauge/battery_monitorサービスで対応できます。私のbattery_monitorファイルの中身は以下のようになっています。

#!/bin/bash

#
# Copyright (c) 2021, Mangdang Technology Co., Limited
#

# IO Mapping configuration
IO_MAP=(
25 1  # Servo 1 control for v2 board - on
21 1  # Servo 2 control for v2 board - on
#26 1  # LCD LED <backlight LED control> - on
#24 0  # LCD RST <ReSeT control> - off
#27 0  # LCD DC <Data/Command (NOT MOSI!)> - off
)

# Set the above Configuration
function io_init(){
    len=${#IO_MAP[@]}
    for((i=0;i<len;i+=2))
    do
        io=${IO_MAP[i]}
        val=${IO_MAP[i+1]}
        echo $io > /sys/class/gpio/export
        echo out > /sys/class/gpio/gpio$io/direction
        echo $val > /sys/class/gpio/gpio$io/value
    done
}

# init IO
io_init
sleep 1

chmod 777 /sys/class/gpio/gpio24/value
chmod 777 /sys/class/gpio/gpio27/value
chmod 777 /dev/spidev0.0


#Power monitor
while true
do
    current_voltage=`cat /sys/class/power_supply/max1720x_battery/voltage_now`
    if [ $current_voltage -le 6500 ]; then
        echo 0 > /sys/class/gpio/gpio25/value
        echo 0 > /sys/class/gpio/gpio21/value
        su ubuntu -l -c "mpg123 /home/ubuntu/Music/low_power.mp3"
    fi
    sleep 8
done

このコード内のcat /sys/class/power_supply/max1720x_battery/voltage_nowで電圧をチェックし、電圧が6500未満になると、su ubuntu -l -c "mpg123 /home/ubuntu/Music/low_power.mp3"で音声ファイルを鳴らし続けています。PS4版のコードそのもののコードになっています。仕組みは簡単です。

ちなみにROS版の元々のコードでは、バッテリー側のブザー音を鳴らす内容になっていたと思います。音声ファイルの鳴き声の方が気分が乗りますよね。

このbattery_monitorサービスを有効にするには、以下のコマンドを実行してください。

# Install mangdang power-on service
cd /home/ubuntu/minipupper_ros_bsp/mangdang/FuelGauge
sudo bash install.sh
sudo reboot

ミニぷぱに付属のバッテリーでは、このように電圧をチェックできますが、人が見る場合、「電池があと何%?」と見た方が分かりやすいですよね。これを調べるには、

cat /sys/class/power_supply/max1720x_battery/capacity

というコマンドを実行すればよいです。実開発作業ではGUIを見ずにSSHでVisual Studio Codeから触ることが多いのではないかと思いますが、このコマンドは便利ですよ。

(走り書きで見直してないです以上です。読む人も限られると思うので最小コストで。)

UbuntuのGUIログイン画面からCUI切り替え方法(キー入力)

GUIログイン画面からCUI切り替えるためのキー入力は、ネット上にたくさん情報があるはずだけど、必要なときに検索しても必要な情報が探し出しづらくて困ったので、自分でも備忘録を残して置くことにしました。

GUIログイン画面→CUIにする

[Ctrl]+[Alt]+[F1]キー

CUI→GUIログイン画面にする

[Alt]+[F7]キー

f:id:misshiki:20210825141308p:plain
Ubuntu

無料で受けた試験AI-900に合格して「Microsoft Certified: Azure AI Fundamentals」取得

久々のブログエントリがこんなので済みませんが、先ほど試験 AI-900: Microsoft Azure AI Fundamentalsを受けて合格しました。

f:id:misshiki:20210807154231p:plain
AI-900に合格

この試験は、AIの基礎として、AIのユースケース(どんな場面でどのようにAIを使うか)や、マイクロソフトが提唱する基本原則(責任あるAIとして、公平性、信頼性と安全性、プライバシーとセキュリティ、包括性、透明性、アカウンタビリティ)、機械学習のタスク(問題種別:回帰/分類/クラスタリングなど)や分野(コンピュータビジョン、自然言語処理、異常検知、対話型AIなど)、Azure Machine Learnigにおける自動機械学習(AutoML)とデザイナーによるGUI作業方法、Congnitive Servicesの各API機能内容をカバーした試験内容になっていました。

個別具体的な機能内容ほど簡単で、AI・機械学習(例えば「Deep Insider - @IT」でカバーされている内容)を学んで来た人であれば勉強しなくても簡単に答えられるかなと思いました。それが後半の70%ぐらいだったと思います。むしろ前半30%のユースケースの方が難しいと思いました。試験対策の勉強は、Microsoft Learnで無料でできます。

ラーニングパス全部で約10時間ですが、その時間で学習を全部終えるのは無理そうでした。例えば、1つもモジュールが5分で終えるのに、途中に4.5分ぐらいのビデオがあったりして、しかも動画の再生が倍速にできないので、絶対にその時間では終えられません。あと、Azure MLを使って作業する際には待ち時間が発生するので、それで確実に時間どおりにはできなかったです。Azure MLの使用は1000円ぐらいかかったと思います(初回無料枠みたいなのがあれば無料でもできるかも)。

Azure MLの後、Cognitive Servicesの演習もあります。無料のラボが起動できるらしいですが、私が試したところ、「不正なアクティビティを検出しました」などと出て、[申し立て]というのをしても同じエラーで起動できませんでした(何も悪いことをしていないのに悲しい気持ちです...)。ローカル環境でも演習をできそうな感じでしたが、手間が多くて諦めて、演習は全部飛ばしました。飛ばしても試験にはほとんど影響なかったと思います。

難しくはないですね。比較するなら統計検定の方がよっぽど難しいと思います。

で受験費用ですが、通常は1万2500円かかるようです。しかし私はタダで受けました。というのも最近、マイクロソフトが【AI-900無料試験特典つき】というトレーニングイベントを頻繁に開催しており、それに参加したからです。

直近でも2021/08/27と2021/09/15にあるみたいです。無料で認定資格が取れるなら受験しようかなという人はチェックしてみてください。ちなみに無料でなければ私は受験しなかったです(仕事など実利面で特にメリットが感じられないから...。あるとすれば受験合格をこうやってブログに書いたりかな)。

AI-900の合格により、下記の認定資格が得られています。

Microsoft Certified: Azure AI Fundamentals August 7, 2021
Certification Number: H921-8651

f:id:misshiki:20210807160905p:plain
証明書

バッジもゲットできます。他に載せる予定はないのでここだけの表示になります。

f:id:misshiki:20210807160916p:plain
バッジ

壊れた動画ファイル(moov atom not found)の修復例

録画した動画の保存に失敗して壊れた.mp4ファイルができたのですが、試行錯誤して何とか修復できたので、万が一もう一度起きたときのための備忘録です。Windows 10で修復しました。

他の皆さんでも同様の問題があれば参考になるかもしれません。ただし、同じ手順を実行した場合のいかなる結果も保証しませんのであくまで完全に自己責任で行ってください。なお後述のコマンドで指定するフォルダー/ファイルのパスに日本語(2バイト文字)が含まれると正常に実行できない場合がありますのでご注意ください(英語アルファベットのみのパスを使用してください)。

動画の保存に失敗した

わたしの場合、動画の保存中にアプリがフリーズして、中途半端な状態で終わりました。いろいろと調べた結果、コマンドラインツールのFFmpegというツールで壊れた内容を取得できることをつかみました。なお、そのことが分かる前に5個ぐらいいろいろな修復アプリを試しましたが、全部ダメでした...。

FFmpegのダウンロード

FFmpegは聞いたことあるような気がしますが、これを使ったことによる責任は一切おえませんのでご了承ください。Wikipedia「FFmpeg - Wikipedia」にも情報があるので、たぶん安全ではなかろうかと自分は判断しました。

ちなみにわたしの場合、上記のサイトのここからダウンロードしました:

f:id:misshiki:20201015203749p:plain
FFmpegのダウンロード

上記のリンクを開くとGitHubリポジトリ(=ソースコードが置いてある場所)に到達します。どれを選べばよいのかは私には分かりませんでしたが、次の画像に示すものをダウンロードしてみました。

f:id:misshiki:20201015203951p:plain
FFmpegコマンドラインツールを含む.zipファイル

ダウンロードした.zipを展開してbinフォルダー内のffmpeg.exeをコマンドプロンプトで呼び出して使いました。コマンドラインを使うので一般の人には比較的高度な作業になってしまうかもしれません。

FFmpegによる診断

入力したコマンドは、ffmpeg -i <ファイル名>.mp4です。入力前に、cd <フォルダーパス名>で現在のパスを移動しておく必要があります。

f:id:misshiki:20201015204728p:plain
FFmpegコマンドによる情報取得の結果

コマンドを実行した結果、次のように表示されました。

[mov,mp4,m4a,3gp,3g2,mj2 @ 0000017769bb44c0] moov atom not found
rokuga.mp4: Invalid data found when processing input

moov atom not foundというエラーが出た場合、untruncコマンドで修復できるという情報がGoogle検索で何件かヒットしました。同名のエラーであれば、わたしと同じように修復できる可能性があります。

ただしいずれの参考情報もLinuxなどを使っていてWindowsでは難しいなどと書かれていました(それもこの記事をわざわざ書いた理由です)。ちなみにuntruncのソースコードは次のリンク先にあります。

そこで「untrunc windows」で検索したところ、「MP4 Repair Untrunc-w GUI」(以下、untrunc-gui)というツールがヒットしました。

untrunc-guiのダウンロード

  • MP4 Repair 0.9.0 Free Download for Windows

  • CodecPack.Co | Download Audio Video Software」というサイトで開発&配布されています。えー、このサイトってウィルスとか大丈夫なのとは思いましたので、これを使うかどうかは繰り返しになりますが自己責任でお願いします。わたし自身は、Facebookなどの公式ファンページを運用されていたりするし、サイトの作りに歴史を感じるし、真面目なサイトみたいなので大丈夫だろうと判断しましたが、人にお勧めできるほどの自信はありませんので。念のため自分でウイルスチェックなどは行ってください(Window Defenderではチェックして問題なかったです。先ほどのffmepgも)。使い終わったら完全に削除しておくとより安心ですね。

[Untrunc GUI 64-bit]リンクから.zipファイルをダウンロード後、展開してuntrunc-gui.exeをダブルクリックするなどして画面を起動してください。untruncはコマンドラインツールですが、untrunc-guiはWindowアプリ(GUIツール)です。

untrunc-guiによる修復

untrunc-guiの使い方は説明が不要なくらい簡単です。

まず準備として、修復したい壊れたファイル(truncated file)だけでなく、壊れたファイルを作成した録画ツールで適当に録画した正常な動画ファイル(reference file:参照ファイル)を用意します。これは壊れたものと正常なものを比較しながら修復するためです。

f:id:misshiki:20201015210624p:plain
untrunc-gui

untrunc-guiに2つのファイルパスを入力して[Repair]ボタンを押せば完了です。動画の長さによると思いますが、実行は数分で終わりました。

同一フォルダー内に「_fixed-」という名前の付いたファイルを再生してみてください。わたしの場合は無事に再生できました!(ただし恐らくハングアップしたところまでと思いますが途中で切れていましたが) 同じように試した皆さんがうまくいくことを祈ります。

Twitterハッシュタグとシャドウバン

ブログ記事などのタイトルにハッシュタグを含めると、開設間もない信頼性の低いTwitterアカウントで記事タイトルを含めてツイートした際に、そのアカウントがシャドウバンされてしまう可能性が高いかもしれません。ハッシュタグを含めた記事をツイートした直後にシャドウバンになったので(ひどい対応だなとは思うのですが…)。

なお「シャドウバン」の意味については検索してください。調査ツールもあります。

ツイートするため、してくれる人のため、記事タイトルにはハッシュタグを付けない方がよさそうです。自分もツイート時に楽をしようと記事にハッシュタグを付けてみることもありましたが、逆にこれが人に迷惑を掛ける可能性があるなと気付きました。