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<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);