くいでのあるあし

ロボットの研究とか たぶんそのままだと役に立たない

vim-ros とcatkin-toolsの設定

はじめに

ROSをVimでコーディングする際のプラグインとしてtaketwo/vim-rosが挙げられているみたいですgithub.com

このブログでも結構昔に 書いたことがあった様子.忘れてたけれど.

自分の.vimrc には書いてあったけれどまともに使っていませんでした. しかしVimのQuickfixを知り,自分が使っているcatkin-toolsでの設定に気づいたら確かに使えるなぁって思ったのでメモしておくことにしました.

しかしながらこのプラグインはPython2に依存しています. ROS2への以降もそろそろ現実的になったような気がする今日このごろになっては遅い話なので話半分のつもりで書きます.

環境とか

  • Ubuntu16.04
  • sudo apt install vim-nox-py2 でインストールしたVim7.4
  • NeoBundleでVimプラグインを導入
  • catkin-tools

本当はNeoBundleも開発が止まって今はDeinになっているようなのでそっちのほうがいいとは思っています. ただ現在の最新版がVim8以降を対象としていて,それ以前は対応してません. 多分Ubuntu18.04以降だとVim8以降が普通にインストールされるはず.

ROS1でのビルドは流石にみんながindigo以降を使っていると思われるので,

  • catkin_make
  • catkin-tools
  • colcon のどれかを使っているはずです.

個人の感想ですが,taketwo/vim-rosプラグインではcatkin_makeの場合はすんなり動きそうです. colconは試してないので知りません. catkin-toolsはcatkin_make コマンドより,出力の見た目とかサブコマンドの使い勝手が気に入っているので移行して使っているのですが,プラグインに対する設定に注意が要るようです.

(catkin-toolsでは$ catkin build --this のように叩きます)

Vimでの:make とQuickfixのための設定

VimにはQuickfixという情報表示のための一時的なバッファがあり,:makeと合わせて使われています. 正直わたしはVimを雰囲気で使っているので,自分の理解をさらっと述べさせていただくと,

  1. Vim:make でビルドする
  2. (コードをミスって)エラーメッセージが出てきて,それがVimに読み込まれる.
  3. エラーメッセージに対応したQuickfixリストが準備される.リストの対応するところでEnterを押すとその行に飛べる

っていう流れになっているようです.(ちょっと正確でないかも) ctrl+z で端末に戻ってコマンド叩いてビルドしてまたVimに戻るでもいいといえばいいのですが,こっちのが確かに便利な感じです.

taketwo/vim-rosを利用するために,Vimコマンドラインモードでの設定として説明します.

第一段階については,&makeprgという:makeのためのオプションを設定する必要があります. catkin_makeの場合は:set makeprg=catkin_makeです. (:pwdした時にcatkinワークスペースのrootにいるか,:make -C "catkinルートディレクトリ"をする必要があるでしょう.)

caktin-toolsの場合は:set makeprg=catkin\ build です.空白をエスケープしてやる気遣いがあります. またこれに加えて,プラグインの変数を設定する必要があります. この辺で設定するべき変数が記述されています. どうやら,明示的に:let g:ros_build_system = "catkin-tools" としてやる必要があるようです.

これで:makeができるようになります. (ただ,Vimのカレントディレクトリによって自動的に&makeprgに設定した内容に,そこにあるパッケージのみをビルドするオプションが付いたりするようです.)

第二段階では:makeから出力されたエラーメッセージが&errorformatオプションに設定された正規表現を通してVimに読み込まれて,エラー部分のコードの行番号などが解析されているようです. このときcatkin_makeは問題ないのですが,catkin-toolsでは正規表現で読み込まれるメッセージの部分にANSIエスケープシーケンスで太字などの装飾が加えられた状態で出力されます. そのために行番号の解析が上手くいかず,対応するファイルの行番号ジャンプにしくじってしまいます. この装飾はcatkin-toolsではなくコンパイラによって付けられているようなので,コンパイラに対して-fdiagnostics-colorというオプションを設定することで削除します. :make -DCMAKE_CXX_FLAGS="-fdiagnostics-color=never" と一度:makeを叩くときに設定しておくと次回以降に単に:makeと叩いてもcatkin-toolsでは同じ設定が使われます.

