狠狠撸

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

More Related Content

搁翱厂2.0时代に备えた肠++11/14