【PR】この記事には広告が含まれています。

Raspberry Piを買ったら、一度は作ってみたいのがロボット。でも、キットを探してみると、どれも似たり寄ったりで欲しいものが見つからないことも。

そんな中、SunFounderから犬型ロボットキット「PiDog」が新登場しました。PiDogは、Raspberry Piの可能性を広げ、未来のペットとして日常に新たな楽しさをもたらします。革新を追求するSunFounderが生み出した「新しい相棒」に注目です。


公式のプロモーション動画はこちらからご覧いただけます。
本記事はSUNFOUNDER様から商品をご提供いただき作成しています。
PiDogを開封する

箱は意外とコンパクトに感じました。シンプルで洗練されたデザインに気分が高まります。
パッケージ内容

部品一式です。一見すると量が少ないように見えますが、小さな部品が多く含まれているため、総数ではかなりのボリュームです。ドライバーが2種類とレンチも付いています。
制御に関する主要な部品は次の通りです。名称をクリックすると公式の解説ページをご覧いただけます。

取扱説明書は組み立て方についてのもので、表裏に印刷されています。基本的には英語表記ですが、組み立てるうえで間違いやすいポイントは日本語で書かれているため、理解しやすいです。

Raspberry Piの設定方法やPiDogの動かし方については、オンラインでマニュアルが提供されています。日本語版マニュアルもあるので、大変便利です。
Raspberry Piは別売り
PiDogを制御するためのRaspberry Piは、キットに付属していません。使用できるモデルは次の通りです。
- Raspberry Pi 4 Model B
- Raspberry Pi 3 Model B
- Raspberry Pi 3 Model B+
- Raspberry Pi Zero W
- Raspberry Pi Zero 2W
PiDogはカメラが搭載されており、物体を追跡できます。スムーズな動作を求める方は、Raspberry Pi 4 Model B 8GBといった高性能なモデルを選ぶことをおすすめします。

僕はRaspberry Pi 4の2GBモデルを使用しました。
バッテリー付属

このタイプのロボットキットはバッテリー別売りのものが多いですが、PiDogにはバッテリーが付属しています。USB Type-Cでの充電可能です。

組み立て後でもバッテリーを外さずに、そのまま充電可能です。充電中は赤いLEDが点灯し、充電が完了するとLEDが消えます。
Raspberry Piの準備をする

Bullseye 32-bit Desktop版のRaspberry Pi OSを使用しました。最新のOSであるBookwormには対応していないようです。
言語設定を英語にする

システムの言語設定は英語にしておくことが必要です。日本語に設定されていると、音声アンプの設定に問題が生じ、PiDogが正常に動作しなくなることがあります。
VNC環境を用意する

マニュアルには記載されていませんが、Raspberry PiはVNCで操作するのが圧倒的に便利です。VNC(Virtual Network Computing)はネットワークを通じて別のコンピュータにアクセスし、そのデスクトップ画面を呼び出して操作する技術です。これにより、Pidog(Raspberry Pi)にマウスやキーボード、ディスプレイを接続することなく操作できるようになります。
VNC環境の設定方法は以下の記事で詳しく解説しています。
≫【ラズベリーパイを遠隔操作】VNCでPCからリモート接続する方法
PiDogの組み立て

まずは音方位センサーを取り付けます。このセンサーは音がしている方向を検出して、0から359の数値で出力します。

音方位センサーの上にRaspberry Pi を取り付けます。microSDは組み立て後でも交換可能です。

メインの基板です。裏側にはスピーカーが付いており、PiDogの鳴き声はここから出力されます。
メインの基板はHATと呼ばれる形状のコネクターで、Raspberry Piの40ピンに直接挿入します。

組み立ての途中でラズパイを起動する

Raspberry Piの電源を入れて、ソフトウェアの準備をします。これは、サーボモーターを適切な角度に設定し取り付けるためです。サーボモーターには稼働範囲が決まっており、正確な角度での取り付けが行われない場合、ロボットの正常な動作が妨げられることがあります。

オンラインマニュアルの手順に沿って、Raspberry Piへソフトウェアをインストールします。

servo_zeroing.pyというプログラムを実行した状態でサーボモーターをピンに接続します。すると、サーボモーターが基準位置に動きます。この状態でサーボモーターを固定していきます。

楽ちんなリベット止め

強度が不要な接合部分は、プラスチック製のリベットで止める仕様になっています。手で簡単に押し込むだけでカチッとはまり、作業がスムーズに進みます。
完成

