2016-05-21 12 views
1

私はROSフレームワークを使用した私的プロジェクトに取り組んでいますので、私のモチベーションは新しいC++ 14オートラムダ機能によって向上しました(この詳細はlinkを参照してください) 。rosパッケージC++ 14ラムダサポート

私が直面している問題は、ROSフレームワークが旧時代に固執していることです。C++03 for it's compilation。だから、C++ 14のコンパイルサポートを有効にするにはどうしたらいいですか?ラムダ関数を使うにはどうしたらいいですか?

  • 出版社:

    #include <ros/ros.h> 
    #include <std_msgs/String.h> 
    #include <std_msgs/Int8.h> 
    #include <sstream> 
    
    int main(int argc, char **argv) 
    { 
        ros::init(argc, argv, "talker"); 
        ros::NodeHandle n; 
        ros::Publisher string_pub = n.advertise<std_msgs::String>("chatter_string", 1000); 
        ros::Publisher int_pub = n.advertise<std_msgs::Int8>("chatter_int", 1000); 
        ros::Rate loop_rate(10); 
    
        int count = 0; 
        while (ros::ok()) 
        { 
        std_msgs::String str_msg; 
        std::stringstream ss; 
        ss << "hello world "; 
        str_msg.data = ss.str(); 
    
        std_msgs::Int8 int_msg; 
        int_msg.data = count; 
    
        string_pub.publish(str_msg); 
        int_pub.publish(int_msg); 
        ros::spinOnce(); 
        loop_rate.sleep(); 
        ++count; 
        } 
        return 0; 
    } 
    
  • 加入者:

    #include <ros/ros.h> 
    #include <std_msgs/String.h> 
    #include <std_msgs/Int8.h> 
    
    //generic lambda to add two variables 
    auto func = [](auto input) { return input + input; }; 
    
    void StringCallback(const std_msgs::String::ConstPtr& msg) 
    { 
        ROS_INFO("I heard: [%s]", func(msg->data).c_str()); 
    } 
    
    void IntCallback(const std_msgs::Int8::ConstPtr& msg) 
    { 
        int result = msg->data; 
        ROS_INFO("I heard: [%d]", func(result)); 
    } 
    
    int main(int argc, char **argv) 
    { 
        ros::init(argc, argv, "listener"); 
        ros::NodeHandle n; 
        ros::Subscriber string_sub = n.subscribe("chatter_string", 1000, StringCallback); 
        ros::Subscriber int_sub = n.subscribe("chatter_int", 1000, IntCallback); 
    
        ros::spin(); 
    
        return 0; 
    } 
    
  • CMakeLists:ここ

    は(加入者ノードで)ラムダ関数でテストするための簡単なノードです

    この設定の後にパッケージを作る
    cmake_minimum_required(VERSION 2.8.3) 
    project(tutocpp14) 
    
    find_package(catkin REQUIRED COMPONENTS 
        roscpp 
        rospy 
        std_msgs 
    ) 
    
    catkin_package() 
    
    include_directories(${catkin_INCLUDE_DIRS} include) 
    
    add_executable(listener src/listener.cpp) 
    add_executable(publisher src/publisher.cpp) 
    
    target_link_libraries(listener ${catkin_LIBRARIES}) 
    target_link_libraries(publisher ${catkin_LIBRARIES}) 
    

私に次のエラーをスロー:

tutocpp14/src/listener.cpp:10:43: error: ‘func’ was not declared in this scope 
    ROS_INFO("I heard: [%s]", func(msg->data).c_str()); 

答えて

1

それは私が私のパッケージのコンパイルのためのC++ 14 ROSを追加することができていることが判明しました。これはパッケージを公開することはお勧めしませんが。

機能およびファイルシステム/ネットワーキング/ etc ... TSの(技術仕様)は、設定時にチェックされ、同等の機能が余分なコンパイラ機能。 C++ 11のサポートは現在コンパイラの要件ですが、desktop-fullに含まれるパッケージのAPIはC++ 11固有の機能を使用しません。外部パッケージは、このガイドラインに従うことが推奨されます。

しかし、まだ私は自分の作品を公開しようとしていないので、自分で許可することができます。これがチェックされます

# check c++14/c++0x 
include(CheckCXXCompilerFlag) 
CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14) 
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) 
if(COMPILER_SUPPORTS_CXX14) 
    set(CMAKE_CXX_FLAGS "-std=c++14") 
elseif(COMPILER_SUPPORTS_CXX0X) 
    set(CMAKE_CXX_FLAGS "-std=c++0x") 
else() 
    message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.") 
endif() 

ROSパッケージのためのC++ 14のサポートを得るために、私は私のCMakelists.txtファイルに以下の行を追加することによって、-std = C++ 14のフラグを設定する必要がありますコンパイラにC++ 14が存在していない場合はエラーをスローします。今、それは魅力のように機能します。

希望に役立ちます。乾杯。

関連する問題