Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ROS JAPAN Users Group Meetup 01

7,815 views

Published on

source code : https://github.com/ros-users/marker_publisher

Published in: Software
  • Be the first to comment

ROS JAPAN Users Group Meetup 01

  1. 1. 第一回 ROS勉強会@東京 2014年4月12日  千葉工業大学 工学部 4年  ロボット設計・制御研究室 前川大輝
  2. 2. 目次 1.自己紹介 2.この勉強会について 3.ROSとは 4.ディストリビューション 5.ROSの歴史 6.通信の基本モデル 7.ROSのノードについて理解する 8.ROSのトピックを理解する 9.RVizで図形を可視化しよう 10.URDF
  3. 3. 自己紹介 ■ロボカップの開発チーム「CITBrains」のリーダー  → ロボカップヒューマノイドリーグに参加 ■ロボカップ  → ロボットと人工知能の新たな標準問題  → 「2050年までにヒューマノイドロボットで ワールドカップ・チャンピオンに勝つ」 ■ロボカップヒューマノイドリーグ  → 人間以上の機能を制限  → すべてのリーグの困難な要素を集約  → 40近くの国や地域が参加
  4. 4. 世界大会の様子
  5. 5. ■ロボカップ 2013 世界大会(オランダ)  KIDサイズ:3on3サッカー4位  KIDサイズ:テクニカルチャレンジ1位  TEENサイズ:3on3サッカー 準優勝  TEENサイズ:テクニカルチャレンジ2位 ■ロボカップ 2013 ジャパンオープン  5連覇(殿堂入り) ■ロボカップ 2012 世界大会(メキシコ)  KIDサイズ:ベストヒューマノイド(総合世界一)  KIDサイズ:3on3サッカー 準優勝  KIDサイズ:テクニカルチャレンジ1位  TEENサイズ:3on3サッカー 準優勝  TEENサイズ:テクニカルチャレンジ 2位
  6. 6. ■教育用マイコンボードの開発プロジェクトのリーダー  → 2011 ~ 2012年、ソフトウェアのライブラリ開発 ■農場用メータの自動読み取り技術に関して  企業と共同で開発中 ■今年からつくばチャレンジにアドバイザとして参加 ■OSSの活動にも積極的 日本Qtユーザー会、ROS JAPAN Users Groupに所属
  7. 7. 自己紹介は以上 これから勉強会の話に移ります
  8. 8. この勉強会について 初心者にやさしい勉強会を目指す! ■開催目的 もっと多くの人にROSの魅力を伝えたい ■ポリシー
  9. 9. 本日の勉強会の流れ ■13:50 ~ 15:50 ROSの概要解説(前川) ■16:00 ~ 17:30 ROS+Gazeboによるロボットシミュレーション入門(akio) ■17:40 ~ 18:20 Turtlebot2について(株式会社アールティ)
  10. 10.   毎回登壇者を募集します  紹介したい話題等をお持ちの方大歓迎です みんなで作る勉強会
  11. 11. 勉強会の資料はネットに公開予定
  12. 12. 問い合わせ (ROS JAPAN Users Group) https://groups.google.com/group/ros-japan-users
  13. 13. Q : 何から勉強するの? A : まずは本家のチュートリアルをこなしましょう これを続けるかどうかは今日の様子次第
  14. 14. 本家チュートリアル 初級 1.ROS環境のインストールとセットアップ 2.ROSのファイルシステムを学ぶ 3.ROSパッケージを作る 4.ROSのパッケージをビルドする 5.ROSのノードを理解する 6.ROSのトピックを理解する 7.ROSのサービスとパラメータを理解する 8.rqt_consoleとroslaunchを使う 9.ROSでrosedを使ってファイルを編集する 10.ROSのメッセージやサービスなどを作る 11.シンプルなパブリッシャとサブスクライバを書く 12.データを記録し、リプレイをする 中級 他のライブラリのチュートリアル その他
  15. 15. 初級 1.ROS環境のインストールとセットアップ 2.ROSのファイルシステムを学ぶ 3.ROSパッケージを作る 4.ROSのパッケージをビルドする 5.ROSのノードを理解する 6.ROSのトピックを理解する 7.ROSのサービスとパラメータを理解する 8.rqt_consoleとroslaunchを使う 9.ROSでrosedを使ってファイルを編集する 10.ROSのメッセージやサービスなどを作る 11.シンプルなパブリッシャとサブスクライバを書く 12.データを記録し、リプレイをする 中級 他のライブラリのチュートリアル その他 本日の学習範囲 本家チュートリアル
  16. 16. ROS(Robot Operating System)とは ■オープンソースで提供されるロボット向けのメタ・オペレーティングシステム ■ロボット制御用のミドルウェア  → ソースをコンパイルするためのビルドシステム  → プロセス間通信のための通信ライブラリ ■ロボット工学分野の研究・開発におけるコードの”再利用”を  支援することが目的 ROS = 通信 + ツール群 + 機能群 + エコシステム
  17. 17. ディストリビューション ■ー年周期のリリース(五月にIndigo) ■ーつのリリースの開発(現在はHydro) ■二つのリリースのサポート
  18. 18. ROSの歴史 ■2007年 Stanford大学のAI Labが開発 ■2008年 WillowGarageが開発を引き継ぎ ■2013年2月からOSRF(Open Source Robotics Foundation)が開発
  19. 19. 通信の基本モデル
  20. 20. ■ソフトウェアの単位: ノード ■ロボットのセンサやアクチュエータ等を別々のノードとして定義  → それを組み合わせ分散システムを構築 Node A Node B Node C
  21. 21. ■出版-購読型のメッセージング ■異なるプログラミング言語で記述されたノードでもやりとりが可能 Node A Node C Publish Subscribe Publish TopicA Publisher Publisher Node B Subscriber
  22. 22. ■サービス (リモート関数呼び出し) ■利用側(多くはノード)からリクエストを受け取ると特定の処理を行うもの Client Service Arguments Return Values
  23. 23. ■パラメータ ■トピック以外のデータを送受信するための仕組み ■パラメータサーバがデータを保持  → 他のノードからの変更は通知される
  24. 24. ■マスター ■ノードやトピックの管理を行う ■roscoreというプロセスにより提供される
  25. 25. ■パッケージ ■機能毎に分類されたノードやライブラリの単位のこと ■パッケージを管理するための便利なコマンドが多数提供されている ■ロボット用のオープンソースパッケージが多数公開されている
  26. 26. ROSのノードについて理解する
  27. 27. ■ROSを使用する際に一番初めにroscoreを起動する $ roscore
  28. 28. ■rosrunを用いてパッケージに含まれるノードを起動 $ rosrun turtlesim turtlesim_node
  29. 29. ■ノードの一覧を表示 $ rosnode list /rosout /turtlesim Ctrl - Cでノードを停止
  30. 30. ■リマップでコマンドラインから名前を変更 $ rosrun turtlesim turtlesim_node __name := my_turtle rosnode list /rosout /my_turtle
  31. 31. ■ノードが起動しているか確認 $ rosnode ping my_turtle rosnode: node is [/my_turtle] pinging /my_turtle with a timeout of 3.0s xmlrpc reply from http://daikimaekawa-ThinkPad-X230:58887/ time=0.523806ms xmlrpc reply from http://daikimaekawa-ThinkPad-X230:58887/ time=1.019001ms xmlrpc reply from http://daikimaekawa-ThinkPad-X230:58887/ time=1.125097ms
  32. 32. ROSのトピックを理解する
  33. 33. ■キーボードによる亀の操作 $ rosrun turtlesim turtle_teleop_key
  34. 34. ■システムの進行状況・挙動を示すグラフの生成 $ rqt_graph ROSのノードやトピックがハイライトされる
  35. 35. ■rostopicはトピックの詳細を調べるコマンド $ rostopic echo /turtle1/cmd_vel linear: x: 0.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 2.0 --- linear: x: 2.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 ---
  36. 36. ■rostopicが /turtle1/cmd_velを購読していることを  確認してみよう $rqt_graph
  37. 37. ■配信者と購読者が通信するためには同じ型のメッセージ  を送受信する必要がある ■トピックの型は配信されるメッセージの型により定義される ■rostopicを使って簡単に調べることが可能
  38. 38. ■配信-購読されているトピックとその型の情報を調べる $ rostopic list -v Published topics: * /turtle1/color_sensor [turtlesim/Color] 1 publisher * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher * /rosout [rosgraph_msgs/Log] 3 publishers * /rosout_agg [rosgraph_msgs/Log] 1 publisher * /turtle1/pose [turtlesim/Pose] 1 publisher Subscribed topics: * /turtle1/cmd_vel [geometry_msgs/Twist] 2 subscribers * /rosout [rosgraph_msgs/Log] 1 subscriber
  39. 39. ■rostopic typeで特定のトピックのメッセージ型を調べる $ rostopic type /turtle1/cmd_vel geometry_msgs/Twist
  40. 40. ■rosmsgを使用してメッセージの詳細を調べる $ rosmsg show geometry_msgs/Twist geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 z
  41. 41. ■rostopic pubはトピックへデータを配信します ■turtlesimを直線速度2.0, 角速度1.8で移動させる $ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]' rostopic pub [topic] [msg_type] [args]
  42. 42. ■亀は動き続けるために定期的な1Hzのコマンドが必要 $ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
  43. 43. ■何が起こっているかはrqt_graphでも可視化できる ■rostopic pub node と rostopic echo nodeが通信 $ rqt_graph
  44. 44. ■rostopic hzは配信されたデータの更新頻度を調べる ■/turtle1/poseを購読して, turtlesim_nodeの速さがど  の程度か見てみよう $ rostopic hz /turtle1/pose subscribed to [/turtle1/pose] average rate: 62.489 min: 0.016s max: 0.016s std dev: 0.00011s window: 62 average rate: 62.491 min: 0.016s max: 0.016s std dev: 0.00009s window: 125 average rate: 62.496 min: 0.016s max: 0.016s std dev: 0.00009s window: 187 データの更新頻度は60Hz
  45. 45. ■コマンドを組み合わせて便利に使える ■rostopic type と rosmsg showを結合して使ってみよう  → 普通にパイプが使える $ rostopic type /turtle1/cmd_vel | rosmsg show geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 z
  46. 46. ■rqt_plotはトピックで配信されている データの時間図を表示する $ rqt_plot 任意のトピックを追加
  47. 47. ■/turtle1/pose/xと/turtle1/pose/yを可視化
  48. 48. ■-ボタンで非表示にできる ■/turtle1/pose/thetaを追加
  49. 49. ■rosservice listでアクティブなサービスの情報を表示 $ rosservice list /clear /kill /reset /rosout/get_loggers /rosout/set_logger_level /spawn /turtle1/set_pen /turtle1/teleport_absolute /turtle1/teleport_relative /turtlesim/get_loggers /turtlesim/set_logger_level
  50. 50. ■rosservice type でサービスの型を表示します $ rosservice type clear std_srvs/Empty リクエストの作成にデータを送らない レスポンスの受け取りにデータを受け取らない
  51. 51. ■rosservice callでサービスを呼び出す ■turtlesimをクリアしよう $ rosservice call clear
  52. 52. ■サービスが引数をとる場合を考えましょう ■spawnサービスは新しい亀を誕生させる $ rosservice type spawn | rossrv show float32 x float32 y float32 theta string name --- string name
  53. 53. ■位置と向きを与えて新しい亀を誕生させよう  → 名前の指定は任意 $ rosservice call spawn 2 2 0.2 “” name: turtle2 作成した亀の名前を返す
  54. 54. ■rosparamはROSパラメータサーバを用いてデータの  蓄積や操作を実現 $ rosparam list /background_b /background_g /background_r /rosdistro /roslaunch/uris/host_daikimaekawa_thinkpad_x230__57324 /rosversion /run_id
  55. 55. ■rosparam setでパラメータの値を変える $ rosparam set /background_r 255 $ rosservice call clear
  56. 56. ■rosparam getでパラメータの値を取得する $ rosparam get /background_r 255
  57. 57. ■全てのパラメータサーバの中身を見る $ rosparam get / background_b: 255 background_g: 86 background_r: 255 rosdistro: 'hydro ' roslaunch: uris: {host_daikimaekawa_thinkpad_x230__57324: 'http://daikimaekawa-ThinkPad-X230:57324/'} rosversion: '1.10.2 ' run_id: 2ec6f1ae-be3f-11e3-986c-b8763fd266b5
  58. 58. ■全てのパラメータをファイルに書き出す $ rosparam dump params.yaml ■yamlファイルをcopyというネームスペース の中に読み込む $ rosparam load params.yaml copy ■rosparam getで中身を確認する $ rosparam get copy/background_b 255
  59. 59. RVizで図形を可視化しよう ■通信システムを大まかに理解するためのサンプル ■RVizでデータを3次元マップ上に可視化 ■トピックを送信するプログラムを書いてみよう
  60. 60. ■ROSのワークスペースを作成(catkin) $ mkdir -p ~/catkin_ws/src $ cd ~/catkin_ws/src $ catkin_init_workspace $ cd ~/catkin_ws $ catkin_make $ echo “source ~/catkin_ws/devel/setup.bash” >> ~/.bashrc $ source ~/.bashrc
  61. 61. ■パッケージ作成 $ cd ~/catkin_ws/src $ catkin_create_pkg marker_publisher roscpp visualization_msgs
  62. 62. ■ノードを作成 $ roscd marker_publisher/src $ vi marker_publisher.cpp
  63. 63. ■使用するヘッダファイルのインクルード #include <cmath> #include <ros/ros.h> #include <visualization_msgs/Marker.h>
  64. 64. ■初期設定 #define DEFAULT_RATE 20 int main(int argc, char *argv[]){ ros::init(argc, argv, “test”); ros::NodeHandle n; ros::Publisher marker_pub = n.advertise<visualization_msgs::Marker>(“visualiz ation_marker”, 10); ・・・ }
  65. 65. ■初期設定 int main(int argc, char *argv[]){ ・・・  visualization_msgs::Marker line_strip; line_strip.header.farme_id = “practice”; line_strip.ns = “practice”; line_strip.id = 1; line_strip.type = visualization_msgs::Marker::LINE_STRIP; line_strip.action = visualization_msgs::Marker::ADD; ・・・ }
  66. 66. ■初期設定 int main(int argc, char *argv[]){ ・・・  line_strip.scale.x = 0.1; line_strip.color.b = 1.0; line_strip.color.a = 1.0; float phai = 0.0; n.setParam(“/rate”, DEFAULT_RATE); ・・・ }
  67. 67. ■図形を作成 int main(int argc, char *argv[]){ ・・・ for(int i=0; i <= 10; i++){ const float radius = i % 2 ? 6.0 : 3.0; const float theta = (72.0 * (i/2) + (i%2) * 36.0) * M_PI / 180.0; geometry_msgs::Point vertex; vertex.x = radius * cos(theta); vertex.y = radius * sin(theta); line_strip.points.push_back(vertex); } ・・・ }
  68. 68. ■図形の回転 int main(int argc, char *argv[]){ ・・・  while(ros::ok()){ int val = DEFAULT_RATE; if(n.getParam(“/rate”, val)){ std::cout << “val = ” << val << std::endl; } ros::Rate r(val); line_strip.header.stamp = ros::Time::now(); line_strip.pose.orientation.z = sin(phai / 2); line_strip.pose.orientation.w = cos(phai / 2); ・・・ } return 0; }
  69. 69. ■図形の回転 while(ros::ok){ ・・・  marker_pub.publish(line_strip); phai += 0.05; if(phai > 2 * M_PI) phai -= 2 * M_PI; r.sleep(); }
  70. 70. ■CMakeLists.txtを編集 $ rosed marker_publisher CMakeLists.txt
  71. 71. ■CMakeLists.txtを編集 ・・・ add_executable(marker_publisher_node src/marker_publisher.cpp ) target_link_libraries(marker_publisher_node ${catkin_LIBRARIES} ) ・・・
  72. 72. ■パッケージをビルド $ cd ~/catkin_ws $ catkin_make
  73. 73. ■ノードを起動 $ rosrun marker_publisher marker_publisher_node ■rostopic echoでframe_idを確認 $ rostopic echo /visualization_marker ・・・  frame_id: practice  ・・・ line_strip.header.frame_id = “practice”
  74. 74. ■rvizで図形を可視化
  75. 75. ■rqt_graphでノード間通信を可視化 $ rqt_graph
  76. 76. ■図形の回転速度を変更 $ rosparam set /rate 100
  77. 77. ■rosbagでトピックを記録 $ rosbag record /visualization_marker ■marker_publisher_nodeを停止 $ Ctrl - C ■rosbagでバグファイルを再生 $ rosbag play *.bag rosbagはデバックの強い味方
  78. 78. URDF(Unified Robot Description Format) ■ロボットシミュレーションへの繋ぎ ■XMLフォーマットのロボットモデルの記述
  79. 79. ■urdf_tutorial.xmlに記述 $ vi urdf_tutorial.xml
  80. 80. <robot name=”test_robot”> <link name=”link1” /> <link name=”link2” /> <link name=”link3” /> <link name=”link4” /> <link name=”world” /> </robot> ? リンク間の関係を定義する
  81. 81. <robot name=”test_robot”> ・・・ <joint name=”joint1” type=”continuous”> <parent link=”world”/> <child link=”link1”/> </joint> <joint name=”joint2” type=”continuous”> <parent link=”link1”/> <child link=”link2”/> </joint>  ・・・ </robot>
  82. 82. <robot name=”test_robot”> ・・・ <joint name=”joint3” type=”continuous”> <parent link=”link1”/> <child link=”link3”/> </joint> <joint name=”joint4” type=”continuous”> <parent link=”link3”/> <child link=”link4”/> </joint> </robot>
  83. 83. ■パース可能なのかを確認 $ check_urdf urdf_tutorial.xml robot name is: test_robot ---------- Successfully Parsed XML --------------- root Link: world has 1 child(ren) child(1): link1 child(1): link2 child(2): link3 child(1): link4
  84. 84. ■空間を追加 ■<origin>でリンクの参照フレームから  子供のジョイントまでのオフセットを与える  → 位置のオフセットxyz  → 姿勢のオフセットrpy
  85. 85. ■空間を追加 ・・・ <joint name=”joint1” type=“continuous”> <parent link=”world”/> <child link=”link1”/> <origin xyz=”5 0 0” rpy=”0 0 3.14”/> </joint> <joint name=”joint2” type=“continuous”> <parent link=”link1”/> <child link=”link2”/> <origin xyz=”5 2 0” rpy=”0 0 3.14”/> </joint> ・・・
  86. 86. ■空間を追加 ・・・ <joint name=”joint3” type=“continuous”> <parent link=”link1”/> <child link=”link3”/> <origin xyz=”5 0.5 0” rpy=”0 0 0”/> </joint> <joint name=”joint4” type=“continuous”> <parent link=”link3”/> <child link=”link4”/> <origin xyz=”5 0 0” rpy=”0 0 3.14”/> </joint> ・・・
  87. 87. ■ジョイントの回転を定義 ■ローカルフレームでの回転軸を指定  → joint1では<axis xyz=”0 1 0” />
  88. 88. ■ジョイントの回転を定義 ・・・ <joint name=”joint1” type=“continuous”> <parent link=”world”/> <child link=”link1”/> <origin xyz=”5 0 0” rpy=”0 0 3.14”/>  <axis xyz=”0 1 0”/> </joint> <joint name=”joint2” type=“continuous”> <parent link=”link1”/> <child link=”link2”/> <origin xyz=”5 2 0” rpy=”0 0 3.14”/> <axis xyz=”0.707 0.707 0”/> </joint> ・・・
  89. 89. ■ジョイントの回転を定義 ・・・ <joint name=”joint3” type=“continuous”> <parent link=”link1”/> <child link=”link3”/> <origin xyz=”5 0.5 0” rpy=”0 0 0”/> <axis xyz=”0.9 0.15 0”/> </joint> <joint name=”joint4” type=“continuous”> <parent link=”link3”/> <child link=”link4”/> <origin xyz=”5 0 0” rpy=”0 0 3.14”/> <axis xyz=”0.707 0.707 0”/> </joint> ・・・
  90. 90. ■可視化 $ urdf_to_graphiz urdf_tutorial.xml
  91. 91. 基礎講義はここまで ご清聴ありがとうございました
  92. 92. 次はシミュレータの解説を行います

×