catkin_makeの場合はビルドコマンドへのオプションはプラグインの変数経由で渡せるようです.(未確認) :let g:ros_catkin_make_options="-DCMAKE_CXX_FLAGS=\"-fdiagnostics-color=never\"" として設定します(なくていいはずです).必要なら-DCMAKE_BUILD_TYPEなどもここで設定してください.

これまでの設定で,:makeを叩いてエラーが発生した場合は,そのエラーに関するバッファの行までカーソルがジャンプするようになります. 更に:copenを叩いてQuickfixリストを開いて,エラー部分にカーソルを置いてEnterを置くと,同様に対応するバッファの行までカーソルがジャンプするようになります.

おわりに

  • 久々に記事を書いた
  • 文章は相変わらず微妙
  • Python2脱却とROS2移行を考えると悪い内容かもしれない
  • -fdiagnostic-color以外は.vimrcに書いてしまってもいいのかも
  • Vimを知ることは他でも役立つと思う(&errorformatとか知れたのは良かった)
  • そういえばC++でしか試してなかった.

日常を書くテスト

書きなぐるテスト

途中まで書いて,書きなぐっているとはいえ,正気を疑う文章の酷さにこの見出しを入れた.

以下はテストなので読む必要性はない.

やっぱり自炊すると安い

正直なところ,お酒って味覚的にこだわって飲む観点で言えば一人でいいやつを飲むし,日常のストレス解消的に言えば個人的には安いやつでいい. 毎日バリバリ結果を出すために欲望から目をそらして体調を整えたいのなら一切飲まないほうがいい,っていう感じ.

食べ物も,欲望に従えばどこか食べにいきたい.でも実際そんな高いところ行けないし味音痴なので,食べた後はそんなに満腹以外の満足感がない. ただ,欲望に従っているので一回500円から1000円までの金額が財布から飛んでいく.

まともな人間ならそこまでダメージはでかくないが.まともじゃないのでキツくなってきた. お酒と一緒で作業に対して意味が無いのだ.

JSC(ジャスコの意)で,100円まで値引きされたゴマサバの切り身と,70円まで値引きされたタラの切り身が売っている.

わたしはそれを買って,鯖は味噌煮にしてタラは下味つけて小麦粉つけて揚げ焼きにして,炒めた野菜と一緒にして甘酢あんでまとめる. (実際は日持ちのために味がしょっぱめで,甘酢あんはヒサブリに作ったので地獄スライム)(つんく♂歌詞”ヒサブリ”)

結構量ができる.100円のビールと100円のつまみのつまみ分が不要になる.

お酒も飲まなければもっと安くつく.

買い物のタイミング

鯖とタラを買ったのだが,お魚は何時料理するかが何時だって問題だ. 冷凍するとつい放置しがちな性質と,料理のタイミングが気まぐれな性質を前提にすると, その日に作るしか無い.

あまる.

しょっぱめにして,日持ちするだろと思うことにする.

100円のお魚を気軽に必要なタイミングでさらっと値引きされる夜に買いにいくスキルが求められている.

テスト終わり

オチはないよ

Goを全く使ったことがなかったけど,Go で書かれたコマンドだけ試したかった

編集履歴

2018/3/26 誤字あったので編集

動機

タイトルの通り.

golangについては名前を聞いたことがあるだけ.

自分の環境のubuntu 16.04で試した際のメモ.

何のコマンドかは申し訳ないけれど黙らせてください.

あと,ちょっと文章書きのリハビリ.

状況

とりあえず,GithubのレポジトリのREADMEを見て,

$ sudo apt install golang-go
$ get -u github.com/ほしいもの

でなんとかなると思ったけれどならなかった.

問題1

環境変数の設定が必要なようだ. 自分の~/.bashrcに以下を追加.

export GOPATH=$HOME/.go
export PATH="$HOME/.go/bin:$PATH"

2行目は他所から持ってきたコマンドを使いたいためであるので, Goの開発そのものには必須ではないのかもしれません.

問題2

ubuntu 16.04で入るデフォルトのgoがバージョンが1.6であるのに対して, 欲しいコマンドは1.7以上が必要だったようだ.context パッケージが無いとかなんとか.

とりあえず,1.6のgoを削除して,

$ sudo apt install golang-1.9

入れて,/usr/lib/go-1.9/bin/go などにシンボリックリンクを貼る.

