スマートフォンが入るロボットsmaboに関するリポジトリです。
smaboはスマートフォンが入るロボットであり、
- ナビゲーション (navigation)
- 動作計画 (motion planning)
- 画像処理 (image processing)
- 遠隔操作 (remote control)
- 深層学習 (deep learning)
- 二足歩行 (bipedal walking)
など様々なことができます。
19.mp4
本リポジトリでは、smaboに関係するコード等をまとめていく予定です。
smaboの詳しいセットアップについては以下ブログにて解説しているので、ぜひご覧ください。
本READMEでは、基本的な環境構築手順、使用法についてのみ解説します。
下記サイトを参考に、ROS2(humble)をインストールしてください。 https://docs.ros.org/en/humble/Installation/Alternatives/Ubuntu-Development-Setup.html
source /opt/ros/humble/setup.bash
を実行すると、ros2コマンドを実行できるのですが、ターミナルを開くたびに入力するのは面倒なので、下記コマンドを実行しましょう。
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
GPIOのパッケージをインストールします。
sudo apt update -y && sudo apt install -y \
python3-rpi.gpio
また、下記サイトを参考にsudoなしで RPi.GPIO パッケージを使うためのセットアップを実施してください。
【ラズパイ+ubuntu】sudoなしでadd_event_detectを使うとfailed to add edge detectionエラーが出るときの解決方法
その他、必要なパッケージをインストールします
pip install adafruit-pca9685 # サーボドライバpca-9685のパッケージ
pip install opencv-contrib-python # openCV(画像処理)
pip install ipget # ipアドレスを取得
pip install readchar # 一文字入力
pip install flask # flask(Webアプリケーションフレームワーク)
以下コマンドで、smabo用のワークスペースを作成してください
mkdir -p smabo_ws/src
以下コマンドで、本リポジトリをcloneしてください。
cd ~/
git clone https://github.com/akinami3/smabo.git
次に、以下コマンドでsmabo用のパッケージをワークスペースのsrcディレクトリにコピーしてください
cp -r ~/smabo/smabo_pkgs ~/smabo_ws/src
smabo関連のパッケージ以外に、「unityをROS2で通信するために必要なパッケージ」である「ROS-TCP-Endpoint」もcloneします(スマホとラズパイの通信に使用します)。
cd ~/smabo_ws/src
git clone -b dev-ros2 https://github.com/Unity-Technologies/ROS-TCP-Endpoint.git
以下コマンドで、ワークスペースをビルドしてください
cd ~/smabo_ws
colcon build --symlink-install
次に、以下コマンドでros2コマンドからビルドしたパッケージを起動できるようにします。
source ~/smabo_ws/install/setup.bash
ターミナルを起動するたびに上記コマンドを実行するのは面倒なので、 .bashrc
にも記述しておきます。
echo "source ~/smabo_ws/install/setup.bash" >> ~/.bashrc
リポジトリ内の「SmartPhoneRobot.apk」をスマホにダウンロードし、インストールしてください。
ここからは、smaboの使い方について説明します。
以下コマンドで、unityをROSで通信するためのサーバーを起動します。
ros2 run ros_tcp_endpoint default_server_endpoint
スマホ側で、インストールしたsmart_phone_robot(smabo用アプリ)を起動します。
アプリを起動すると、ipアドレスとポート番号を入力するオプション画面が表示されるので
- ip address : ラズパイ側のipアドレス
- port : 10000
と入力して「Connect」ボタンをクリックしてください。
ボタンをクリックし、しばらく待った後に「connected!!!!!!!」と表示されれば、接続が完了しています。
Note
この時、何度か試してみても「not connected」と表示され続ける場合は、ラズパイとスマホが異なるネットワークに接続されている可能性があるので確認してみてください。
以下コマンドで、smaboの表情を変更するノードが起動します。
ros2 run smabo_pkg impression_pub
ノードを起動したら、「0~5の間の整数」を入力することでsmaboの表情を変化させることが出来ます。
以下コマンドで、スマホのジャイロの情報を取得するノードが起動します。
ros2 run smabo_pkg gyro_sub
以下コマンドで、スマホの加速度を取得するノードが起動します。
ros2 run smabo_pkg accel_sub
以下コマンドで、スマホのコンパス情報を取得するノードが起動します。
ros2 run smabo_pkg magnetic_sub
右腕用のサーボはpca9685の6pin、左腕用のサーボは7pinに接続した状態で実施してください。
i2c-1の権限を変更します。
sudo chmod 666 /dev/i2c-1
プログラムを実行し、「-90~90度」の間の整数を入力すると、smaboの腕を指定した角度に動かすことができます。
cd ~/smabo/simple_code
python3 pca9685_simple_hand.py
「pca9685を制御するノード」を立ち上げます。
ros2 run smabo_pkg pca9685_controller
次に、新しいターミナルを立ち上げて「smaboの腕を制御するノード」を立ち上げます。
ros2 run smabo_pkg simple_hand_angle_commander
上記のノードを立ち上げ、「-90~90度」の間の整数を入力すると、smaboの腕を指定した角度に動かすことができます。
i2c-1の権限を変更します。
sudo chmod 666 /dev/i2c-1
頭用のサーボはpca9685の5pinに接続した状態で実施してください。
「pca9685を制御するノード」を立ち上げます。
ros2 run smabo_pkg pca9685_controller
次に、新しいターミナルを立ち上げて「smaboの頭を制御するノード」を立ち上げます。
ros2 run smabo_pkg head_arrow_key_commander
上記のノードを立ち上げ、"z"キーを入力すると左方向に回転、"x"キーを入力すると右方向に回転します。
超音波センサにはhc-sr04を使用します。
「超音波センサからの距離情報を取得するコード」を実行します。
cd ~/smabo/simple_code
python3 ultrasonic_sr04.py
コードを実行すると下記のように、超音波センサで計測した距離(cm)が表示されます。
13.17 cm
13.18 cm
13.21 cm
13.20 cm
13.21 cm
「超音波センサからの距離情報を取得するノード」を立ち上げます。
ros2 run smabo_pkg ultrasonic_sensor
コードを実行すると下記のように、超音波センサで計測した距離(m)が表示されます。
[INFO] [1704560652.946915129] [ultrasonic_sensor]: distance: 0.04410195350646973 m
[INFO] [1704560652.951719651] [ultrasonic_sensor]: distance: 0.1263386607170105 m
[INFO] [1704560653.041953099] [ultrasonic_sensor]: distance: 0.12637817859649658 m
[INFO] [1704560653.143156803] [ultrasonic_sensor]: distance: 0.12622010707855225 m
[INFO] [1704560653.242842910] [ultrasonic_sensor]: distance: 0.12665480375289917 m
video0 の権限を変更します。
sudo chmod 666 /dev/video0
「カメラから取得した画像をflaskのサーバ上で表示するコード」を実行します。
cd ~/smabo/simple_code
python3 cam_stream_on_flask.py
ターミナル上に表示されるアドレス(192.168.***.***:5000/)にアクセスするとカメラから取得された画像が表示されます。
「カメラから画像を取得するノード」を立ち上げます。
ros2 run smabo_pkg cam_stream
新しくターミナルを立ち上げて、「/imageトピックから購読した画像をflask上で表示するノード」を立ち上げます。
ros2 run smabo_pkg flask_image_display
ターミナル上に表示されるアドレス(192.168.***.***:5000/)にアクセスするとカメラから取得された画像が表示されます。
「移動ロボットのsmaboを制御するコード」を実行します。
cd ~/smabo/simple_code
python3 control_move_smabo.py
キーボードの以下ボタンを押すことで制御できます。
q w e r
a s d
z x c v
s: 停止
w: 前進
x: 後進
d: 右回転(その場回転)
a: 左回転(その場回転)
e: 左車輪のみ前進
c: 左車輪のみ後退
q: 右車輪のみ前進
z: 右車輪のみ後退
r: 加速
v: 減速
「移動ロボット用のdcモータを制御するノード」を立ち上げます。
ros2 run smabo_pkg move_robot_dc_controller
新しくターミナルを立ち上げて、「dcモータ制御用ノードに走行指示を送るノード」を立ち上げます。
ros2 run smabo_pkg move_robot_commander
キーボードの以下ボタンを押すことで制御できます。
q w e r
a s d
z x c v
s: 停止
w: 前進
x: 後進
d: 右回転(その場回転)
a: 左回転(その場回転)
e: 左車輪のみ前進
c: 左車輪のみ後退
q: 右車輪のみ前進
z: 右車輪のみ後退
r: 加速
v: 減速
i2c-1の権限を変更します。
sudo chmod 666 /dev/i2c-1
各サーボはpca9685の以下のpinに接続してください。
- link1(頭のサーボと共有): 5pin
- link2: 13pin
- link3: 14pin
- gripper: 15pin
「pca9685を制御するノード」を立ち上げます。
ros2 run smabo_pkg pca9685_controller
次に、新しいターミナルを立ち上げて「ロボットアームの各リンク、グリッパを設定するノード」を立ち上げます。
ros2 run smabo_pkg link3_robot_arm_commander
キーボードの以下ボタンを押すことで制御できます。
q w e
a s d
z x
z: link1を正方向に回転
x: link1を逆方向に回転
q: link2を正方向に回転
a: link2を逆方向に回転
w: link3を正方向に回転
s: link3を逆方向に回転
e: グリッパを開く
d: グリッパを閉じる