Windows10のBashでROSとRVizを実行する

MPRGの荒木です.はじめましてになりますがいきなり変わり種です.

今回はWindows10のBashでROS IndigoとRVizを実行してみましたのでレポートします.

 

2017/09/25 追記
4月のWindowsのCreators Updateにてbash on Windowsでネットワークの機能が使えるようになったようです.
これにより,getifaddrs/preloadの導入は不要となりました.

Bash on Windows10?

いきなり私事ですが,最近LenovoのThinkPad T460sを購入しました.もちろんWindowsとUbuntuのデュアルブートにしてUbuntuでROSを実行していましたが,WindowsでもBashが使えるようになった事を知り,早速Bashを使ってみました.情報を集めていると,なんとBash on Windows10はUbuntuのものであることがわかりました.しかもバージョンは14.04 LTSです.ROS Indigoがサポートされているバージョンになります.

ここで私は何を思ったのか……

「じゃあ,Windows10でROS動く?!インストールしてみるか!」

調べてみると,ROSAnswersで動作報告がありました:
Installing ROS on Ubuntu Bash in Windows 10 – ROS Answers: Open Source Q&A Forum

というわけで……早速やってみました.

 

Bashのインストール

BashをWindows10で使えるようにする方法は調べればたくさん出てくると思いますので,簡単な説明にとどめます.

  1. Windows10 Anniversary Updateを適用
  2. コントロールパネルから「プログラムと機能」を開く
  3. 左側メニューより「Windowsの機能の有効化または無効化」を開く
  4. 「Windows Subsystem for Linux(Beta)」にチェックを入れ,OKを押す
  5. 再起動
  6. スタートメニューの「設定」(「電源」の近く)を押す
  7. 「更新とセキュリティ」を押す
  8. 「開発者向け」の「開発者モード」のラジオボタンを押す
  9. 再起動
  10. コマンドプロンプトを開く
  11. 「bash」と入力してEnter
  12. 画面の指示に従い,ユーザ名とパスワードを入力

無事にbashが使えるようになります.pwdやlsなどのコマンドを試してみてください(ifconfigなど一部使えないコマンドもあります).

これ以降は特に断りがない限り,コマンド入力はすべてBashで行います.コマンドプロンプトで「bash」と入力してからコマンドを実行してください.

 

/etc/hostsにhostnameを追加

一部の環境では,sudoコマンドを実行すると次のようなエラーが表示されることがあります:

ryorsk@RYORSK-T460S:~$ sudo 
sudo: ホスト RYORSK-T460S の名前解決ができません

これは/etc/hostsにhostnameが存在しないのが原因です.次のコマンドを実行することで解決します:

sudo sh -c 'echo 127.0.1.1 $(hostname) >> /etc/hosts'

これを実行した以降はsudoを実行してもエラーが出なくなります.

 

ROSのインストール

いよいよROSをインストールします.と言っても,インストールまではUbuntuと同じ手順で問題ありません.

ROSのインストールもROS.orgに紹介されている手順でインストールできます:
ja/indigo/Installation/Ubuntu – ROS Wiki

または,山内先生の講義Webページも参考にしてください:
ROS Indigoのインストール – ロボット理工学科 演習

pythonやOpenCVなど,ありとあらゆるパッケージがインストールされるため,それなりに時間がかかります.

 

roscoreを起動してみる

2017/09/25 追記
4月のWindowsのCreators Updateにてbash on Windowsでネットワークの機能が使えるようになったようです.
roscoreを実行すれば,普通に起動するようになりました.

インストールが終わったら,roscoreコマンドでROSを起動してみます.ところが……:

ryorsk@RYORSK-T460S:~$ roscore
 ... logging to /home/ryorsk/.ros/log/0aca7518-ada8-11e6-b0d5-c85b76322a4a/roslaunch-RYORSK-T460S-149.log
 Checking log directory for disk usage. This may take awhile.
 Press Ctrl-C to interrupt
 Done checking log file disk usage. Usage is <1GB.

 started roslaunch server http://RYORSK-T460S:53406/
 ros_comm version 1.11.20 

