上一篇主要写了些概念,可以参考之前文章。这一篇主要写下代码的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++不是特别好,建议看看这里。


被折叠的 条评论
为什么被折叠?