組み立てにかかった時間は4時間。しかし、その時間を忘れさせるほど、完成した瞬間の感動と達成感は格別でした。犬型ロボットの愛らしいデザインと、自分で組み立てたという事実が相まって、特別な愛着が生まれてきます。
組み立ての様子はこちらの公式動画で確認できます。
PiDogを動かしてみる
ここからはPiDogを動かしていきます。その機能性と心を引きつけるアクションをご覧ください。
サーボモーターの校正

完成したPiDogをすぐに動かしたいところですが、まずはサーボモーターの校正が必要です。この作業によって、サーボモーターの基準角度を細かく調整します。校正を怠ると、PiDogの歩行が不安定になるなどの問題が生じることがあります。

校正用のプログラムを動かして、12個のサーボモーターをひとつずつ調整していきます。校正時はキットに付属している直角のゲージを使用します。
13種類のサンプルプログラム
校正が終わったら、いよいよPiDogで遊んでいきます。前項でインストールした「/home/pi/pidog/examples」のフォルダー内には13種類のサンプルプログラムがあります。

サンプルプログラムの種類は次の通りです。
プロジェクト名 | 動作 | 詳細 | |
![]() | Wake Up | 伸びをする、体をねじる、座る、尻尾を振る、ハアハアする。 | 詳細を見る |
![]() | Function Demonstration | 15種類の動作と12種類のサウンドを実行できる | 詳細を見る |
![]() | Patrol | 超音波センサーで距離を測定しながら前進 | 詳細を見る |
![]() | Response | PiDogに接近すると警戒して吠える。頭をなでると喜ぶ | 詳細を見る |
![]() | Rest | 音に反応して立ち上がり、キョロキョロする | 詳細を見る |
![]() | Be Picked Up | PiDogを持ち上げると、スーパーマンのポーズをする | 詳細を見る |
![]() | Face Track | 顔を認識して頭を動かす。音のする方向に頭を向ける | 詳細を見る |
![]() | Push Up | 腕立て伏せをする | 詳細を見る |
![]() | Howling | 遠吠えする | 詳細を見る |
![]() | Balance | 地面の角度に応じてバランスを取る | 詳細を見る |
![]() | Play PiDog with Keyboard | キーボードでPiDogを操作する | 詳細を見る |
![]() | Play PiDog with APP | スマートフォンやタブレットからPiDogを操作する | 詳細を見る |
![]() | Ball Track | 赤い物体を追いかけて歩く | 詳細を見る |
プログラムの実行方法
ターミナル画面を開いて、サンプルプログラムが保存してあるフォルダに移動します。
cd ~/pidog/examples

「sudo python3 1_wake_up.py」のようにコマンドを打ち込むと、プログラムが実行されます。
sudo python3 1_wake_up.py

以下は「Ball Track」を実行した様子です。赤い物体を発見すると、その方向に顔を向けて歩きだします。歩く方向もゆっくりと変わっていきます。

以下は「Play PiDog with Keyboard」というプログラムでscratchという動作をさせた様子です。

同じく「Play PiDog with Keyboard」でtrotを実行した様子です。通常の歩行はゆっくりですが、軽快に走ることもできます。

Push Up(腕立て伏せ)をしている姿もかわいいです。

スマホやタブレットから操作する

SunFounder Controllerという専用アプリをスマホやタブレットにインストールして、PiDogを操作できます。SunFounder ControllerはAPP Store(iOS)またはGoogle Play(Android)からインストール可能です。

PiDogでプログラムを起動後、SunFounder Controllerを開くと、自動でネットワーク上からPiDogを探してくれます。
カメラの映像を通じてPiDogを操作することができます。歩いたり頭部を動かしたりすることで視界が変化します。まるでPiDogの目線で周囲を見ているかのような体験が可能です。インターフェイスは洗練されており非常にスタイリッシュな印象を与えます。

コントローラーを使えば、歩行、頭の動き、座る、立つ、伏せる、尻尾を振る、頭をかくなどのさまざまな操作が行えます。個人的には、サンプルプログラムの中で「Play PiDog with APP」が一番気に入っています。
自分でもプログラミングできる

PiDogはサンプルプログラムだけでも十分に楽しむことができます。しかし、ラズパイ経験者であれば独自のプログラムを作って動かしたくなるものです。PiDogのオンラインマニュアルには、プログラミングの手引きとなるチュートリアルが用意されており、プログラム作成に役立ちます。

「お手」のプログラムを作ってみる

