ROS2命令
简单地说就是将原来的ros[command]
变成了ros2 [command]
节点
这里以【ROS2教程】( 2 ) 工作空间中的示例库中的rclcpp/topics/minimal_publisher
为例。
基本初始化函数没变,只是命名空间从ros
变成了rclcpp
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MinimalPublisher>()); // MinimalPublisher是节点类
rclcpp::shutdown();
return 0;
}
官方建议继承rclcpp::Node
写节点类,而不是一个main
写到底。
如果有用vscode的读者,建议安装一个ROS2插件,名字为ROS2
,作者JaehyunShim
,提供了很多ros2相关的snippets。下面直接引用snippets。
Publish
定义
rclcpp::Publisher</* msg_type */>::SharedPtr /* pub_name */;
类中实例化
/* pub_name */ = this->create_publisher</* msg_type */>("/* topic_name */", 10);
发布
auto msg = /* msg_type */();
RCLCPP_INFO(this->get_logger(), "Publishing message");
/* pub_name */->publish(msg);
Subscribe
定义
rclcpp::Subscription</* msg_type */>::SharedPtr /* sub_name */;
类中实例化1
using std::placeholders::_1;
/* sub_name */ = this->create_subscription</* msg_type */>(
"/* topic_name */", 10, std::bind(&/* ClassName */::/* sub_callback_name */, this, _1));
发布
void /* sub_callback_name */(const /* msg_type */::SharedPtr msg)
{
RCLCPP_INFO(this->get_logger(), "Received message");
}
std::placeholders
是占位符,是C++11
的新特性,_1用于代替回调函数中的第一个参数。 ↩︎