狠狠撸
Submit Search
搁翱厂2.0时代に备えた肠++11/14
?
8 likes
?
4,824 views
Takashi Ogura
Follow
第7回搁翱厂勉强会@ドワンゴ向け资料
Read less
Read more
1 of 31
Download now
More Related Content
搁翱厂2.0时代に备えた肠++11/14
1.
ROS2.0時代に備えるための c++11/14 第7回ROS勉強会@ドワンゴ (2015/10/04) @OTL
2.
自己紹介: OTL (Open
Technology Lab.) 趣味でROSのBlog書いてたら本を書かないかと言われ、書いてみたら本当に出版さ れました! 2009/01 - ROS勉強記録(blog) 2012/02 - ros-japan-usersメーリス立ち上げ 2015/06 - 本出た!
3.
最近のニュース: ROS2.0 Alphaリリース すでにインストールして簡単に試すことができます。 https://github.com/ros2/ros2/wiki/Linux-Install-Binary ROS1.0とは互換性なし! (bridgeは用意されている)
4.
どんなふうに変わったか? https://github.com/ros2/examples c++クライアントとcのクライアントの例がある buildシステムがcatkinからamentに、などいろいろあるが、cppの変化に注目 c++のtalker.cpp (Topic Publisher)を見てみる
5.
https://github. com/ros2/examples/blob/master/rclcpp_exampl
6.
いろいろ変わっている 名前空間: ros ->
rclcpp メッセージファイルの場所: std_msgs/String.h -> std_msgs/msg/string.hpp 拡張子がhppなのはC言語版と区別するため? 命名規則: 関数がcamelCase(単語区切りだけ大文字)からsnake_case(_で区切る)へ node.createPublisher() -> node.create_publisher()
8.
listener (Topic Subscriber)もみてみる
9.
https://github. com/ros2/examples/blob/master/rclcpp_examples/src/topics/listener_best_effort. cpp
10.
https://github. com/ros2/examples/blob/master/rclcpp_examples/src/topics/listener_best_effort. cpp
11.
颁++11を使っている
12.
アンケート C++11/14を知っている: 人 C++11/14を知らない: 人 C++を使ったことがある: 人 C++11/14を使ったこと(-std=c++11 or 14
or 0x or 1y)ある: 人 C++11/14を日常的に使っている: 人 C++14を日常的に使っている: 人
13.
C++11の便利な機能 ?ラムダ:無名関数 ?auto:型推論 ?ユーザ定義リテラル ?constexpr:コンパイル時関数 ?rvalue?move:右辺値参照、効率のよいデータ受け渡し ?async/future:Thread実行の言語としてのサポート などなど
14.
C++11 超ベンリ ROS2.0時代を生き抜くには必須の知識
15.
C++11 超ベンリ ROS2.0時代を生き抜くには必須の知識 ROS1.0でも使いたい!
16.
roscpp14 C++03からの卒業
17.
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はまだ。
18.
roscpp14 https://github.com/OTL/roscpp14 そもそも何がしたかったか? Subscriberのコールバックにラムダを使いたかった。
19.
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;
20.
作りたかったもの #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; }
21.
やってみたら意外と簡単じゃなかった これはC++11をもってしても簡単には作れない。 subscribeは実はテンプレート関数で、テンプレート引数が推論されている。 本来 subscribe<std_msgs::String>(...)と書くもので、それが引数から推測されてい た。lambdaを使いたければその引数の型は std::function<void
(const T &)>となる が、このfunctionの中の引数からsubscribeのTの推論はできない。
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.
できたもの (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; } ちょっと冗長
24.
なんでroscpp14? c++14を使っているから。c++11に満足できなかったため???。
25.
できたもの (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にできる
26.
ServiceServerもすっきり (C++14)
27.
まあまあ満足! (黒魔術使えば理想どおりできるのかもだけど???。)
28.
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があるので見ればわかると思います。 以上
29.
おまけ
30.
まとめ C++11/14をマスターしてROS2.0時代を生き抜こう!! ASCII DWANGO様より参考書が出ました!! →
31.
以上です 書籍買っていただいた方々 ありがとうございます!
Download