以下のプログラムはPiDogを操作し、「お手」の動作を実行するためのものです。上述したチュートリアルを参考に作成しました。基本的にはプリセットされた動作を呼び出して、PiDogを動かします。
from pidog import Pidog # PiDogライブラリからPidogをインポート
from preset_actions import hand_shake # hand_shakeアクションをインポート
import time
# カスタムの初期化サーボ角度でPiDogのインスタンスを作成
# 初期化することで、PiDogが特定の姿勢で起動します
my_dog = Pidog()
try:
my_dog.do_action("sit", speed=60) # PiDogに座る動作を指示(速度は60)
time.sleep(1) # 次の動作まで1秒待機
hand_shake(my_dog) # PiDogに「お手!」の動作を実行させる
my_dog.do_action("sit", speed=60) # 再び座る動作を指示(速度は60)
time.sleep(1) # 次の動作まで1秒待機
# キーボード割り込み(Ctrl + C)があった場合の処理
except KeyboardInterrupt:
pass # 特に何もしない
# その他の例外が発生した場合の処理
except Exception as e:
print(f"3[31mERROR: {e}3[m") # エラーメッセージを表示
# プログラム終了時に実行される処理
finally:
print("closing ...") # 終了することを表示
my_dog.close() # PiDogの接続を適切に閉じる
最初にPiDogを起動し、その後、速度を60に設定して座る動作を指示します。1秒待ってから、「お手」という動作を実行し、再び座る動作を指示します。最後にPiDogの接続を閉じて、プログラムが終了します。
プログラムはサンプルプログラムと同じフォルダーの「/home/pi/pidog/examples」に保存して実行します。

音声で「お手」をさせてみる
最近のロボットは音声での操作が主流になってきています。マイクを接続すればRaspberry Piでも音声認識ができます。そこで、声を出して「お手」と指示してPiDogを動かしてみることにしましょう。

音声認識を利用するには、別売りのUSBマイクを使います。上記のようなコンパクトなマイクを選ぶと良いでしょう。千円以下で販売されています。

音声認識エンジンをインストールする
音声認識には「Julius(ジュリアス)」を使用します。Juliusはリアルタイムで日本語音声認識を行う無料のソフトウェアです。
必要なパッケージをインストール
ターミナルを開いて、以下のコマンドを1行ずつ実行していきます。
sudo apt update
sudo apt upgrade
sudo apt install build-essential zlib1g-dev libsdl2-dev libasound2-dev
Juliusのインストール
git clone https://github.com/julius-speech/julius.git
cd julius
wget -O support/config.guess 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD'
wget -O support/config.sub 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD'
cd jcontrol
wget -O config.guess 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD'
wget -O config.sub 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD'
cd ..
./configure --enable-words-int
make -j4
日本語モデルのダウンロード
git clone https://github.com/julius-speech/dictation-kit.git
「dictation-kit」のフォルダーに移動します。
cd dictation-kit
USBマイクの設定
以下のコマンドでUSBマイクが認識されているか確認します。
arecord -l

マイクのカード番号とデバイス番号を読み取ります。「card 4」はシステムが認識しているサウンドカードの番号です。「USB PnP Sound Device」 は、デバイスの名前です。これはUSBマイクを指しています。「device 0」 はそのサウンドカード上のデバイス番号を示しています。

マイクの音量を最大に設定します。音量が小さいと、うまく言葉の認識ができなくなります。
Juliusの起動
Juliusを起動して、音声認識ができることを確認します。以下のコマンドでJuliusが起動します。
/home/pi/julius/julius/julius -C main.jconf -C am-dnn.jconf -demo -dnnconf julius.dnnconf

以下の画面になれば起動成功です。マイクに向かって話しかけると、認識結果が表示されます。

認識精度はそれほど高くないようです。「お手」という言葉を「大手」と誤認識してしまいました。しかし、PiDogを操作する上では大きな支障はありません。「大手」と認識された際にPiDogを動かすプログラムを設定すれば問題なく対応できます。
Juliusをモジュールモードで起動
Juliusをモジュールモードで起動すると、Pythonプログラムを介して音声認識結果をテキストで取得できます。これにより、得られたテキストを用いてPiDogの制御を行うことが可能になります。
まず、Juliusの設定ファイルである 「main.jconf」
を編集します。これらの手順を踏まないとエラーが発生して、動作しませんでした。
nano main.jconf
-fvad
オプションを探し、その行をコメントアウトします。コメントアウトするには、行の先頭に #
記号を追加します。

「-h model/phone_m/jnas-tri-3k16-gid.hmmdefs」を追加する。

