ROS + Snappy Ubuntu Core (4) : Raspberry Pi 3へのUbuntu Coreのインストール

このページの内容に従い,Raspberry Pi 3にUbuntu Coreをインストールしてみます.

以下の作業は,Ubuntu 16.04の環境で行いました.まず,Ubuntu Core imageにある,’Ubuntu Core 16 image for Raspberry Pi 3’のイメージファイルをダウンロードします.320MBありました.

つぎにこれをMicroSDカードにコピーします.手元の環境ではMicroSDカードをカードリーダに挿すと/dev/sdaとして認識されたので,

$ xzcat ubuntu-core-16-pi3.img.xz | sudo dd of=/dev/sda bs=32M
$ sync

としました.

RaspberryPi3を先ほど作成したMicorSDカードで起動します.

Raspberry Pi 3 の起動画面

最初の起動の際には,コンソールからのログインが必要なので,キーボードとディスプレイを接続しておきます.

進むにはubuntu.comのアカウントが必要

いきなり詰まってしまいました.login.ubuntu.comのアカウントのメールアドレスを入力せよ,と言われます.Ubuntu Coreの使用には,ubuntu.comのアカウント登録が必要のようです.インストールにはインターネット接続が前提なので,proxy環境などでは困りそうです.

別のPCからlogin.ubuntu.comにアクセスして,アカウントを作成します.

ubuntu.comのアカウント作成画面

さらに,そのままだとssh keyが無いといわれます.login.ubuntu.comのsshのページでsshの公開鍵を設定しておく必要があるようです.この公開鍵に対応する秘密鍵による認証で,Raspberry Pi 3にsshでログインすることができます.

SSH Keysの設定

自分のマシンがUbuntuの場合,自分のマシン上で

$ ssh-keygen

とコマンドを打ち,パスワード等を設定します.~/.ssh/id_rsa.pubというファイルができるはずなので,その中身をコピーして,SSH Keysのフォームに貼り付けます.

SSH Keysのページでssh keyを設定したマシンからは,Raspberry Piにsshでログインできるようになります.usernameは,ubuntu.comで設定したユーザ名です.Raspberry Pi3のIPアドレスは,DHCPで取得され,コンソール画面に表示されています.

$ ssh username@192.168.0.10

初期状態では,コマンドやアプリはほとんど入っていません.Ubuntuでお馴染みのaptやdpkgと言ったコマンドも使えません.今後,snappyパッケージを入れることで拡張していきますが,まずパッケージ一覧をWebブラウザで見るためのsnapwebパッケージをインストールしてみましょう.

$ sudo snap login username@example_domain.com
$ sudo snap install snapweb
$ snap list
Name        Version       Rev   Developer  Notes
core        16-2          1443  canonical  -
pi2-kernel  4.4.0-1030-3  22    canonical  -
pi3         16.04-0.5     6     canonical  -
snapweb     0.26-10       305   canonical  -

Webブラウザで,”http://192.168.0.10:4200/”にアクセスしてみます.

snapwebの画面

snapwebの画面

今インストールされているパッケージ一覧が見えたりします.ストアもあるようですが,

App storeの画面

App storeの画面

うーん,よくわかりませんが,ほとんどアプリは無いように見えます.


ROSワークショップ初級編を開催しました

今回も有楽町にてROSワークショップ初級編を開催しました.
準備万端でご参加いただきサクサクと進みました.お疲れ様でした!

初級編では環境の構築からセンシングデバイス,サーボの実機をROSで動かすところまで半日で習得できます.
時間中にはROSに関するお困りごとだけでなく,社内でOSSを運用していく際の疑問点等にも随時お答えしています.

9-10月のワークショップ日程を公開中です!

ROSを初めて勉強する人へのブログも公開しています. ご参考になさってください.

プライベートワークショップ,その他OSSに関するご相談も承っております.
お気軽にお問合せください!
info[at]opensource-robotics.tokyo.jp


名古屋でのROSワークショップ,始めます!

これまで東京都内を中心に開催してきた弊社のROSワークショップですが,
2017年9月から,名古屋でもROSワークショップの開催を始めます!

(受付終了しました) 9月5日(火)13:30~ (名古屋) ROSワークショップ初級編
(受付終了しました) 9月15日(金)13:30~ (名古屋) ROSワークショップ初級編

場所: COffice名古屋伏見 (伏見駅,名古屋広小路伏見中駒ビル5F)

ROSの初歩をスピーディに習得したい方,ROSの疑問点を解消したい方,中部地方の方の参加をお待ちしております.

