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


Roomblock(5): 3Dプリンタで出力可能なフレーム構造

ルンバ,ラズベリーパイ,モバイルバッテリ,そしてレーザー距離センサといったRoomblockの部品を紹介しました.これらをルンバの上に載せるための,3Dプリンタで出力できる構造材を紹介します.

Battery stage

Battery stage

棚のような構造で,1番下の段にモバイルバッテリ,2番目の段にラズベリーパイ,1番上の段にRPLIDAR A2を載せます.動作中にモバイルバッテリが落ちてしまうことがあるので,1番下の段にはバッテリー固定用のベルトがつけられるようになっています.

Raspberry Pi stage

Raspberry Pi stage

部品をブロックのように交換したり追加したりして,機能を拡張することを狙っているので,”Roomblock”と名付けました.安直ですね.ラズベリーパイ用のボードカメラを固定するための部品も追加しました.

Roomblock's frame

Roomblock’s frame

ルンバとフレーム部分はベルクロテープで固定されているので,取り外しも簡単です.

この構造材は,比較的安価な3Dプリンタでも出力できるサイズで設計されています.確認には UP! plus2を使いましたが,ワークエリアが15cm x 15cm程度の3Dプリンタであれば,大抵の機種で出力できると思います.3Dデータ(STLファイル)は,Thingiverseからダウンロードすることができます.

Roomblockの詳細な作り方については,Instructablesで公開しています.ただし当社は,これらの内容によって生じるいかなる損害についても責任を負いません.興味がわいた方はあくまで自己責任で,チャレンジしてくださいね.


ROS + Snappy Ubuntu Core (2) : SnappyなROSパッケージを作ってみよう

前回はUbuntu Coreについて紹介しましたが,いわゆる”Snappyな”パッケージシステムは,Ubuntu Coreをインストールしなくても試すことができます.Ubuntu CoreはあくまでSnappyをパッケージシステムとして使っているにすぎません.今回は,通常のUbuntuの上で,”Snappyな”ROSパッケージを作ってみようと思います.

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

SnappyなROSパッケージの作り方のチュートリアルは,ここにあります.とりあえずこの通りに従ってみましょう.

ただし,これをやる前に,Snapcraft Tourのチュートリアルを一通り読むことをお勧めします.

以下の手順は,Ubuntu 16.04 + ROS Kineticで試したものです.
まず,SnappyのパッケージングツールであるSnapcraftをインストールします.

$ sudo apt install snapcraft

SnappyパッケージにするためのROSパッケージが必要ですが,自分でコードを打ち込むのはめんどくさいので,githubからros_tutorialのソースコードをcloneします.

$ mkdir -p catkin_ws/src
$ cd ~/catkin_ws/src
$ git clone https://github.com/ros/ros_tutorials.git

snapcraftで初期化します.

$ cd ~/catkin_ws
$ snapcraft init

snapというディレクトリができて,その下にsnapcraft.yamlというファイルができます.このファイルを,roscpp_tutorialsの中のバイナリが含まれるように,書き換えます.書き換え方はチュートリアルに解説があるので参照してみてください.雰囲気でわかると思います.

さて,いよいよパッケージを作成します.

$ cd ~/catkin_ws
$ snapcraft

なにやらネットワークからいろいろとダウンロードし始めました…snapcraftはcatkinワークスペースを理解できるので,package.xmlを見て,rosdepで必要なパッケージをダウンロードしているのです. 「必要なROSのパッケージは全部システム入ってるはずだけど?」と思われるかもしれませんが,Snappyパッケージは,アプリに必要なものを仮想コンテナにすべて含んだ形で持つので,作成の際にいちいちパッケージをダウンロードし,ソースコードならコンパイルして,仮想コンテナ内にインストールします. しばらくすると,処理が終わり,

Snapped talker-listener_0.1_amd64.snap

と,snapファイルが生成されます. これをインストールするには,

$ sudo snap install --dangerous publisher-subscriber_0.1_amd64.snap

とします.インストールされたか確かめて見ましょう.

$ snap list
Name Version Rev Developer Notes
core 16-2.26.9 2381 canonical -
talker-listener 0.1 x1 -

では,ノードを順番に起動してみましょう.

$ talker-listener.roscore
$ talker-listener.talker
$ talker-listener.listener

お馴染みの,talker-listenerのノードが動き始めたと思います.