必要に応じて「cd /home/pi/julius/dictation-kit」で「/home/pi/julius/dictation-kit」に移動してください。
以下のコマンドを実行することにより、Juliusをモジュールモードで起動します。
/home/pi/julius/julius/julius -C main.jconf -C am-dnn.jconf -dnnconf julius.dnnconf -module

以下の画面になれば、起動成功です。

この状態のまま、次の手順に進んでいきます。
Pythonプログラムからテキストを取得
Juliusをモジュールモードで、起動した状態で以下のコードを実行します。
import socket
import sys
# Juliusサーバの設定
host = "localhost"
port = 10500
# ソケットの作成と接続
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
res = ''
while True:
# 音声認識の区切りである「改行+.」がくるまで待つ
while (res.find('\n.') == -1):
# Juliusから取得した値を格納していく
res += sock.recv(1024).decode('utf-8')
word = ''
for line in res.split('\n'):
# Juliusから取得した値から認識文字列の行を探す
index = line.find('WORD=')
# 認識文字列があったら...
if index != -1:
# 認識文字列部分だけを抜き取る
line = line[index + 6 : line.find('"', index + 6)]
# 文字列の開始記号以外を格納していく
if line != '[s]':
word = word + line
print('word:' + word)
# 特定の文字列を認識した時の処理
if word == 'お手'or word == '大手':
print("発見")
res = ''
このコードは、Julius音声認識エンジンからリアルタイムでデータを受信し、認識された単語を処理するためのPythonスクリプトです。ローカルサーバー上のJuliusからデータを受け取り、認識された各単語を抽出して表示します。特定の単語(「お手」または「大手」)が認識されると、「発見」と出力します。
本番用プログラム
import socket
import sys
from pidog import Pidog # PiDogライブラリからPidogをインポート
from preset_actions import hand_shake # hand_shakeアクションをインポート
import time
# Juliusサーバの設定
host = "localhost"
port = 10500
# ソケットの作成と接続
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
# カスタムの初期化サーボ角度でPiDogのインスタンスを作成
# 初期化することで、PiDogが特定の姿勢で起動します
my_dog = Pidog()
my_dog.do_action("sit", speed=60) # PiDogに座る動作を指示(速度は60)
my_dog.head_move([[0, 0, -20]], roll_comp=0, pitch_comp=0, immediately=True, speed=50)
res = ''
while True:
# 音声認識の区切りである「改行+.」がくるまで待つ
while (res.find('\n.') == -1):
# Juliusから取得した値を格納していく
res += sock.recv(1024).decode('utf-8')
word = ''
for line in res.split('\n'):
# Juliusから取得した値から認識文字列の行を探す
index = line.find('WORD=')
# 認識文字列があったら...
if index != -1:
# 認識文字列部分だけを抜き取る
line = line[index + 6 : line.find('"', index + 6)]
# 文字列の開始記号以外を格納していく
if line != '[s]':
word = word + line
print('word:' + word)
# 文字列を認識したらPiDogを動かす
if word == 'お手'or word == '大手':
my_dog.rgb_strip.set_mode('breath', 'pink', bps=1)
my_dog.head_move([[-40, 0, -30]], roll_comp=0, pitch_comp=0, immediately=True, speed=50)
hand_shake(my_dog) # PiDogに「お手!」の動作を実行させる
my_dog.do_action("sit", speed=60) # 再び座る動作を指示(速度は60)
my_dog.head_move([[0, 0, -20]], roll_comp=0, pitch_comp=0, immediately=True, speed=50)
my_dog.rgb_strip.set_mode('breath', 'white', bps=0.5)
res = ''
このコードは前述したものに、PiDogを操作するためのスクリプトを追加したものになります。認識された単語が「お手」または「大手」と認識された場合、PiDogのLEDストリップがピンク色で点滅し、PiDogが頭を動かして「お手」の動作をします。その後、PiDogは再び座る姿勢をとり、LEDストリップが白色でゆっくりと点滅します。
PiDogならラズパイがもっと楽しくなる

PiDogが手元に届いてから、組み立て、動作確認、プログラミングといった一連の作業を経て、いつも「次に何が起こるんだろう?」と楽しみで仕方がありませんでした。時間が足りないくらい、ずっとPiDogと遊んでいたいと思わせる魅力がそこにはありました。
PiDogはRaspberry Piで何から手をつけていいか迷っている方や、電子工作には興味があるけれど初めの一歩が踏み出せない方にぴったりのキットです。親しみやすい工夫がたくさんされており、使う人を魅了します。こんなに夢中になれるアイテムとの出会いは、そうはありません。
さて、次はPiDogと何をして遊ぼうかな?