ROS2核心概念之代码示例一
上一篇主要写了些概念,可以参考之前文章。这一篇主要写下代码的demo,主要参考了古月居的代码。
Node代码
class HelloWorldNode : public rclcpp::Node
{public:HelloWorldNode(): Node("node_helloworld_class") // ROS2节点父类初始化{while(rclcpp::ok()) // ROS2系统是否正常运行{RCLCPP_INFO(this->get_logger(), "Hello World"); // ROS2日志输出sleep(1); // 休眠控制循环时间}}
};int main(int argc, char * argv[])
{// ROS2 C++接口初始化rclcpp::init(argc, argv); // 创建ROS2节点对象并进行初始化 rclcpp::spin(std::make_shared<HelloWorldNode>()); // 关闭ROS2 C++接口rclcpp::shutdown(); return 0;
}
上边代码是一个HelloWorldNode的节点,通过ROS2去创建并运行,一直打印该节点的输出。节点其实是rclcpp中的Node节点。
Topic代码
class PublisherNode : public rclcpp::Node
{public:PublisherNode(): Node("topic_helloworld_pub") // ROS2节点父类初始化{// 创建发布者对象(消息类型、话题名、队列长度)publisher_ = this->create_publisher<std_msgs::msg::String>("chatter", 10); // 创建一个定时器,定时执行回调函数timer_ = this->create_wall_timer(500ms, std::bind(&PublisherNode::timer_callback, this)); }private:// 创建定时器周期执行的回调函数void timer_callback() {// 创建一个String类型的消息对象auto msg = std_msgs::msg::String(); // 填充消息对象中的消息数据 msg.data = "Hello World";// 发布话题消息 RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", msg.data.c_str()); // 输出日志信息,提示已经完成话题发布 publisher_->publish(msg); }rclcpp::TimerBase::SharedPtr timer_; // 定时器指针rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_; // 发布者指针
};// ROS2节点主入口main函数
int main(int argc, char * argv[])
{// ROS2 C++接口初始化rclcpp::init(argc, argv); // 创建ROS2节点对象并进行初始化 rclcpp::spin(std::make_shared<PublisherNode>()); // 关闭ROS2 C++接口rclcpp::shutdown(); return 0;
}
这是PublisherNode节点的服务,发布话题;创建一个定时器,10ms执行一次;有发布就有订阅,下面看看订阅者的代码;
class SubscriberNode : public rclcpp::Node
{public:SubscriberNode(): Node("topic_helloworld_sub") // ROS2节点父类初始化{subscription_ = this->create_subscription<std_msgs::msg::String>( "chatter", 10, std::bind(&SubscriberNode::topic_callback, this, _1)); // 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度)}private:void topic_callback(const std_msgs::msg::String::SharedPtr msg) const // 创建回调函数,执行收到话题消息后对数据的处理{RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str()); // 输出日志信息,提示订阅收到的话题消息}rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_; // 订阅者指针
};// ROS2节点主入口main函数
int main(int argc, char * argv[])
{// ROS2 C++接口初始化rclcpp::init(argc, argv); // 创建ROS2节点对象并进行初始化 rclcpp::spin(std::make_shared<SubscriberNode>()); // 关闭ROS2 C++接口rclcpp::shutdown(); return 0;
}
SubscriberNode 这个就是订阅者,订阅了发布者的话题,发布者发布消息后,订阅了话题的消费者就能收到该话题。
有一点没有说,有个10,这个参数是QoS的默认值,10为历史深度,可以自定义。
好了,结束了,这一篇先聊到这,主要是梳理了ROS2的Node和Topic相关的代码示例,以后我们在程序里看到类似的代码,就很容易理解了。当然,这是用C++写的,如果C++不是特别好,建议看看这里。