もちろんこれまでどおり東京でもワークショップを開催しておりますので,お選びいただけます.

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

また,ROSワークショップ中級編についても名古屋にて開催できるようになりました.ご要望があり次第,日程を調整いたしますのでメイルにてお問い合わせください.ただし,初級編を受講した方を対象としております.

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp


2017年9月-10月のROSワークショップ日程

以下日程でROSワークショップを行います.
9月から名古屋でも開催いたします!

 9月05日(火)13:30~ (名古屋)ROSワークショップ初級編
 9月07日(木)13:30~ ROSワークショップ初級編
 9月15日(金)13:30~ (名古屋)ROSワークショップ初級編
 9月27日(水)13:30~ ROSワークショップ初級編
10月04日(水)13:30~ ROSワークショップ初級編
10月18日(水)13:30~ ROSワークショップ初級編
10月24日(火)13:30~ ROSワークショップ初級編

場所は都内・有楽町の会議室または名古屋市内での実施を予定しています.

中級編についてはご要望があり次第,日程を調整いたしますのでメイルにてお問い合わせください.
(初級編を受講した方を対象としております.中級マニピュレーション編のページまたは中級・自律移動編のページをご参照ください)

お申込みは以下より詳細をご確認の上,ページ内のお申込みリンクよりエントリをお願い致します.

ROSワークショップ初級編

上記以外での日程の調整,その他ご相談,開発委託,出張ワークショップ,カスタマイズワークショップも承っております.
お気軽にご相談ください.
info[at]opensource-robotics.tokyo.jp

IMG_20151112_182120


ROS + Snappy Ubuntu Core (3) : SnappyなROSパッケージの中身

Snappy + ROS, https://www.crowdsupply.com/krtkl/snickerdoodle/updates/1890

作成したSnappyのパッケージはどういう仕組みで動いているのでしょうか?

$ which talker-listener.listener 
/snap/bin/talker-listener.listener
$ ls -l /snap/bin/talker-listener.listener 
lrwxrwxrwx 1 root root 13 Jul 21 16:04 /snap/bin/talker-listener.listener -> /usr/bin/snap

となっています.これは,以下を実行するのと等価になるようです.

$ snap run talker-listener.listener

snapファイルは,単に/snap/に展開されるだけです.currentというのが最新版ですが,これはx1へのシンボリックリンクになっています.容易にロールバックできるようにするためなのでしょう.

$ ls -l /snap/talker-listener/
total 0
lrwxrwxrwx  1 root root   2 Jul 21 16:04 current -> x1
drwxrwxr-x 10 root root 222 Jul 21 16:00 x1
$ ls /snap/talker-listener/current
bin                       command-roscore.wrapper  etc  meta  snap  var
command-listener.wrapper  command-talker.wrapper   lib  opt   usr

command-listener.wrapperというのが目に付きます.中身を見ると,

#!/bin/sh
export PATH="$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu"
export ROS_MASTER_URI=http://localhost:11311
export ROS_HOME=${SNAP_USER_DATA:-/tmp}/ros
export LC_ALL=C.UTF-8
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu
export PYTHONPATH=$SNAP/usr/lib/python2.7/dist-packages:$PYTHONPATH
export PATH=$PATH:$SNAP/usr/bin


# Shell quote arbitrary string by replacing every occurrence of '
# with '\'', then put ' at the beginning and end of the string.
# Prepare yourself, fun regex ahead.
quote()
{
    for i; do
        printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/"
    done
    echo " "
}

BACKUP_ARGS=$(quote "$@")
set --

if [ -f $SNAP/opt/ros/kinetic/setup.sh ]; then
    _CATKIN_SETUP_DIR=$SNAP/opt/ros/kinetic . $SNAP/opt/ros/kinetic/setup.sh
fi

eval "set -- $BACKUP_ARGS"

export LD_LIBRARY_PATH="$SNAP/opt/ros/kinetic/lib:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH=$SNAP_LIBRARY_PATH:$LD_LIBRARY_PATH
exec "rosrun" roscpp_tutorials listener "$@"

となっており,ROSの環境設定などはこのラッパーファイルで行われた上で,コマンドが実行されるようです.つまり,いつもROSでやっているような”source setup.bash”などは必要ないことになります.楽になりそうですね.

snapパッケージにはほかに何が含まれているのでしょうか.