SUMMARY 
======== 

PARAMETERS
 * /rosdistro: indigo
 * /rosversion: 1.11.20 

NODES 

Traceback (most recent call last): 
  File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/__init__.py", line 307, in main 
    p.start() 
  File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/parent.py", line 279, in start 
    self.runner.launch() 
  File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/launch.py", line 654, in launch 
    self._setup() 
  File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/launch.py", line 630, in _setup 
    self._launch_master() 
  File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/launch.py", line 394, in _launch_master 
    validate_master_launch(m, self.is_core, self.is_rostest) 
  File "/opt/ros/indigo/lib/python2.7/dist-packages/roslaunch/launch.py", line 83, in validate_master_launch 
    if not rosgraph.network.is_local_address(m.get_host()): 
  File "/opt/ros/indigo/lib/python2.7/dist-packages/rosgraph/network.py", line 176, in is_local_address 
    local_addresses = ['localhost'] + get_local_addresses() 
  File "/opt/ros/indigo/lib/python2.7/dist-packages/rosgraph/network.py", line 219, in get_local_addresses 
    for iface in netifaces.interfaces(): 
OSError: [Errno 22] Invalid argument

残念ながらエラーです.ネットワーク関係でしょうか.

先程のROSAnswersに何か有力なレスポンスがないか調べてみましたが,案の定ついていました.

