・このPrintPupper ROS版は開発者向けです。ロボットのハードウェアは同一ですが、ソフトウェアはまったく別のものとして実装されています。
・開発中のものを公開するものです。完成されたものではありません。
・ロボットを歩行させて遊ぶだけであれば、他のページで公開している通常版(Standalone python ver)の方が優れています。
・ROSであることによる互換接続性、SimToReal実行の実現、継続開発の点でメリットが大きいため別途開発しているものです。
・このページでは実行環境の構築手順を紹介します。開発者向けの参考情報です。全ての環境で正しく動作するとは限りません。適時読み替えて対処してください。
・Linux、仮想環境、ROS開発などにある程度は知識がある方向けに、手順を示すものです。
・コマンドラインレベルで説明していますが、各環境と知識レベルに応じて適時読み替えて下さい。
・細かい環境固有の問題はDIYで解決できる必要があります。
・実機ハードウェアなしでもSim動作はできます。
・GitHub の issues などで動作報告、QAなど頂けるとありがたいです。
https://github.com/r9kawai/PrintPupper_ROS/issues
・PC側がロボットの頭脳、コントローラになり、ROS通信で関節の動作指示角度を実機に送信します。
・ロボットの操作はPC側のキーボードで行います。
・ロボット実機(ラズパイ)側は関節の動作指示角度に基づいて12自由度を制御します。
・環境構築にはWiFiまたはLAN接続、インターネット接続が必要です。
・PCとロボットのラズパイが同じルーターに接続されDHCP-IP取得でき、高速インターネットに接続できている環境が前提です。
・インストールが終わればWAN接続なしのクローズドLAN環境でも動作します。
・PrintPupperROS版の Git リポジトリはこちらにあります。
https://github.com/r9kawai/PrintPupper_ROS
・以下の実行環境で動作します。
※CHAMPが古い環境を要するため、古いスタック構成になっています。最新のLinux/最新のROS環境との相性は悪いです。
※ここではROS入門レベルの理解はあるものとして説明します。
・Ubuntu 18.04 + ROS1 Melodic + CHAMP + PrintPupper hardware if ROS node
・ROS1 Melodic
https://wiki.ros.org/melodic/Installation/Ubuntu
・CHAMPは四足歩行ロボットの開発フレームワークです。
ROS Packages for CHAMP Quadruped Controller.
https://github.com/chvmp/champ
・大枠の説明
・Sim側のROS環境仮想マシンと、Real側のROS実機ラズパイマシンの、2つの環境構築をします。
・シミュレーション歩行をWindowsPC-WSL側で実行(WinPC - WSL - Ubuntu - ROS - CHAMP - RVIZ)、roscore は WSL側
・リアル歩行をロボット実機のRaspberryPi側で実行(RasPi - Ubuntu - ROS - pp_champ_joints_hardware)、ros node のみラズパイ側
・ROS node通信で両者を結合し、Sim-Real同時歩行をさせる
・手順一覧
Step1. (Sim側)WSL-Ubuntu環境の初期的な構築
Step2. (Sim側)ROS環境の構築と動作テスト
Step3. (Sim側)Champ実行環境の構築と動作テスト
Step4. (Sim側)WSL環境(シミュレーションのみ)での動作テスト
Step5. (Sim側)WSL環境のファイヤーウォール解除(重要)
※ここまでの実行には実機ロボットは不要
Step6. (Real側)RaspberryPi側のUbuntu-ROS環境の構築
※ここから printpupper.com で制作したロボット実機を用いて進める。
Step7. (Real側)ROS環境用のサーボキャリブレーション操作
※ROS版のキャリブレーション作業は通常版とは別の仕組みのため、再度行う必要があります。
Step8. (Sim-Real)ROS通信成立の確認と通信設定
※Sim-Real双方で毎回の操作を簡略化するための設定をする
Step9. (Sim-Real)SimToReam指令歩行の実行
※PCとロボがWiFi接続されていれば、PCのキーボードから歩行の操作ができるようになります。これが動画で紹介している状態です。
・このステップではWindows11のWSL2を用いてUbuntu18.04の仮想環境を整えます。
・ROSを実機で構築する方、WSL/Ubuntuに詳しい方は読み飛ばして下さい。
・Windows11のWSL2を導入しておく(省略)。
・Ubuntu18.04 の wsl.rootfs.tar.gz をここからダウンロード
※ Ubuntu18.04 は古いので、現在では wsl --list --online コマンドで標準導入できなくなっているため手動でインストールします。
https://cloud-images.ubuntu.com/bionic/current/
https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64-wsl.rootfs.tar.gz
・ローカル再配布
drive.google.com local re-distribution bionic-server-cloudimg-amd64-wsl.rootfs.tar.gz
・WSLのネットワーク設定を変更
・C:\Users\MYUSER\.wslconfig を編集し、以下のようにしておく。
※WSL仮想Linuxが実機ラズパイと通信する必要があるため、セキュリティに関する考慮はここではしないので自己責任で。
[wsl2]
networkingMode=mirrored
・Windowsのフォルダ上で以下のように配置しておく
C:\WSL\images\bionic-server-cloudimg-amd64-wsl.rootfs.tar.gz
C:\WSL\Ubuntu-18.04
・PowerShell wsl コマンドで以下のように導入する
wsl --shutdown
wsl --import Ubuntu-18.04 C:\WSL\Ubuntu-18.04 C:\WSL\images\bionic-server-cloudimg-amd64-wsl.rootfs.tar.gz --version 2
・WSL-Ubuntu18.04が動作していることの確認
wsl -l -v
Ubuntu-18.04 Stopped 2
wsl -d Ubuntu-18.04
root@MYPC:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.6 LTS
Release: 18.04
Codename: bionic
・WSL-Ubuntu側の環境を整える
・rootのままで運用しないようにする。
・User:ubuntu / pass:ubuntu で運用する。
・ubuntu に sudo 権限を与える。
cd ~
adduser ubuntu
Adding user `ubuntu' ...
Enter new UNIX password: ubuntu
usermod -aG sudo ubuntu
・ubuntuをデフォルトユーザーにする
sudo nano /etc/wsl.conf
・wsl.conf の内容を以下に編集保存する
[user]
default=ubuntu
・WSLをシャットダウン、PowerShellに戻り、WSL再起動し、ログインが ubuntu になっているか確認しておく
※この作業をやっておかないとROSで必要になる複数のコンソールでの操作が煩雑で進まなくなります。
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
PS C:\Users\MYUSER> wsl --shutdown
PS C:\Users\MYUSER> wsl -d Ubuntu-18.04
ubuntu@MYPC:/mnt/c/Users/MYUSER$ cd
ubuntu@MYPC:~$
・OSVer確認、アップデート、必須基本ツールを入れるなどする
cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
...
sudo apt update
sudo apt upgrade -y
メモ:大きな変更を行った後は、一旦PowerShellに戻り wsl --sshutdown でWSL再起動を適時挟んだ方が良い。
sudo apt install curl git build-essential -y
sudo apt install gnupg2 lsb-release -y
・ROS Melodic base のインストール
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu bionic main" > /etc/apt/sources.list.d/ros1.list'
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo apt update
sudo apt install ros-melodic-ros-base -y
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
・ログアウト、ログインし、ROS環境変数設定がされていることを確認
env | grep ROS
・rosdep のインストール、rosdep update できることの確認
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool -y
sudo apt install ca-certificates
sudo rosdep init
rosdep update
・ROSが正常に作動していることのテスト
・rospy-tutorials パッケージを導入し、コンソールを3つ起動してで以下を実行し、ノード通信成立を確認する。
sudo apt install ros-melodic-rospy-tutorials
・コンソール1で roscore
roscore
・コンソール2で talker
rosrun rospy_tutorials talker
・コンソール3で listner
rosrun rospy_tutorials listener
メモ:roscore 起動を伴うコマンド実行時に、CTRL+Cを一度押さないと進まないことがある?
・このステップでは「パッケージ依存地獄」の解決に苦しむことが多いです。オープンソース開発では避けて通れません。
・Step2で構築したROS環境上で作業開始、rootユーザーのままで作業しないこと
・作業の流れ
・ROS作業dir "rosws1" を作り、CHAMP の git clone、続けて PrintPupper_ROS の git clone
・パッケージ依存関係の解決
・catkin_make 実行、ビルド
・Gitリポジトリ導入
mkdir -p ~/rosws1/src
cd ~/rosws1/src
git clone --recursive https://github.com/chvmp/champ
git clone https://github.com/chvmp/champ_setup_assistant.git
git clone https://github.com/chvmp/champ_teleop.git
git clone https://github.com/r9kawai/PrintPupper_ROS.git
・rosdep installでROS依存パッケージのインストールを試みる
cd ~/rosws1
rosdep install --from-paths src --ignore-src -r -y --rosdistro melodic
・同じコマンドをもう一度実行する、ほとんどの場合に依存関係で問題が残る
rosdep install --from-paths src --ignore-src -r -y --rosdistro melodic
・ここから手動で依存パッケージをインストールして解決する、ただし、PrintPupper_ROS で helpercmd を容易しているのでこれを用いてみる。
sudo src/PrintPupper_ROS/helpercmd/ros_champ_dependencie_solution.sh
メモ:このhelperコマンドで大抵解決するが、しないかもしれない。ビルドが通るまで環境ごとにトライが必要かもしれない。
・再び依存関係を確認し、エラーが無くなるまでトライする
メモ:完全に解決できなくても無視して先に進んでも良いパッケージもあるらしい。実行してみないと判らない。
rosdep install --from-paths src --ignore-src -r -y --rosdistro melodic
・Champ / PrintPupper_ROS のビルド実行
・この構成ではPC側では pp_champ_joints_hardware ノードをビルドできないので、IGNORE設定にしておき、catkin_make でビルドを実行する。
・成功ならbuild 100%で正常終了するはず。失敗するならエラーメッセージに従い解決を試みる。
touch src/PrintPupper_ROS/pp_champ_joints_hardware/CATKIN_IGNORE
catkin_make
- Example -
~/rosws1# catkin_make
....
[ 0%] Built target std_msgs_generate_messages_nodejs
[ 0%] Built target std_msgs_generate_messages_py
....
[ 98%] Building CXX object robot_state_plugin/robot_state_rviz_plugin/CMakeFiles/moveit_robot_state_rviz_plugin.dir/moveit_robot_state_rviz_plugin_autogen/mocs_compilation.cpp.o
[100%] Linking CXX shared library /root/rosws1/devel/lib/libmoveit_robot_state_rviz_plugin.so
[100%] Built target moveit_robot_state_rviz_plugin
~/rosws1#
・以下のような依存関係エラーの結果になったら
# rosdep install --from-paths src --ignore-src -r -y --rosdistro melodic
ERROR: the following packages/stacks could not have their rosdep keys resolved to system dependencies:
xxxx_xxxx : Cannot locate rosdep definition for [xxxx_xxxx]
......
xxxx_xxxx という文字列を、
ros-melodic-xxxx-xxxx に置き換えて、以下のコマンドで解決できないかをトライする。( "_" は "-" に置き換え)
メモ:この手がいつも通じるわけではない
sudo apt install -y ros-melodic-xxxx-xxxx
・作業の流れ
・PowerShell-WSL コンソール1でChampサンプルロボット定義をRVIZシミュレーション実行してみる。
・PowerShell-WSL コンソール2からキー入力操作で歩かせてみる。
・次に PrintPupper のロボット定義で同じトライをしてみる。
・コンソール1:Champ にサンプルとして用意されているURDF(ロボット定義)でRVIZ動作できるかを確認する。
cd ~/rosws1
source devel/setup.sh
roslaunch champ_config bringup.launch rviz:=true
・コンソール2:WSL2つ目のコンソールを起動しキー入力ノード(telop)を実行
・u, i, o, などのキー入力でロボットをシミュレーション歩行させられることを確認する。
cd ~/rosws1
source devel/setup.sh
roslaunch champ_teleop teleop.launch
※実行停止は CTRL+C
・Champ標準が動作することを確認できたら、PrintPupper のURDF(ロボット定義)でRVIZ動作できるかを確認する。
・コンソール1:
roslaunch pp_champ_urdf_config bringup.launch rviz:=true
・コンソール2:
roslaunch champ_teleop teleop.launch
メモ:以下のスクリーンショットのように、キーボードで2種のロボットを歩かせられたらSim側の構築は成功です。
champ sample URDF on RVIZ walking
PrintPupper URDF on RVIZ walking
・WSL - RaspbeppyPi間でROS通信が成立するように、仮想ファイヤーウォール層の解除をする。
・ここでの手法は FirewallHyperVVM の設定を変えるものです。
・この手法ではWSLにしか影響しませんが、複数のWSL環境があれば影響します。
・WindowsPC本体には影響しません。
・普段は wsl --shutdown でWSL自体を停止しておく運用を推奨します。
・知識がある方はポート限定解放などもっとセキュリティレベルの高い対処をしてください。
・PowerShellのコンソールを管理者権限で起動し設定変更する。
・以下の手順でコマンド実行
・Get-Net... で確認した {40E0A...} の部分をコピペして Set-Net... を実行し、Allow 設定に変更する。
- Exsample -
PS C:\Users\MYUSER> Get-NetFirewallHyperVVMSetting
Name : {40E0AC32-46A5-438A-A0B2-2B479E8F2E90}
Enabled : NotConfigured
DefaultInboundAction : NotConfigured
DefaultOutboundAction : NotConfigured
LoopbackEnabled : NotConfigured
AllowHostPolicyMerge : NotConfigured
PS C:\Users\MYUSER> Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
メモ:ROS通信がWSL-RasPi間で成功しない場合は、基本の双方向ping確認や、env | grep ROS の各変数が適切か、rosnode listコマンドでの調査などが必要かもしれない。ROS全体のsetupスクリプトと、各ws毎のsetupスクリプトが通っていないなど、ROS基本の見直しをして、それからファイヤーウォールなどを疑うこと。ROS通信の問題はネットに多く解決策があります。
・ラズパイ用の Ubuntu18.04 をパッケージをダウンロード、Raspberry Pi Imager でSD書込み、ロボット起動
https://wiki.ubuntu.com/ARM/RaspberryPi
18.04.5 LTS: ubuntu-18.04.5-preinstalled-server-armhf+raspi3.img.xz (4G image, 477MB compressed)
・ローカル再配布
drive.google.com local re-distribution ubuntu-18.04.5-preinstalled-server-armhf+raspi3.img.xz
・eth0 or wlan0 で接続できる環境にする、PCから ssh ログイン操作する
※ラズパイのネットワーク設定等についてここでは説明しませんが、ディスプレイを用いないNoHeadセットアップを推奨します。初回はEthernet接続か、シリアルコンソールで、ルーターが割り振ったIPアドレスを確認してssh接続。後でバッテリー駆動で歩かせる場合はwlan0で接続できるように設定しておく必要があります。
・以下のROS環境構築はSim側と同じになります。
・OSVer確認、アップデート、必須基本ツールを入れるなどする
cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
...
sudo apt update
sudo apt upgrade -y
sudo reboot
sudo apt install curl git build-essential -y
sudo apt install gnupg2 lsb-release -y
・シリアルコンソールの有効化
※EthernetもWiFiも無しに操作できるコンソールが得られるので、有効だがお好みで。
・/boot/firmware/nobtcmd.txt のテキストを console=ttyS0,115200 に変更
・/boot/firmware/usercfg.txt のテキストを enable_uart=1 の行を追記
・sudo reboot
・ROS Melodic base のインストール
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu bionic main" > /etc/apt/sources.list.d/ros1.list'
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo apt update
sudo apt install ros-melodic-ros-base -y
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
・ログアウト、ログインし、ROS環境変数設定がされていることを確認
env | grep ROS
・rosdep のインストール、rosdep update できることの確認
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool -y
sudo apt install ca-certificates
sudo rosdep init
rosdep update
・ROSが正常に作動していることのテスト
・rospy-tutorials パッケージを導入し、コンソールを3つ起動してで以下を実行し、ノード通信成立を確認する。
sudo apt install ros-melodic-rospy-tutorials
・コンソール1で roscore
roscore
・コンソール2で talker
rosrun rospy_tutorials talker
・コンソール3で listner
rosrun rospy_tutorials listener
・pigpio を git ソースから導入し make install
cd ~
git clone https://github.com/joan2937/pigpio.git
cd pigpio
make
sudo make install
・Python依存パッケージのインストール
sudo apt install python3-dev -y
sudo apt install python3-pip -y
sudo apt install python3-numpy -y
・ROS作業dir "rosws2" を作り、PrintPupper_ROSのROSパッケージを導入し、ビルド
mkdir -p ~/rosws2/src
cd ~/rosws2/src
git clone https://github.com/r9kawai/PrintPupper_ROS.git
cd ..
catkin_make
・キャリブレーション専用のPythonスクリプトを実行し、ロボット関節のキャリブレーションを行う
sudo pigpiod
cd ~/rosws2/src/PrintPupper_ROS/pp_champ_joints_hardware
python3 run_robot_caliblate_mode_for_pp_champ.py
- Example -
Start : run_robot_caliblate_mode_for_pp_champ.py
_servo_type_180deg rotate 1rad in PWM usec 500 - 1500 - 2500
GPIO 100Hz 10000range 1500neutral
GPIO FR-[ 23pin 24pin 25pin ]
GPIO FL-[ 17pin 27pin 22pin ]
GPIO BR-[ 16pin 20pin 21pin ]
GPIO BL-[ 05pin 06pin 19pin ]
----- operate key map -----
n : Select next foot
page uo/down : Servo 1 Hip +/-
cursor uo/down : Servo 2 Leg +/-
cursor right/left : Servo 3 Knee +/-
q : Quit, save, done.
----------
All servo to neutral signal, please wait ...
...
...
Next
caliblate_leg Front-Left
Sv1 Hip=0.0 / Sv2 Leg=11.5 / Sv3 Knee=-9.5
Sv1 Hip=0.0 / Sv2 Leg=11.5 / Sv3 Knee=-9.5
Quit
Result of calibration -> ./ServoCalibration.conf
[[ 0. 11.5 -9.5]
[ 6.5 2.5 -17. ]
[ -5. 16.5 1. ]
[ -2. -5.5 1.5]]
・ROS版でのキャリブレーション操作はコンソールのメッセージに従ってキーボードで行います。
・3サーボ×4足12関節について行い、終了させる。
・キャリブレーションの手順自体は キャリブレーション作業 Calibration process と同じ。
・WSL-RasPi 双方で毎回の操作を簡略化するための設定をします。
・WSL側のコンソールで、ip addr show eth0 コマンドなどでWSL側のIPアドレスを確認する
・ここでの例:192.168.xx.xx の部分を各環境のWSL側のIPアドレスに合わせて下さい。
※ルーターのIPアドレス付与が毎回変わらない前提で説明しています。
・WSL側でこの処置をする。(コマンドの内容は適時変えて)
echo "source ~/rosws1/devel/setup.sh" >> ~/.bashrc
echo "export ROS_MASTER_URI=http://192.168.xx.xx:11311" >> ~/.bashrc
echo "export ROS_IP=$(hostname -I | awk '{print $1}')" >> ~/.bashrc
・ログイン、ログアウトして env | grep ROS コマンドで正しく設定できているか確認しておく
・RasPi 側でこの処置をする。(コマンドの内容は適時変えて)
echo "source ~/rosws2/devel/setup.sh" >> ~/.bashrc
echo "export ROS_MASTER_URI=http://192.168.xx.xx:11311" >> ~/.bashrc
echo "export ROS_IP=$(hostname -I | awk '{print $1}')" >> ~/.bashrc
・ログイン、ログアウトして env | grep ROS コマンドで正しく設定できているか確認しておく
・以下の通信テストで talker/listner が WSL/RasPi 間で通ることを確認
※上手く行かない場合の対処はROSの入門を読んで下さい
・WSL側コンソール1:
cd ~/rosws1/
roscore
・WSL側コンソール2:
cd ~/rosws1/
rosrun rospy_tutorials talker
・RasPi側コンソール
rosrun rospy_tutorials listener
・SimToReam指令歩行の実行
・PCとロボがWiFi接続されていて、ロボ側がバッテリー電源であれば、PCのキーボード操作で歩行ができるようになります。
・これが動画で紹介している状態です。
・WSL側コンソール1:
roslaunch pp_champ_urdf_config bringup.launch rviz:=true
・WSL側コンソール2:
roslaunch champ_teleop teleop.launch
・RasPi側コンソール:※ sudo pigpiod は1度だけ実行すること
sudo pigpiod
rosrun pp_champ_joints_hardware pp_champ_joints_hardware_node