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

2019-08-02  本文已影响0人  andyhacker

1. 关于msg

    find_package(ament_cmake REQUIRED)
    find_package(builtin_interfaces REQUIRED)
    ...

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

的方式


2. cmake编译

    ament_target_dependencies(${PROJECT_NAME}_node
      rclcpp
      ...
    )

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

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<std_msgs::msg::String>::SharedPtr sub_;
sub_ = create_subscription<std_msgs::msg::String>(topic_name_, 10, callback);

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

rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
...
subscription_ = this->create_subscription<std_msgs::msg::String>(
      "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<MsgImage>(nh, gray_topic_);
raw_sync_sub_   = new message_filters::Subscriber<MsgImage>(nh, raw_topic_);
sync_raw_gray_ = new message_filters::Synchronizer<RawGraySync>(RawGraySync(100),
                                                            *raw_sync_sub_, *gray_sync_sub_);
sync_raw_gray_->registerCallback(&LaneDetect::cb_raw_gray, this);
上一篇 下一篇

猜你喜欢

热点阅读