我们这次来了解一些ros中的常用API。
1.初始化函数:
ros::init(argc,argv,"node_name",option),这个函数的返回值为void.
比较常用的是第1,2,3个参数,1是指输入命令参数的字符串数组数量,2是输入命令参数的字符串数组;1,2参数是与ros输入命令的特定格式有关的。
3。是我们自己命名的一个节点名称,是在我们编写CMakeList.txt的时候表明我们调用的节点名称,它有唯一性,也就是说,在第四个参数option未设置的时候,我们是不能重复调用同名的节点的,如果发生重复调用,那么之前的节点会停止运行并警告,而运行新的节点。
第四个参数option是一个32位整型,默认为0,使用方式如示:ros::init(argc,argv,"node_name",ros::init_options::AnonymousName);它的原理是以我们的节点名称为前缀,在这个节点名称后面加入一个随机数,以此来进行区分。
e.g. 1。rosrun test01 twist _length:=2此时这个length参数会被传入参数服务器,可以用rosparam list 进行观察,会发现有/test01/length参数,再用rosparam get /test01/length会得到值2。
2。ros::init(argc,argv,"twist",ros::init_options::AnonymousName);
此时你使用rosnode list命令时会看到两个相似但后缀数字不同的node:
/twist_XXXXX和/twist_XXXXY
----------------------------------------------------------------------------------------------------
2.句柄创建:
格式:ros::NodeHandle nh;
其实他还有一个创建命令空间的作用,但我们先按下不表。
----------------------------------------------------------------------------------------------------
3.创建发布对象:
ros::Publisher pub=nh.advertise<std_msgs>(topic_name,array_length,latch);
topic_name是我们自己定义的话题名称,对于发布者,这个是自己定义的;对于订阅者,这个是要去跟踪的。
array_length是队列长度,如果我们的消息没有发送出去那他们会暂时保留在队列中,如果有新消息,则顶替掉最底层的消息。
latch默认为flase,如果设置为true,则会保留发布的最后一则消息,然后在下次订阅到的时候发送给订阅者。
----------------------------------------------------------------------------------------------------
4.回旋函数
ros::spin()和ros::spinOnce()
相同点:他们都能处理回调函数,回调函数是指我们看到函数定义中的Callback函数;
不同点:ros::spin()是进入循环中执行回调函数;ros::spinOnce()只是执行一次回调函数,并没有进入循环。在ros::spin()后面的函数不会被执行,而ros::spinOnce后面的函数可以被执行。
ros::spinOnce()可以配合其他函数一起放在while循环中进行使用;而ros::spin()会直接阻断后面程序的运行,在自己的死循环中一直运行直到程序结束。
----------------------------------------------------------------------------------------------------
5.时间函数:
我们可以利用ros/ros.h中内置的Time类型来显示当前的时间.
代码如下(别忘了roscore,新建功能包,重新编译以及source):
include "ros/ros.h"
int main(int argc,char *argv[]){
setlocale(LC_ALL,"");
ros::init(argc,argv,"time");
ros::NodeHandle n;
ros::Time now_time=ros::Time::now();//get time seed
ROS_INFO("Now time is:%.2f",now_time.toSec());//turn to second number
ROS_INFO("Now the second number is: %.2f",now_time.sec);//like above
ros::Time t1(20,312345678);//since 1970.1.1.00:00 passed 20 seconds and 312345678 ns
ros::Time t2(100.66);//since 1970.1.1.00:00 passed 100.66 seconds
ROS_INFO("t1=%.2f",t1.toSec());
ROS_INFO("t1=%.2f",t2.toSec());
return 0;
}