Virtualbox内のROSからGoPiGoを動かす


前置き

大学の研究室でGoPiGoをrosで動かしてみようということになりました。
PCを一台用意し、その上にrosの環境を整えてやってみるという話だったのですが、
その前に自分のPC上から動かしてみようということで試してみました。
やっと動いたので、自分が実際にやった部分の流れをメモっていきたいと思います。

前提

PC側の設定

  • ホストOS : Windows10
  • 仮想マシン : Virtualbox
  • ゲストOS : ubuntu 16.04

GoPiGo側の設定

  • GoPiGo : GoPiGo3
  • RaspberryPi :Raspberry Pi 3 model B
  • OS : ubuntu mate 16.04

ゲストOSにはubuntu16.04がはいっており、GoPiGoにはubuntu mate16.04 が入っていることを前提とします。

環境構築は以下のページを参考にしました。

PC側の設定
【初心者でもわかる】VirtualBoxインストール方法を詳しく!
VirtualBoxにUbuntu 16.04をインストールする前にやること

GoPiGo側の設定
第48回「ラズベリーパイにUbuntu MATEをインストール!」
ROSでgopigo3を走らせる

作業の流れ

  1. Virtualboxのネットワークアダプタを「ブリッジ接続」にする。
    ※Windowsファイヤーウォールについても
  2. ゲストOSに「ROS」を入れる
  3. GoPiGoに「ROS」を入れる
  4. プログラムを書く
  5. プログラムを実行

1. Virtualboxのネットワークアダプタを「ブリッジ接続」にする。

GoPiGoを遠隔操作するためには、Virtualbox内の環境をGoPiGoと同じネットワークに接続する必要があります。
ブリッジ接続にすると、ホストマシンと同じネットワークに接続できるようになるため、その設定にします。

※以下のサイトを参考にしました。
【いまさら聞けない!エンジニアの基本シリーズ】 第2回 VirtualBox基本動作編

※無線で通信を行うため、無線通信のモジュールをブリッジに設定します。

☆Windowsのファイやウォールが邪魔をする。

環境によっては、Windows内のファイやウォールが理由でつながらない可能性があります。

自分の場合は、Symantecが起動していたため、GoPiGoとの相互通信ができませんでした。
そのため、GoPiGoと通信する時のみ、Symantecを無効にします。

※GoPiGoの通信が終わったら、Symantecを有効に戻してください。
※常に通信できるようにしたい場合は別途ファイやウォールの設定をいじくってみてください。

2. ゲストOSに「ROS」を入れる。

Virtualbox内のUbuntuに ROS Kinetic を入れる。

※以下のページを参考にしてインストールしました。
ROS Kinetic の Ubuntu へのインストール

ゲストOS内で実行

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-get update
sudo apt-get install ros-kinetic-desktop-full
sudo rosdep init
rosdep update
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
sudo apt-get install python-rosinstall

3. GoPiGoに「ROS」を入れる。

GoPiGo内のUbuntuに ROS Kinetic をいれる。
流れはVirtualboxの際とほとんど同じです。

※以下のページを参考にしてインストールしました。

ROS Kinetic の Ubuntu へのインストール
ROSでgopigo3を走らせる

GoPiGoで実行

2. ゲストOSに「ROS」を入れる や、上記の ROSでgopigo3を走らせる を参照してください。
※なお、GoPiGo内で実行してください。

4. プログラムを作成する。

GoPiGoと、ゲストOS内に、それぞれ必要なプログラムを作成していきます。

全体の構造としては以下のようになっています。
ゲストOS内でros masterとpublisherを動作させ、GoPiGo内でsubscriberを動作させます。
GoPiGo内のプログラムは、ゲストOS内のros masterを利用して通信するようにする。

基本的にゲストOS(Publisher)から指示を送り、GoPiGo(Subscriber)がそのデータを受け取り動作するという構成になっています。

ゲストOS側のプログラム

ゲストOS側では、基本的に移動の指示をGoPiGoに送ります。
※ファイル名はdirector.pyとする。

# director.py

#!/usr/bin/env python

import rospy
from std_msgs.msg import Float64

def straight_move_in(dict):

  pub = rospy.Publisher('gopigo', Float64, queue_size = 10)
  rospy.init_node('director', anonymous=True)
  pub.publish(dict)

if __name__ == "__main__":
  #10cmだけGoPiGoを前に進める
  straight_move_in(10)

GoPiGo側のプログラム

GoPiGo側では、送られてきた値の分だけ前進するようになっています。
※ファイル名はmove_gopigo.pyとする。

# move_gopigo.py

#!/usr/bin/env python
import rospy
import easygopigo3 as easy
from std_msgs.msg import Float64

gpg = easy.EasyGoPiGo3()

#Subscriberのcallback関数
#この中でgpgの様々な処理をさせる

def gopigo_callback(dist):
  #指定したcmだけ前に進む。
  gpg.drive_cm(dist.data, blocking=False)

def move_gopigo():
  rospy.init_node('gopigo_body', anonymous=True)
  rospy.Subscriber('gopigo', Float64, gopigo_callback)
  rospy.spin()

if __name__ == '__main__':
  move_gopigo()

5. プログラムを実行

ゲストOSGoPiGo側でそれぞれ作成したプログラムを実行していく。

ゲストOS側で ROS Master を起動

はじめに、ゲストOS側でROS Masterを実行するため、roscoreを実行

roscore

GoPiGo側のプログラムの実行

GoPiGo側ではまず、ROS masterのIPアドレスを設定する必要があります。

export ROS_MASTER_URI=http://<ゲストOSのIPアドレス>:11311

また、複数の媒体でする場合は、機体それぞれのIPアドレスを改めて設定してあげる必要がある。

export ROS_IP=<GoPiGoのIPアドレス>

その後、ゲストOSからの指示を受ける move_gopigo.py を実行。

python move_gopigo.py

ゲストOS側のプログラムを実行

ゲストOSも同様に自らのIPアドレスを指定

export ROS_IP=<ゲストOSのIPアドレス>

最後に、GoPiGoに指示を出す director.py を実行する。

python director.py

これでGoPiGo3が動作しました。