こちらの記事を参考にさせてもらいました. Ubuntu 16.04にGolang 1.9をインストール | blog.PanicBlanket.com

問題3

$ get -u github.com/ほしいもの

…なんか,終わらない気がする. 表示も何も出ないし.

$ get -v -u github.com/ほしいもの

-v オプションで詳細な表示が出るみたいです.

わたしの環境では,形態素解析のライブラリのダウンロードとかでちょっと時間を食っているようでした.

おわり

ちょっとしたメモでした

わたしがROSで使ってるシェル芸(と芸未満)

またROSの記事

他に書くことないのかと.

そして8割書いた記事が一回消えたので,わたしには再び感が凄い

シェル芸

いわゆるシェルのワンライナー. コマンドをパイプ | で繋げて実行.

いろんなレベルのものが書かれていますが,とりあえず,自分がそこそこ幸せになれるレベルで使えればいいとわたしは思ってます.

動機 読み飛ばし推奨

最近,世界のほんの片隅で,そこそこの人数の初対面の方々にROSの講習をする機会があったのですが, やはりCUIという部分がネックとなっているようでした.

ROSの良さはRVizやrqtによるデータ可視化の分もありますが, やはりその開発と習得にはCUIが本質的に必須なのではないかとわたしは考えています.

わたしはぼっちなので独学でROSを覚えたのですが, そのときはまだ書籍とかも揃ってなかった (なんとかできるって気がしてきたとき,日本語ROS本が出てきた) 状況で,どういう流れを通ってきたかというと


ROSわからん →  なんか端末叩かされてるけどわからん →  そもそもubuntuとかLinuxがわからん →  とりあえずコマンドってなんだ →  シェル芸の本?


確かこんな感じだったわけで.その後,


cd とか ls とかlessがわかった.オプションとかもあるんだな →  ググるだけじゃなくて,実際にファイルを見に行くように →  Linuxって設定とかがファイルで書いてあって大抵所定のところにあるのか →  awk とか sedとかわかってシェル芸で笑えるくらいになる →  実行しろっていわれるシェルスクリプトとか読むようになる →  Vimでコード書いて端末で作業するように →  ROSのドキュメント読んでわからない時,pythonシェルスクリプト見る →  あれ,そういえばわたしROS使えてるっぽい


みたいにポロロッカしてました.

わたしはプログラミングとかのプロフェッショナルではないし, 本業もかなりアレな大した人間ではないのだけど, ちょっと良く使うROSで使うCUIでの作業をまとめて見ようと思い立ち, 当記事に至ります.

ROSで使っているシェル芸(と芸未満)

本編.思い出せる限り.殴り書きしてます.

# ワークスペースへの移動.芸未満
anywhere$ cd ~/catkin_ws # ~ は自分のホームディレクトリを意味する
anywhere$ cd /home/(your_user_name)/catkin_ws # 上記と同じ結果
# 移動の結果が以下のようになる.$ マークの前に表示.
~/catkin_ws$ pwd # 現在居るディレクトリを表示
/home/(your_user_name)/catkin_ws # こんな結果が出るはず
# ビルドする時,catkin_makeを実行するにはcatkinワークスペースの
# ルートディレクトリに居る必要がある(オプションで指定する方法もある)
~/catkin_ws/src/hoge_pkg/scripts$ cd ~/catkin_ws; catkin_make && cd -
# ;はコマンドを連続して実行する.
# &&は前のコマンドの終了ステータスが成功(戻り値ゼロ)の時,次のコマンドを実行する
# cd - は前に居たディレクトリに移動する.
# 分割して実行しても勿論いいけれども,
# 何度も繰り返すならワンライナーにしてしまったほうが,
# キーボードの上矢印でコマンド履歴が辿れるので楽なのではと個人的には思う.
# ディレクトリにどんなファイルがあるのかは,lsで見る.芸未満.
~/catkin_ws$ ls
build devel src
~/catkin_ws$ ls src/hoge_pkg/scripts
node1.py node2.py
~/catkin_ws$ ls src/hoge_pkg/scripts -la # 詳細を知りたいならオプションで
合計 16
drwxrwxr-x 2 you you 4096  911 02:33 .
drwxrwxr-x 6 you you 4096  911 02:33 ..
-rwxrwxr-x 1 you you  776  911 02:33 node1.py
-rw-rw-r-- 1 you you  833  911 02:33 node2.py
# 左端に読み取り,書き込み,実行が可能かの情報が書かれている(rwx)

# node2.pyを実行するには権限を付けなければならない
~/catkin_ws$ chmod +x src/hoge_pkg/scripts/node2.py
~/catkin_ws$ ls src/hoge_pkg/scripts -la
合計 16
drwxrwxr-x 2 you you 4096  911 02:33 .
drwxrwxr-x 6 you you 4096  911 02:33 ..
-rwxrwxr-x 1 you you  776  911 02:33 node1.py
-rwxrwxr-x 1 you you  833  911 02:34 node2.py # 変更された

# ls 以外にもtree というコマンドがある
~/catkin_ws/src/hoge_pkg$ tree
.
├── CMakeLists.txt
├── msg
│   └── foo.msg
├── package.xml
├── scripts
│   ├── node1.py
│   └── node2.py
├── src
│   ├── node3.cpp
│   └── node4.cpp
└── srv
    └── bor.srv

4 directories, 8 files
# ROSのcatkinワークスペースでは,packageという単位でコードが置かれる.
# また,そのpackageという単位で実際に実行ファイルやmsgが利用される
# パッケージ名が分かれば,roscdでそのパッケージがインストールされているディレクトリまで移動できる.
# ROSのパッケージは普通, sudo apt-get install ... で,
# /opt/ros/(distro) ... にインストールされているはず.
# そのようにシステムにインストールされたパッケージは次のコマンドで表示される
~/catkin_ws$ rospack list
actionlib /opt/ros/indigo/share/actionlib
actionlib_msgs /opt/ros/indigo/share/actionlib_msgs
actionlib_tutorials /opt/ros/indigo/share/actionlib_tutorials
amcl /opt/ros/indigo/share/amcl
angles /opt/ros/indigo/share/angles
ar_track_alvar_msgs /opt/ros/indigo/share/ar_track_alvar_msgs
assimp_devel /opt/ros/indigo/share/assimp_devel
astra_camera /opt/ros/indigo/share/astra_camera
astra_launch /opt/ros/indigo/share/astra_launch
audio_common_msgs /opt/ros/indigo/share/audio_common_msgs
# ... 省略
# 表示されるものは/opt以下にあるpackageと,
# source ~/(your_workspace)/devel/setup.bashでpathを通しているなら,
# そのワークスペースにあるpackageとなる.

# ただ,このままだと見難いのでパイプを繋いでフィルタする.
~/catkin_ws$ rospack list | head -n3 # 最初の3行のみ表示
actionlib /opt/ros/indigo/share/actionlib
actionlib_msgs /opt/ros/indigo/share/actionlib_msgs
actionlib_tutorials /opt/ros/indigo/share/actionlib_tutorials

~/catkin_ws$ rospack list | grep -i hoge # hogeという文字列を含むもの.オプション -iは大文字小文字の区別をつけない
hoge_pkg ~/catkin_ws/src/hoge_pkg

~/catkin_ws$ rospack list | percol # percolはpipでインストールできる
# 端末上でrospack listから出た結果のフィルタ画面が出てくる
# また,percolでは選択したある一行が標準出力に出される.
actionlib /opt/ros/indigo/share/actionlib

# このようにパッケージの名前や,そのpathを調べることが出来る.
# インストールされているmsg, srv, launchファイルをこのpathから調べることが多いと思う.
# rosed でも良いが,/opt以下と~/your_ws以下に同じパッケージで違う内容を突っ込んで気づかない事故が経験上あったので...
  • ノード,トピックの調査 その1
# ROSのシステムを実行させている時に,現在動いているノードを調べたいときは,
~/catkin_ws$ rosnode list # nodeの名前を表示
/node1
/node2
/rosout
~/catkin_ws$ rosnode info /rosout # nodeの詳細を表示
--------------------------------------------------------------------------------
Node [/rosout]
Publications: 
 * /rosout_agg [rosgraph_msgs/Log]

Subscriptions: 
 * /rosout [rosgraph_msgs/Log]

Services: 
 * /rosout/set_logger_level
 * /rosout/get_loggers


contacting node http://your_pc:58523/ ...
Pid: 9094
Connections:
 * topic: /rosout
    * to: /node1_1_9318_1505071783105 (http://your_pc:50006/)
    * direction: inbound
    * transport: TCPROS
# 上記のように出力される(一例,手元の環境を弄ってるので微妙に出力内容おかしいかも)

# 大量のnodeが立ち上がって調べにくい場合はgrepで何かの文字列でフィルタする
~/catkin_ws$ rosnode list | grep -i image_node
image_node1
image_node2

# xargsを使って名前の探索と詳細の表示を同時に行う
~/catkin_ws$ rosnode list | xargs rosnode info
~/catkin_ws$ rosnode list | grep -i image_node | xargs rosnode info
~/catkin_ws$ rosnode list | percol | xargs rosnode info
# わたしは状況に応じて使い分けている
  • ノード,トピックの調査 その2
# topicの名前や詳細もnodeの場合と同様に調査できる
~/catkin_ws$ rostopic list
/rosout
/rosout_agg
/string_data
~/catkin_ws$ rostopic info /rosout
Type: rosgraph_msgs/Log

Publishers: 
 * /node1_9318_1505071783105 (http://your_pc:50006/)

Subscribers: 
 * /rosout (http://your_pc:58523/)
# 上記のように詳細が出力される

# xargs を使う場合はオプションを入れて,(rostopic infoの都合)
~/catkin_ws$ rostopic list | xargs -n1 rostopic info
~/catkin_ws$ rostopic list | grep -i name | xargs -n1 rostopic info
~/catkin_ws$ rostopic list | percol | xargs rostopic info

# rostopic echoでtopicの内容を出力できるので同様に,
~/catkin_ws$ rostopic list | percol | xargs rostopic echo
  • ノード,トピックの調査 その2
# rostopic echo -n1 /topic で一度だけtopicの内容が得られる
~/catkin_ws$ rostopic echo -n1 /joint_states
header: 
  seq: 158
  stamp: 
    secs: 1505074289
    nsecs:   3087043
  frame_id: ''
name: ['joint1_01', 'joint1_12', 'joint1_23', 'joint1_34', 'joint2_01', 'joint2_12', 'joint2_23', 'joint2_34', 'joint3_01', 'joint3_12', 'joint3_23', 'joint3_34', 'joint4_01', 'joint4_12', 'joint4_23', 'joint4_34']
position: [-0.3529775813644944, -1.780097737750369, -1.464398623717453, -0.9656845881959149, -2.2365590983272536, 0.9881491526112725, 0.9437552086194985, 0.7689903038383807, 2.4342880115931553, -0.056669058888774604, 1.1904601906872596, -0.8253714396635548, 0.8509743673174297, -0.3859188461407257, -0.8952479217516776, -0.9185304306070528]
velocity: []
effort: []
---
# sensor_msgs/JointState型など,topic の内容に可変配列などが含まれるとき,見づらい場合がある

# grep でtopicの出力から必要なものを得て,Open usp tukubaiのコマンドで縦横入れ替え
~/catkin_ws$ rostopic echo -n1 /joint_states | grep -e name -e position | tateyoko | tr -d "[]"
name: position:
'joint1_01', -0.3529775813644944,
'joint1_12', -1.780097737750369,
'joint1_23', -1.464398623717453,
'joint1_34', -0.9656845881959149,
'joint2_01', -2.2365590983272536,
'joint2_12', 0.9881491526112725,
'joint2_23', 0.9437552086194985,
'joint2_34', 0.7689903038383807,
'joint3_01', 2.4342880115931553,
'joint3_12', -0.056669058888774604,
'joint3_23', 1.1904601906872596,
'joint3_34', -0.8253714396635548,
'joint4_01', 0.8509743673174297,
'joint4_12', -0.3859188461407257,
'joint4_23', -0.8952479217516776,
'joint4_34' -0.9185304306070528
# tr コマンドで[]を除去している

最後に

あれ,前振りの割にそんな芸してなくない? (割と書いてみた後,自分で驚いている)

特殊なほどのCUIの技術は必須ではない(持ってるならすっごーい!)と思います. そんな怖がることは無いのでちょっと調べてみたらいいんじゃないかなって.

…細かいコマンドの解説を省いてしまったのでCUI不慣れの人には逆にわかりづらいかもしれない

ROSのurdfの色にこだわる

たまに書く

たまに思い出したように書く

ROSのurdfのlinkとかの色

できものではなく,自分のロボットをROSの世界に持って行って仕事をするとき, 3D-CADのきちんとしたロボットの設計データがあればそのままURDFに使えるのだけれど, ファイルの形式がstlしか準備できなかったりすると,もとのCADの色データが反映されないので適当に色を設定することになる.

<material name="RED">
  <rbda color="1 0 0"/>
</material>

大抵こんな感じで設定している.ただこれだとたくさん色が欲しい時に手打ちで書いていくのが面倒だし, 簡単な数値で原色にしてしまうとRVizの座標軸の色とかぶったりしてやや見難い.

そこで綺麗で雅な色にしようと思ってシェル芸を書いてみた.

www.colordic.org

上記のサイトでは色見本としてRGB値を#RRGGBBの形式で書いている.curlして整形していく.

curl http://www.colordic.org/w|grep td|sed "s/>/> /g"|sed -e "s/<[^>]*>//g" -e "s/#\(..\)\(..\)\(..\)/0x\1 0x\2 0x\3/g"|xargs printf "%s %s %d %d %d\n"|awk '{$3=$3/255;$4=$4/255;$5=$5/255;$(NF+1)=1;cmd="echo "$2"|kakasi -Ha -i utf-8 -o utf-8";cmd|getline t;close(cmd);$(NF+1)=t;print "<!--"$1" "$2"-->\n<material name=\""$NF"\">\n  <rgba color=\""$3" "$4" "$5" "$6"\"/>\n</material>"}'|tr -d "'"

twitterで晒したヤツはnameの引用符忘れていた.あとawkの部分をまとめて少し短くしてみた.

ただもはやawkスクリプトだと思うコレ.

結果はこういうふうに出力されます.色見本wcで調べたら465種類ある.

</material>
<!--海松茶 みるちゃ-->
<material name="mirucha">
  <rgba color="0.352941 0.329412 0.294118 1"/>
</material>
<!--高麗納戸 こうらいなんど-->
<material name="kourainando">
  <rgba color="0.172549 0.309804 0.329412 1"/>
</material>
<!--紅藤色 べにふじいろ-->
<material name="benifujiiro">
  <rgba color="0.8 0.65098 0.74902 1"/>
</material>
<!--甚三紅 じんざもみ-->
<material name="jinzamomi">
  <rgba color="0.933333 0.509804 0.486275 1"/>
</material>
<!--香染 こうぞめ-->
<material name="kouzome">
  <rgba color="0.678431 0.490196 0.298039 1"/>
</material>

kakasiというコマンドで日本語をローマ字変換できると知って思いついて書きました.

Vim でコマンドを打つとき,ファイル名が欲しい

また

備忘録です

例えば

texだのプログラムだのVimを使ってソースを書いているのですが,

$ make
$ catkin_make #ROSですね
$ platex hoge.tex

みたいにコマンドを打ちたくなった時,よその端末にマウスで移動したり,Ctrl+zで一度端末に戻ったり,:!commandしていたりすると思います.

玄人の方はいろいろスマートにやっているのでしょうが,わたしはとりあえず上のみっつです.

で,tex を書いてる時にわたしはよく,

$ platex hoge.tex && dvipdfmx hoge.dvi && evince hoge.pdf

みたいなワンライナーを叩きます.シェル芸というほどでもないですが.

これはtexのソースをコンパイルして,成功したら出てきたdviファイルをpdfに変換して,またまた成功したらpdfを閲覧するというものです.一回書いてしまえばコマンドの履歴からそのまま使いまわしてしまいます.

これをVimで:!から叩くとき,そのまま書いてしまってもいいのですが, 以下のように,現在Vimで開いているファイル名を取得して実行することができます.

!:platex % && dvipdfmx %:r.dvi && evince %:r.pdf

ファイル名を%で取得したり,%:rで拡張子抜きで取得できるみたいです.他にもフルパス取得とか拡張子のみ取得などいろいろあるようです.

他にもわたしが覚えててちょくちょく使うのが

:view %
:e #

のように,現在見ているファイルをread onlyにするとか,間違って変なファイルを開いた時に前に開いていたものに戻るとかです.

文章力が低くて読みにくいけどいいか