Update (2016-11-11): the Anniversary Update didn’t improve things, but as of Build 14965, the below mentioned getifaddrs preload library is no longer needed. Network interface enumeration now works correctly. If you are having problems (permission denied errors from Python netifaces.interfaces(), see this comment about the Teredo interface.

<中略>

To get around getifaddrs(..) not working, I wrote gavanderhoorn/getifaddrs_preload, whichLD_PRELOADs itself and returns the minimal data needed to get netifaces.interfaces() to work. This just always returns 127.0.0.1, and whatever you have ROS_IP set to.

※ via http://answers.ros.org/question/238646/installing-ros-on-ubuntu-bash-in-windows-10/

どうやらこのコメントを書いた方が,ネットワークの設定を吐き出してroscoreを起動するためのライブラリを作成したようです.これを利用してみましょう.

 

getifaddrs/preloadの導入

2017/09/25 追記
4月のWindowsのCreators Updateにてbash on Windowsでネットワークの機能が使えるようになったようです.
本章の作業は不要となりました.

適当な場所にgit cloneします.私は何も考えずにホームディレクトリにやってしまいましたが,ROS用のディレクトリをもう少し上に作ってそこで実行することをおすすめします.

ryorsk@RYORSK-T460S:~$ git clone https://github.com/gavanderhoorn/getifaddrs_preload 
Cloning into 'getifaddrs_preload'... 
remote: Counting objects: 18, done. 
remote: Compressing objects: 100% (3/3), done. 
remote: Total 18 (delta 0), reused 0 (delta 0), pack-reused 15 
Unpacking objects: 100% (18/18), done. 
Checking connectivity... done.

続いて,cloneしてきたディレクトリに移動します.

ryorsk@RYORSK-T460S:~$ cd getifaddrs_preload/
ryorsk@RYORSK-T460S:~/getifaddrs_preload$ ls
Makefile README.md _getifaddrs.c

そして,makeでコンパイルします.

ryorsk@RYORSK-T460S:~/getifaddrs_preload$ make 
cc -shared -fPIC -g _getifaddrs.c -o _getifaddrs.so

 

getifaddrs/preloadを用いてroscoreを起動

2017/09/25 追記
4月のWindowsのCreators Updateにてbash on Windowsでネットワークの機能が使えるようになったようです.
getifaddrs_preloadは不要で,“roscore”で普通に起動します.

次のコマンドでroscoreを起動することで無事起動できます(できるはずです).

LD_PRELOAD=/(getifaddrs_preloadまでのフルパス)/_getifaddrs.so roscore
roscore

すると……次のようになりました:

ryorsk@RYORSK-T460S:~$ LD_PRELOAD=/home/ryorsk/getifaddrs_preload/_getifaddrs.so roscore 
... logging to /home/ryorsk/.ros/log/42970c4a-ae02-11e6-9f6f-c85b76322a4a/roslaunch-RYORSK-T460S-48.log 
Checking log directory for disk usage. This may take awhile. 
Press Ctrl-C to interrupt 
Done checking log file disk usage. Usage is <1GB. 

started roslaunch server http://RYORSK-T460S:54151/ 
ros_comm version 1.11.20 

SUMMARY 
======== 

PARAMETERS
 * /rosdistro: indigo
 * /rosversion: 1.11.20 

NODES 

auto-starting new master 
process[master]: started with pid [60] 
ROS_MASTER_URI=http://RYORSK-T460S:11311/ 

setting /run_id to 42970c4a-ae02-11e6-9f6f-c85b76322a4a 
process[rosout-1]: started with pid [73] 
started core service [/rosout]

roscoreはバッチリ起動しました!

 

RVizを起動するためにXmingをインストール

さて,RVizは動くのでしょうか?Windows上で動作するX Windows Systemのサーバをインストールすれば動くらしいです.

やってみました.

Xming X Server for Windows – Official Website から「Public Domain Releases」版をダウンロードします.
※「Xming-mesa」ではOpenGLが動作しないためエラーになります!「Xming」をダウンロードしてください.

Xming-install

ダウンロードしたら実行してインストールを開始します.
(間違えてmesaをダウンロードした時のキャプチャですが手順は同じです)

xming1

インストール先を指定して,Nextを押してください.通常はそのままで問題ありません.

xming2

スタートメニューにアイコンを作りたくない場合は「Don’t create s Start Menu folder」にチェックを入れて,Nextを押してください.作っても問題無い場合はそのままNextで構いません.

xming4

デスクトップやクイックランチャーにアイコンを登録できます.お好みの設定にチェックを入れてNextを押してください.

xming5

インストールが開始します.終了したら,「Launch Xming」にチェックを入れてFinishを押してください.

xming6

ファイアウォールの警告が出たら,プライベートネットワークにチェックを入れて「アクセスを許可する」を押してください.

xming7

タスクトレイで常駐が確認できればOKです.

xming8

 

RVizを起動

2017/09/25 追記
4月のWindowsのCreators Updateにてbash on Windowsでネットワークの機能が使えるようになったようです.
getifaddrs_preloadは不要で,“roscore”および“rviz”で普通に起動します.

いよいよRVizを起動します.起動する前に,ディスプレイの環境変数を変更しておきます.次のコマンドで可能です:

export DISPLAY=:0

変更できたら,roscoreを起動します.roscoreが起動していなければRVizは動きません.

LD_PRELOAD=/(getifaddrs_preloadまでのフルパス)/_getifaddrs.so roscore
roscore

roscoreが起動できたら,新しくコマンドプロンプトを開いてbashを起動し,RVizを起動します.
RVizもroscoreと同様にgetifaddr_preloadを用います.

LD_PRELOAD=/(getifaddrs_preloadまでのフルパス)/_getifaddrs.so rviz
rviz

起動できました!:

ryorsk@RYORSK-T460S:~$ LD_PRELOAD=/home/ryorsk/getifaddrs_preload/_getifaddrs.so rviz 
[ INFO] [1479531158.118843600]: rviz version 1.11.15 
[ INFO] [1479531158.119404700]: compiled against Qt version 4.8.6 
[ INFO] [1479531158.120331700]: compiled against OGRE version 1.8.1 (Byatis) 
[ INFO] [1479531158.393109400]: Stereo is NOT SUPPORTED 
[ INFO] [1479531158.393583000]: OpenGl version: 2.1 (GLSL 1.2). 
ryorsk@RYORSK-T460S:~$

rviz

 

おわりに

とりあえずroscoreとRVizは動きましたが,実際にトピックのPublish/Subscribeが出来るか等は未確認です.まずはTurtleBotで動作確認をしてみたいと思います.動作が出来たらまたレポートします.

 

参考URL

Installing ROS on Ubuntu Bash in Windows 10 – ROS Answers: Open Source Q&A Forum
ja/indigo/Installation/Ubuntu – ROS Wiki
ROS Indigoのインストール – ロボット理工学科 演習
Xming X Server for Windows – Official Website
Bash on Ubuntu on Windows とX Windowの組み合わせで日本語表示と日本語入力: tonopぶらり
os.networkInterfaces error in NodeJS / Yeoman · Issue #468 · Microsoft/BashOnWindows · GitHub
GitHub – gavanderhoorn/getifaddrs_preload: NOTE: as of Win10 build 14965, the preload trick is NOT necessary anymore

 

 

蛇足

ThinkPad T460sでUbuntu 14.04LTSをデュアルブートすると少し不具合がありました.それについてもどこかで共有する予定です.

Windows10のBashでROSとRVizを実行する」への6件のフィードバック

    1. コメントありがとうございます.
      今年の4月のCreators Updateでbash on Windowsがアップデートされ,ネットワーク接続のエミュレータが提供されるようになったようです(ifconfigなどのコマンドも使えるようになりました).
      これにより,getifaddrs_preloadが不要になったのだと思われます.
      記事に追記しておきます.情報ありがとうございました.

  1. usbカメラを使ってopencvで処理したいのですが、usbカメラを認識しません。解決策を教えていただけないでしょうか。

    1. コメントありがとうございます.
      こちらの環境でも確認しましたが,そもそもbash on Win10上でUSBデバイスの利用ができないようです.
      lsusbコマンドも使えないため,正攻法では出来ないかと思います.
      (USBメモリ等ストレージなら可能のようです:https://wpdev.uservoice.com/forums/266908-command-prompt-console-bash-on-ubuntu-on-windo/suggestions/16759696-add-usb-device-support)
      bash on Win10はアップデートを繰り返しているため,もしかすると今後利用できるようになるかもしれませんが,現時点ではデュアルブートや仮想マシン等でUbuntuを動作させるしか無いかと思います.

  2. 教えてください。
    sudo apt-get install ros-indigo-deaktop-fullと入力した後このようになります。

    パッケージリストを読み込んでいます… 完了
    依存関係ツリーを作成しています
    状態情報を読み取っています… 完了
    インストールすることができないパッケージがありました。おそらく、あり得
    ない状況を要求したか、(不安定版ディストリビューションを使用しているの
    であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
    動されていないことが考えられます。
    以下の情報がこの問題を解決するために役立つかもしれません:

    以下のパッケージには満たせない依存関係があります:
    ros-indigo-ros-base : 依存: ros-indigo-actionlib しかし、インストールされようとしていません
    依存: ros-indigo-bond-core しかし、インストールされようとしていません
    依存: ros-indigo-class-loader しかし、インストールされようとしていません
    依存: ros-indigo-dynamic-reconfigure しかし、インストールされようとし ていません
    依存: ros-indigo-nodelet-core しかし、インストールされようとしていません
    依存: ros-indigo-pluginlib しかし、インストールされようとしていません
    依存: ros-indigo-ros-core しかし、インストールされようとしていません
    E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

    1. コメントありがとうございます.
      aptの依存関係が壊れているようですので,次の事をお試しください.
      ・パッケージリストとインストール済みパッケージの更新
      sudo apt-get update
      sudo apt-get upgrade
      sudo apt-get dist-upgrade

      また,少々無理やりなやり方ですが,インストールコマンドに -f オプションをつけることで整合性チェックを無視して強制的にインストールすることができます(あまりおすすめはできません).

      差し支えなければbash on Win10の環境を再インストールすることが良いかと思います.
      下記を参考にしてください.
      http://www.atmarkit.co.jp/ait/articles/1610/05/news033.html

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA