いっしきまさひこBLOG

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

ミニぷぱ(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から触ることが多いのではないかと思いますが、このコマンドは便利ですよ。

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