前言
node是ros里最小的进程单元,一个package中能有多个node。一般来说一个node负责机器人单独的功能。node是可执行的c++文件或者是python脚本。由于一般一个node只负责一个单一的功能,在一个机器人中肯定有多个node。这就需要ROS Master来对这么多node进行管理、调配。node首先会在master上进行注册,之后master会将该node纳入ROS程序之中,node之间的通讯也需要ROS Master,因此在node之间进行通讯时需要首先运行`roscore`来启动ROS Master。一、roscpp,使用c++来编写node
使用c++来编写ROS node首先就是头文件中必须要包含#include <ros/ros.h>
.
在node的编写主要分为以下几点:
1.初始化节点
2.创建句柄
3.发布消息
4.关闭节点
1.1初始化节点
在ros中初始化节点调用了ros::init()
函数,它初始化节点的名称与其他信息,一般ROS程序开头就是使用这个函数进行初始化。
1.2 创建句柄
创建句柄是调用ros::NodeHandle
,它是可以创建Publisher、Subscriber或者其他的事情;
NodeHandle是对节点资源的描述。有它就能够操作这个节点,例如:监听某个topic的消息、访问或者修改param等
1.3关闭节点
关闭节点一般使用ctrl+c来关闭节点。
1.4NodeHandle常用成员函数
NodeHandle常用的成员函数包括:
//创建话题的publisher
ros::Publisher advertise(const string &topic,uint32_t queue_size, bool latch=false);
//第一个参数是参数消息的话题名;
//第二参数是消息列队的最大长度,如果发布消息超过这个长度而没被接收就会出队
//第三个参数为 是否锁存
//创建subscriber
ros::Subscriber subscribe(const string &topic,uint32_t queue_size,void(*)(M));
//第一个为话题名称
//第二个参数是订阅列队长度,如果消息还未处理就有新消息进来,那么消息就会出队
//第三个是回调函数的指针,指向回调函数来处理接收的消息
//创建Server
ros::ServiceServer advertiseService(const string &service,bool(*srv_func)(Mreq&,Mres&));
//第一个参数是Service的名字
//第二个参数是服务函数的指针,指向服务函数。指向的函数应该有两个参数,分别接收请求和相应
//
//创建client
ros::ServciceClient serviceClient(const string &service_name,bool persistent=false);
//第一个函数是service的名称
//第二个参数是用于设置服务的链接是否持续,一般设为false
查询某个参数的值可以用以下指令
bool getParam(const string &key, std::string &s);
bool getParam(const std::string &key,double &d) const;
bool getParam(const std::string &key, int &i)const;
//这个里面函数getParam()被重载了多个类型
//从参数服务器上获取key的对应值;
给参数赋值
void setParam(const string &key, std::string &s) const;
void setParam(const std::string &key,char &s) const;
void setParam(const std::string &key, int i)const;
//给key对应val进行赋值