ROS2相对于ROS1的一些编译区别


1. 关于msg

  • 1) 添加msg,在CMakeListx.txt可使用例如
    find_package(ament_cmake REQUIRED)
    find_package(builtin_interfaces REQUIRED)
    ...

    rosidl_generate_interfaces(${PROJECT_NAME}
      "msg/Lane.msg"
      ...
      DEPENDENCIES builtin_interfaces ...

的方式

  • 2) ros2 中的msg中,变量名称只能是小写,不能有大写字符

2. cmake编译

  • 1) ros2的包添加时使用 find_package() 方式添加,
    但是不再需要使用include_directories() 和 target_link_libraries()
    来指定包含路径和编译链接库
    只需要使用ament_target_dependencies()
    如:
    ament_target_dependencies(${PROJECT_NAME}_node
      rclcpp
      ...
    )

注意:ament_target_dependencies只能链接find_package()找到的包,如果是自定义的库文件,仍需要使用target_link_libraries的方式链接

  • 2) ros2中生成的msg 头文件名称也变成了小写,并且头文件路径中增加msg目录

ros1

#include "sensor_msgs/Imu.h"
#include "sensor_msgs/NavSatFix.h"

ros2

#include "sensor_msgs/msg/imu.h"
#include "sensor_msgs/msg/nav_sat_fix.h"

3 关于Subscribe

ros2中的订阅者类明和创建方式如下:(注意名字)

rclcpp::Subscription::SharedPtr sub_;
sub_ = create_subscription(topic_name_, 10, callback);

订阅回调为成员变量时,参考https://github.com/ros2/examples/blob/master/rclcpp/minimal_subscriber/member_function.cpp

rclcpp::Subscription::SharedPtr subscription_;
...
subscription_ = this->create_subscription(
      "topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, _1));

另外回调函数如下,可以使用ptr,但不支持ptr引用传值

  void topic_callback(const std_msgs::msg::String::SharedPtr msg) const
  {
    RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());
  }

4. 关于message_filter

使用message_filter 同步时,回调函数不需要占位符,可如下使用:

gray_sync_sub_  = new message_filters::Subscriber(nh, gray_topic_);
raw_sync_sub_   = new message_filters::Subscriber(nh, raw_topic_);
sync_raw_gray_ = new message_filters::Synchronizer(RawGraySync(100),
                                                            *raw_sync_sub_, *gray_sync_sub_);
sync_raw_gray_->registerCallback(&LaneDetect::cb_raw_gray, this);

你可能感兴趣的:(ROS2相对于ROS1的一些编译区别)