$ tree -L 3 -d /snap/talker-listener/current/
/snap/talker-listener/current/
├── bin
├── etc
│   ├── ca-certificates
│   │   └── update.d
│   ├── dpkg
│   │   └── dpkg.cfg.d
│   ├── emacs
│   │   └── site-start.d
│   ├── gss
│   │   └── mech.d
│   ├── ldap
│   ├── openmpi
│   ├── perl
│   │   ├── CPAN
│   │   └── Net
│   ├── python2.7
│   ├── python3.5
│   ├── sgml
│   ├── ssl
│   │   ├── certs
│   │   └── private
│   ├── systemd
│   │   └── system
│   └── xml
├── lib
│   └── x86_64-linux-gnu
├── meta
│   └── gui
├── opt
│   └── ros
│       └── kinetic
├── snap
├── usr
│   ├── bin
│   ├── include
│   │   ├── apr-1.0
│   │   ├── arpa
│   │   ├── asm-generic
│   │   ├── boost
│   │   ├── c++
│   │   ├── console_bridge
│   │   ├── drm
│   │   ├── gtest
│   │   ├── hwloc
│   │   ├── infiniband
│   │   ├── libltdl
│   │   ├── linux
│   │   ├── log4cxx
│   │   ├── misc
│   │   ├── mtd
│   │   ├── net
│   │   ├── netash
│   │   ├── netatalk
│   │   ├── netax25
│   │   ├── neteconet
│   │   ├── netinet
│   │   ├── netipx
│   │   ├── netiucv
│   │   ├── netpacket
│   │   ├── netrom
│   │   ├── netrose
│   │   ├── nfs
│   │   ├── numpy -> ../lib/python2.7/dist-packages/numpy/core/include/numpy
│   │   ├── openmpi -> ../lib/openmpi/include
│   │   ├── protocols
│   │   ├── python2.7
│   │   ├── rdma
│   │   ├── rpc
│   │   ├── rpcsvc
│   │   ├── scsi
│   │   ├── sound
│   │   ├── uapi
│   │   ├── uuid
│   │   ├── video
│   │   ├── x86_64-linux-gnu
│   │   └── xen
│   ├── lib
│   │   ├── compat-ld
│   │   ├── dpkg
│   │   ├── emacsen-common
│   │   ├── gcc
│   │   ├── gold-ld
│   │   ├── lapack
│   │   ├── ldscripts
│   │   ├── libblas
│   │   ├── mime
│   │   ├── openmpi
│   │   ├── pkgconfig
│   │   ├── python2.7
│   │   ├── python3
│   │   ├── python3.5
│   │   ├── sasl2
│   │   ├── sbcl
│   │   ├── ssl
│   │   ├── valgrind
│   │   └── x86_64-linux-gnu
│   ├── sbin
│   ├── share
│   │   ├── aclocal
│   │   ├── applications
│   │   ├── apps
│   │   ├── apr-1.0
│   │   ├── bash-completion
│   │   ├── binfmts
│   │   ├── boostbook
│   │   ├── boost-build
│   │   ├── bug
│   │   ├── ca-certificates
│   │   ├── cmake-3.5
│   │   ├── debhelper
│   │   ├── dh-python
│   │   ├── distro-info
│   │   ├── doc
│   │   ├── doc-base
│   │   ├── docutils
│   │   ├── dpkg
│   │   ├── emacs
│   │   ├── glib-2.0
│   │   ├── icu
│   │   ├── libtool
│   │   ├── lintian
│   │   ├── man
│   │   ├── mime
│   │   ├── mpi-default-dev
│   │   ├── numpy
│   │   ├── openmpi
│   │   ├── perl
│   │   ├── perl5
│   │   ├── pixmaps
│   │   ├── pkgconfig
│   │   ├── pyshared
│   │   ├── python
│   │   ├── python3
│   │   ├── sgml
│   │   ├── sgml-base
│   │   ├── xml
│   │   └── xml-core
│   └── src
│       └── gtest
└── var
    └── lib
        ├── sgml-base
        ├── systemd
        └── xml-core

144 directories

ワオ! talker-listenerのsnapパッケージには,ROSはもちろん,必要なLinuxシステムのディレクトリ構造がまるごと含まれています.ちょっと無駄な気がしますね…しかし,これがdockerなどで最近の流行りの,アプリごとに1つのコンテナを持つ(コンテナ仮想化),というやり方なのですね.

ちなみに,生成されたsnapファイルは,

$ ls -sh talker-listener_0.1_amd64.snap 
154M talker-listener_0.1_amd64.snap

なんと154Mbyteもあります.こんなに大きくて,パッケージが増えた時には大丈夫なんでしょうか…どう見ても必要のないファイルがパッケージにたくさん含まれているので,このへんはおそらく解決する方法があるのでしょう.