rclcpp常用功能

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

rclcpp常用的类模板和函数

  • 前言
  • 一、rclcpp是什么?
  • 二、rclcpp有哪些?
    • 1.节点类(Node)
    • 2.发布器模板类(Publisher)
    • 3.订阅器模板类(Subscription)
    • 4.服务(Service)
    • 5.定时器(Timer)
    • 6.执行器(Executor)
    • 7.初始化(init())
    • 8.事件循环(spin())
    • 9.关闭ROS2(shutdown())
    • 10.日志(Logger)
    • 11.时间(Time)
    • 12.参数(Parameter)
  • 总结

前言

记录第一天写ROS2学习笔记:

可以把 rclcpp理解成 ROS2 给 C++ 提供的一个大型工具箱,里面主要包含:

节点类(Node)
通信类(Publisher、Subscription、Client、Service)
定时器(Timer)
执行器(Executor)
初始化和运行函数(init、spin 等)
日志系统(Logger)
时间和参数系统(Time、Parameter)


提示:以下是本篇文章正文内容,下面案例可供参考

一、rclcpp是什么?

rclcpp 本身不是一个类(class),而是一个命名空间(namespace),相当于c++中的一个大文件夹或者包名,同理std也是一个命名空间。
为什么要命名空间呢?比如当我写的如下程序:

classNode{};voidinit();

如果你的程序也写了

classNode{};voidinit();

就会产生冲突。

二、rclcpp有哪些?

1.节点类(Node)

rclcpp::Node 创建节点的用法:classMyNode:publicrclcpp::Node#先继承{public:MyNode():Node("my_node"){//先初始化父类节点名字为my_node再执行My_node自己的构造函数}};// 等价于autonode=std::make_shared<rclcpp::Node>("my_node");//现实中机器人系统中摄像头节点、激光雷达节点都是如此

2.发布器模板类(Publisher)

ROS2要发很多种消息例如:发送字符串、发速度、发图片等等
相当于生活中的广播站,广播站收集信息再发给所有收音机,Publisher充当的就是这个角色。
Publisher

一个专门发送 Twist 消息的广播站对象

SharedPtr

指向广播站对象的智能指针

create_publisher()

创建广播站并绑定 Topic

publish(msg)

把消息广播出去
模板:

template<typenameMessageT>classPublisher;

使用:

rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr cmd_pub_;

创建:

cmd_pub_=create_publisher<geometry_msgs::msg::Twist>("/cmd_vel",10);

发布:

geometry_msgs::msg::Twist msg;msg.linear.x=0.5;cmd_pub_->publish(msg);

3.订阅器模板类(Subscription)

接收消息。

rclcpp::Subscription<std_msgs::msg::String>::SharedPtr sub_;

创建:

sub_=create_subscription<std_msgs::msg::String>("/topic",10,std::bind(&MyNode::callback,this,std::placeholders::_1));

回调:

voidcallback(conststd_msgs::msg::String::SharedPtr msg){RCLCPP_INFO(get_logger(),"%s",msg->data.c_str());}

4.服务(Service)

同步请求响应。

例如:

客户端:帮我算 2+3
服务器:结果是5

服务器:

rclcpp::Service<example_interfaces::srv::AddTwoInts>::SharedPtr service_;

客户端:

rclcpp::Client<example_interfaces::srv::AddTwoInts>::SharedPtr client_;

5.定时器(Timer)

周期执行任务。

rclcpp::TimerBase::SharedPtr timer_;

创建:

timer_=create_wall_timer(std::chrono::milliseconds(100),std::bind(&MyNode::timer_callback,this));

6.执行器(Executor)

负责调度回调函数。

单线程:

rclcpp::executors::SingleThreadedExecutor

多线程:

rclcpp::executors::MultiThreadedExecutor
类比 Publisher、Subscription、Timer:像员工。 Executor:像调度员。 Timer回调 Subscription回调 Service回调 ↓ Executor ↓ CPU执行

7.初始化(init())

初始化 ROS2。

rclcpp::init(argc,argv);

类比像:

HAL_Init();

先把整个框架启动起来。

8.事件循环(spin())

进入事件循环。

rclcpp::spin(node);

9.关闭ROS2(shutdown())

关闭 ROS2。

rclcpp::shutdown();

释放资源。

10.日志(Logger)

输出信息。

RCLCPP_INFO(this->get_logger(),"Hello");

还有:

RCLCPP_WARN()RCLCPP_ERROR()RCLCPP_DEBUG()RCLCPP_FATAL()

类比

相当于:

printf();

但是:

有颜色
有时间戳
有节点名
可以过滤日志等级

11.时间(Time)

rclcpp::Time rclcpp::Clock

获取时间:

this->get_clock()->now();

类比

像:

millis()

12.参数(Parameter)

声明:

declare_parameter("speed",0.5);

读取:

doublespeed=get_parameter("speed").as_double();

类比

像:

doublespeed=0.5;

总结

提示:这里对文章进行总结:
按照这个顺序,后面学习 Nav2、MoveIt2、机器人控制框架时,会感觉所有东西都是在这些 rclcpp 基础类上搭起来的。