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 基础类上搭起来的。