Help us understand the problem. What is going on with this article?

仮想マシン上で手軽にROSのサンプルを動かしてみる

More than 3 years have passed since last update.

はじめに

最近ROSを扱うよう司令が出ました。
何ができるのか確認するため、まずVagrant上でサンプルを動かしてみます。
最終的に、複数のVirtualBox上にROSノードを分散させて、サンプルを動かすところまでやります。

この記事の内容

  • Ubuntu-14.04のインストール
  • ROS indigoのインストール
  • turtlesim (ROSサンプル) を動かしてみる
  • 仮想環境を複製する
  • 複製した仮想環境で別々にROSノードを起動する

実施環境

  • Mac OS Sierra v10.12.2
  • Vagrant 1.8.7
  • VirtualBox 5.1.8

ROSとは

ROS Wikiより

ROS (Robot Operating System)はソフトウェア開発者のロボット・アプリケーション作成を支援するライブラリとツールを提供しています. 具体的には, ハードウェア抽象化, デバイスドライバ,ライブラリ,視覚化ツール, メッセージ通信,パッケージ管理などが提供されています.

ロボットなど機械制御のアプリケーション作成を支援するフレームワーク/ミドルウェアです。OSと名がついていますが、どちらかというと、ノード間通信プロトコルとしての側面が強いです。また、ROSに準拠したノードがすでにたくさん公開されており、それらを利用することで簡単にロボットアプリケーションを作成できるライブラリ群としても利用できます。

単一ホストでサンプル実行

VagrantでUbuntu-14.04を準備

Ubuntu-14.04のBoxをダウンロード

参考1:Vagrant+VirtualBoxでUbuntu環境構築 - Qiita
参考2:【Mac】vagrantでrosを使えるまで - Qiita

以下からBoxを探します。
A list of base boxes for Vagrant - Vagrantbox.es
今回は Ubuntu 14.04 (based on amd64 server iso file) を利用しました。(ROS Indigoがサポートする最新版が14.04のため)

vagrantにadd

vagrantにaddしますが、エラーが出ます。

$ vagrant box add ubuntu-14.04 https://github.com/kraksoft/vagrant-box-ubuntu/releases/download/14.04/ubuntu-14.04-amd64.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'ubuntu-14.04' (v0) for provider:
    box: Downloading: https://github.com/kraksoft/vagrant-box-ubuntu/releases/download/15.04/ubuntu-14.04-amd64.box
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

どうやら下記によれば、vagrantのバグとのこと。curlを使用不可にしてから再度実行すると成功しました。
参考:Vagrant1.8.7でbox addがエラーになる – ただいま名刺を切らしておりまして

$ sudo mv /opt/vagrant/embedded/bin/curl /opt/vagrant/embedded/bin/curl.bak
$ vagrant box add ubuntu-14.04 https://github.com/kraksoft/vagrant-box-ubuntu/releases/download/14.04/ubuntu-14.04-amd64.box

vagrantでUbuntu起動

ディレクトリを切り、Vagrantfileを作成します。

$ mkdir ~/Vagrant/ros_sample
$ cd ~/Vagrant/ros_sample
$ vi Vagrantfile

今回は複数ホストにノードを分散させたり、外からアクセスさせたりしたかったのでVagrantfile(その2)のようにしましたが、同一ホストで動かすだけならVagrantfile(その1)だけで大丈夫と思います。

  • IPを192.168.33.10
  • ROSの使用ポート11311をホストからゲストにフォワード
Vagrantfile(その1)
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.ssh.forward_agent = true
  config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"
  config.vm.box = "ubuntu14.04"
end
Vagrantfile(その2)
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.ssh.forward_agent = true
  config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"
  config.vm.box = "ubuntu14.04"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.network :"forwarded_port", guest: 11311, host: 11311 # ROSの使用ポート
end

起動してSSHで接続します。

$ vagrant up
$ vagrant ssh

GUI関連のインストール

サンプル(turtlesim)がGUI環境で動くので、GUI関連の設定を整えます。
参考2に記載のある通りにインストールしていくと、ラスト2行(コメントアウトの行)は、その前のインストールの途中で自然とインストールされたので、スキップしました。

$ sudo apt-get install -y xfce4
$ sudo add-apt-repository ppa:gnome3-team/gnome3
$ sudo apt-get update
$ sudo apt-get install -y gnome-shell ubuntu-desktop
$ # sudo apt-get install gdm
$ # sudo dpkg-reconfigure gdm

Ubuntu上にROSをインストール

参考:ja/indigo/Installation/Ubuntu - ROS Wiki

時刻設定

なくてもいいかもですが、参考2の通りに設定しておきました。

$ sudo apt-get install -y chrony
$ sudo ntpdate ntp.nict.jp

ROSリポジトリと公開鍵の追加

公開鍵はhttps://raw.githubusercontent.com/ros/rosdistro/master/ros.keyから取得する流儀もあるようです。

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ wget http://packages.ros.org/ros.key -O - | sudo apt-key add -

