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.

ROS2.0時代に備えたc++11/14

4,392 views

Published on

第7回ROS勉強会@ドワンゴ向け資料

Published in: Technology
  • Sex in your area is here: ❤❤❤ http://bit.ly/369VOVb ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating direct: ❤❤❤ http://bit.ly/369VOVb ❤❤❤
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

ROS2.0時代に備えたc++11/14

  1. 1. ROS2.0時代に備えるための c++11/14 第7回ROS勉強会@ドワンゴ (2015/10/04) @OTL
  2. 2. 自己紹介: OTL (Open Technology Lab.) 趣味でROSのBlog書いてたら本を書かないかと言われ、書いてみたら本当に出版さ れました! 2009/01 - ROS勉強記録(blog) 2012/02 - ros-japan-usersメーリス立ち上げ 2015/06 - 本出た!
  3. 3. 最近のニュース: ROS2.0 Alphaリリース すでにインストールして簡単に試すことができます。 https://github.com/ros2/ros2/wiki/Linux-Install-Binary ROS1.0とは互換性なし! (bridgeは用意されている)
  4. 4. どんなふうに変わったか? https://github.com/ros2/examples c++クライアントとcのクライアントの例がある buildシステムがcatkinからamentに、などいろいろあるが、cppの変化に注目 c++のtalker.cpp (Topic Publisher)を見てみる
  5. 5. https://github. com/ros2/examples/blob/master/rclcpp_exampl
  6. 6. いろいろ変わっている 名前空間: ros -> rclcpp メッセージファイルの場所: std_msgs/String.h -> std_msgs/msg/string.hpp 拡張子がhppなのはC言語版と区別するため? 命名規則: 関数がcamelCase(単語区切りだけ大文字)からsnake_case(_で区切る)へ node.createPublisher() -> node.create_publisher()
  7. 7. listener (Topic Subscriber)もみてみる
  8. 8. https://github. com/ros2/examples/blob/master/rclcpp_examples/src/topics/listener_best_effort. cpp
  9. 9. https://github. com/ros2/examples/blob/master/rclcpp_examples/src/topics/listener_best_effort. cpp
  10. 10. C++11を使っている
  11. 11. アンケート C++11/14を知っている:   人 C++11/14を知らない:   人 C++を使ったことがある:   人 C++11/14を使ったこと(-std=c++11 or 14 or 0x or 1y)ある:   人 C++11/14を日常的に使っている:   人 C++14を日常的に使っている:    人
  12. 12. C++11の便利な機能 ・ラムダ:無名関数 ・auto:型推論 ・ユーザ定義リテラル ・constexpr:コンパイル時関数 ・rvalue・move:右辺値参照、効率のよいデータ受け渡し ・async/future:Thread実行の言語としてのサポート などなど
  13. 13. C++11 超ベンリ ROS2.0時代を生き抜くには必須の知識
  14. 14. C++11 超ベンリ ROS2.0時代を生き抜くには必須の知識 ROS1.0でも使いたい!
  15. 15. roscpp14 C++03からの卒業
  16. 16. roscpp14作ってみた https://github.com/OTL/roscpp14 ROS1.0でC++11/14が使えちゃう(c++14はUbuntu15.04以降) ROS Jade ではあいかわらずC++03だが、 ●C++11 features are not used, but code should compile when - std=c++11 is used となっている。公式には使えないが、事実上使えちゃうっぽい。c++14はまだ。
  17. 17. roscpp14 https://github.com/OTL/roscpp14 そもそも何がしたかったか? Subscriberのコールバックにラムダを使いたかった。
  18. 18. roscppの場合 一旦callback関数を定義する必要がある。<--- めんどう #include "ros/ros.h" #include "std_msgs/String.h" void chatterCallback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]", msg->data.c_str()); } int main(int argc, char **argv){ ros::init(argc, argv, "listener"); ros::NodeHandle n; ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback); ros::spin(); return 0;
  19. 19. 作りたかったもの #include "ros/ros.h" #include "std_msgs/String.h" int main(int argc, char **argv){ ros::init(argc, argv, "listener"); ros::NodeHandle n; auto sub = n.subscribe("chatter", 1000, [&](const std_msgs::String& msg) { ROS_INFO("I heard: [%s]", msg.data.c_str());}); ros::spin(); return 0; }
  20. 20. やってみたら意外と簡単じゃなかった これはC++11をもってしても簡単には作れない。 subscribeは実はテンプレート関数で、テンプレート引数が推論されている。 本来 subscribe<std_msgs::String>(...)と書くもので、それが引数から推測されてい た。lambdaを使いたければその引数の型は std::function<void (const T &)>となる が、このfunctionの中の引数からsubscribeのTの推論はできない。
  21. 21. できたもの (C++11) #include <roscpp14/ros.h> #include <std_msgs/String.h> int main(int argc, char **argv) { ros::init(argc, argv, "listener"); roscpp14::NodeHandle node; auto sub = node.subscribe<std_msgs::String>("chatter", 10, [] (const std_msgs::String &msg) { ROS_INFO("%s", msg.data.c_str());}); ros::spin(); return 0; }
  22. 22. できたもの (C++11) #include <roscpp14/ros.h> #include <std_msgs/String.h> int main(int argc, char **argv) { ros::init(argc, argv, "listener"); roscpp14::NodeHandle node; auto sub = node.subscribe<std_msgs::String>("chatter", 10, [] (const std_msgs::String &msg) { ROS_INFO("%s", msg.data.c_str());}); ros::spin(); return 0; } ちょっと冗長
  23. 23. なんでroscpp14? c++14を使っているから。c++11に満足できなかったため・・・。
  24. 24. できたもの (C++14) #include <roscpp14/ros.h> #include <std_msgs/String.h> int main(int argc, char **argv) { ros::init(argc, argv, "listener"); roscpp14::NodeHandle node; auto sub = node.subscribe<std_msgs::String>("chatter", 10, [] (const auto &msg) { ROS_INFO("%s", msg.data.c_str()); }); ros::spin(); return 0; } C++14ならautoにできる
  25. 25. ServiceServerもすっきり (C++14)
  26. 26. まあまあ満足! (黒魔術使えば理想どおりできるのかもだけど・・・。)
  27. 27. How to use 使い方: 1. cd ~/catkin_ws/src; git clone https://github.com/OTL/roscpp14 2. 依存関係にroscppの代わりにroscpp14を書く 3. ros/ros.hの代わりにroscpp14/ros.hをinclude 4. ros::NodeHandleの代わりにroscpp14::NodeHandleを使う sampleとtestがあるので見ればわかると思います。 以上
  28. 28. おまけ
  29. 29. まとめ C++11/14をマスターしてROS2.0時代を生き抜こう!! ASCII DWANGO様より参考書が出ました!!  →
  30. 30. 以上です 書籍買っていただいた方々 ありがとうございます!

×