使用C ++ 14 lambda支持的ros包

时间:2016-05-21 14:32:48

标签: c++ lambda c++14 ros

好的,因为我正在使用ROS Framework开发一个私有项目,我的动机是由新的C ++ 14自动lambda功能提出的(请参阅此link以获得更好的解释)。

我面临的问题是ROS框架坚持过去C++03 for it's compilation。那么,我如何启用C ++ 14编译支持以及如何使用lambda函数?

这是一个简单的节点,用于使用lambda函数进行测试(在订阅者节点中):

  • 出版商:

    #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 个答案:

答案 0 :(得分:1)

事实证明,我可以将C ++ 14添加到ROS中以进行包编译。虽然不建议发布软件包。

  

使用C ++ 11 / C ++ 14功能和文件系统/网络/等...如果在配置时检查TS,则允许使用TS(技术规范),并且可以使用额外的编译器功能提供相同的功能。现在,对C ++ 11的支持是编译器要求,但desktop-full中包含的软件包的API将不使用任何特定于C ++ 11的功能。鼓励外部包裹遵循本指南。

但是,我现在还不打算发表我的作品,所以,我可以获得许可证。

要获得C ++ 14对ROS包的支持,我必须通过在CMakelists.txt文件中添加以下行来设置-std = c ++ 14标志:

# 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()

这将检查编译器中是否存在C ++ 14,如果没有则抛出错误。现在,它就像一个魅力。

希望有所帮助。欢呼声。