ROSのインストール

ROS Wikiによると、sudo apt-get install ros-indigo-***は、幾つか選択肢があるらしいです。好みに合わせて変えてください。

  • すべてのデスクトップ環境のインストール (推奨) : ros-indigo-desktop-full
  • デスクトップ環境のインストー : ros-indigo-desktop
  • ROSベース (最小構成) : ros-indigo-ros-base
$ sudo apt-get update
$ sudo apt-get install -y ros-indigo-desktop-full

依存関係rosdepの初期化

$ sudo rosdep init
$ rosdep update

環境設定

$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

rosinstallのインストール

$ sudo apt-get install -y python-rosinstall

環境変数のロード

$ source /opt/ros/indigo/setup.bash

ROSワークスペースの作成と初期化

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ cd ~/catkin_ws/
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash

ROS環境設定

.bashrcにROS用の設定を追加して読み込み。

$ vi ~/.bashrc
$ source ~/.bashrc

Vagrantfileと同様、同一ホストで動かすだけなら.bashrc(その1)で大丈夫だと思います。今回は複数ホストにノードを分散させるため、今回は.bashrc(その2)のようにしました。

ちなみに、末尾にsource /opt/ros/indigo/setup.bashの記載があるはずですが、これはsource ~/catkin_ws/devel/setup.bashへ書き換えちゃうのが正解みたいです。

.bashrc(その1)
source ~/catkin_ws/devel/setup.bash

export ROS_HOSTNAME=localhost
export ROS_MASTER_URI=http://${$ROS_HOSTNAME}:11311
export DISPLAY=:0

alias cw='cd ~/catkin_ws'
alias cs='cd ~/catkin_ws/src'
alias cm='cd ~/catkin_ws && catkin_make'

$ROS_IPはVagrantfileと合わせます。

.bashrc(その2)
source ~/catkin_ws/devel/setup.bash

export ROS_IP=192.168.33.10
export ROS_MASTER_URI=http://192.168.33.10:11311
export DISPLAY=:0

alias cw='cd ~/catkin_ws'
alias cs='cd ~/catkin_ws/src'
alias cm='cd ~/catkin_ws && catkin_make'

サンプルを動かしてみる

マスター起動

ROSマスター(roscore)を起動します。

$ roscore

操作される側のシミュレータ起動

これはGUI環境で起動してください。亀さんが出てきます。

$ rosrun turtlesim turtlesim_node

スクリーンショット 2016-12-15 23.07.32.png

操作する側のコンソール起動

起動したら、十字キーで亀を操作できます。

$ rosrun turtlesim turtle_teleop_key

分散環境でサンプル実行

仮想環境を複製する

分散環境での実行を試してみるため、VirtualBoxを複製します。

Vagrantをパッケージ化

$ cd ~/Vagrant/ros_sample
$ vagrant package
$ vagrant box add ros_on_ubuntu-14.04 ./package.box

新しいVirtualBoxを起動

$ mkdir ~/Vagrant/ros_sample2
$ cd ~/Vagrant/ros_sample2
$ vi Vagrantfile
$ vagrant up
Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.ssh.forward_agent = true
  config.vm.box_url = "file:///Users/ryosuke/Vagrant/ros_sample/package.box"
  config.vm.box = "ros_on_ubuntu-14.04"
  config.vm.network "private_network", ip: "192.168.33.11"
end

ROS環境設定の変更

.bashrcにROS用の設定を追加して読み込み。

$ vi ~/.bashrc
$ source ~/.bashrc
  • $ROS_IPはVagrantfileと合わせます。
  • $ROS_MASTER_URIは先に作成したホストのIPに合わせます。
.bashrc
source ~/catkin_ws/devel/setup.bash

export ROS_IP=192.168.33.11
export ROS_MASTER_URI=http://192.168.33.10:11311
export DISPLAY=:0

alias cw='cd ~/catkin_ws'
alias cs='cd ~/catkin_ws/src'
alias cm='cd ~/catkin_ws && catkin_make'

サンプルを動かしてみる

マスター起動

先に作成したホスト192.168.33.10で起動します。

$ roscore

操作される側のシミュレータ起動

複製したホスト192.168.33.11で起動します。先程同様、GUI環境で起動してください。

$ rosrun turtlesim turtlesim_node

操作する側のコンソール起動

先に作成したホスト192.168.33.10で起動します。

$ rosrun turtlesim turtle_teleop_key
ryskiwt
IoTプラットフォームを手がけるベンチャー企業でVPoPをやっています。 Golang/Java/Python/JavaScript、統計学/時系列解析/信号処理/移動体通信工学
aptpod
"日本のIoT、M2Mを牽引するテクノロジーカンパニーです。⾃動⾞やロボット・産業機械などから短周期に発生する制御・センサーデータをモバイル・インターネット網を介し、⾼速・大容量且つ安定的に、そして双方向に伝送し、回収データの可視化・解析や遠隔制御を実現するプロダクト開発を行っています。"
https://www.aptpod.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした