また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_ws/src/hoge_pkg/scripts$ cd ~/catkin_ws; catkin_make && cd -
~/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 9月 11 02:33 .
drwxrwxr-x 6 you you 4096 9月 11 02:33 ..
-rwxrwxr-x 1 you you 776 9月 11 02:33 node1.py
-rw-rw-r-- 1 you you 833 9月 11 02:33 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 9月 11 02:33 .
drwxrwxr-x 6 you you 4096 9月 11 02:33 ..
-rwxrwxr-x 1 you you 776 9月 11 02:33 node1.py
-rwxrwxr-x 1 you you 833 9月 11 02:34 node2.py
~/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
~/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
~/catkin_ws$ rospack list | head -n3
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_pkg ~/catkin_ws/src/hoge_pkg
~/catkin_ws$ rospack list | percol
actionlib /opt/ros/indigo/share/actionlib
~/catkin_ws$ rosnode list
/node1
/node2
/rosout
~/catkin_ws$ rosnode info /rosout
--------------------------------------------------------------------------------
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
~/catkin_ws$ rosnode list | grep -i image_node
image_node1
image_node2
~/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
~/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/)
~/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
~/catkin_ws$ rostopic list | percol | xargs rostopic echo
~/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: []
---
~/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
最後に
あれ,前振りの割にそんな芸してなくない?
(割と書いてみた後,自分で驚いている)
特殊なほどのCUIの技術は必須ではない(持ってるならすっごーい!)と思います.
そんな怖がることは無いのでちょっと調べてみたらいいんじゃないかなって.
…細かいコマンドの解説を省いてしまったのでCUI不慣れの人には逆にわかりづらいかもしれない