文章目录
1、ros::init(argc,argv,name,options)
-
作用:
初始化ROS节点 -
参数:
- argc: 封装实参个数(n+1),多一个是文件名自身
- argv: 封装参数的数组,将所有参数封装进一个字符串数组
- name: 节点名,唯一性
- options: 节点启动选项
-
返回值:
void -
使用:
-
argc,argv: 按照ROS中的特定格式进行设置参数,那么ROS就可以使用这些参数,比如设置全局参数,参数服务器中的参数,给节点重命名等
-
例:设置参数服务器中的参数
- 格式:
rosrun topic_test turtle_control _param:=2 - 作用:通过turtle_control新增一个参数param,注意前面的下划线
- 代码实现
rosrun topic_test turtle_control _param:=2 rosparam list /rosdistro /roslaunch/uris/host_d102_w65kj1_kk1__41049 /rosversion /run_id /turtle/background_b /turtle/background_g /turtle/background_r /turtle_control/param //这里会显示在哪个节点下创建的参数 rosparam get /turtle_control/param 2
- 格式:
-
-
options: 在ROS中,只能运行一个相同的节点,为了解决这一问题,引入了options选项,其原理是给相同的节点设置随机数,从而避免重复
- 代码实现
ros::init(argc,argv,"turtle_control",ros::init_options::AnonymousName);
rosrun topic_test turtle_control //运行两次 rosnode list /key /rosout /turtle /turtle_control_1655369913672940242 //两个相同节点运行,加入了后缀,避免重复 /turtle_control_1655369957423031583
- 代码实现
-
2、ros::Publisher pub = nh.advertise<geometry_msgs::Twist>(“/turtle1/cmd_vel”,1000)
- 作用:
创建发布者对象 - 参数:
- geometry_msgs::Twist: 被发布的数据类型
- /turtle1/cmd_vel: 话题名称
- 1000: 队列长度
- latch(可选): 其类型为bool值,默认为False,设置为True时,该话题发布的最后一条消息会被保存,当有新的订阅方订阅时,会将该消息发送给订阅方,且只发送一次。例如在雷达导航中,需要发布者发布一张静态地图,如果设置发布频率一直发送,则效率太低。这时候就可以设置latch为true,这样,当有新的订阅者订阅该话题时,就会向该订阅者发送该静态地图。还比如订阅方订阅了发布方的一个参数,发布方提前停止发送消息了,这是将参数设置为true,就可以接收最后一次发布方发出的消息。否则的话,就无法就收到发送方的消息。
- 代码实现:
ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1000,true)
3、spinOnce()和spin()
- 作用:
二者都是用来处理回调函数,若没有该函数,则回调函数无法执行 - 二者比较:
spinOnce()函数只执行一次回调函数,其后面的代码会在处理完回调函数之后继续执行。
spin()函数会一直执行回调函数,其后的代码不会被执行
4、时间函数
#include"ros/ros.h"
//回调函数中有时间事件
void cb(const ros::TimerEvent &event){
ROS_INFO("event:%s",std::to_string(event.current_real.toSec()).c_str());
}
int main(int argc,char *argv[]){
setlocale(LC_ALL,"");
ros::init(argc,argv,"hello_time");
ros::NodeHandle nh;//必须执行该过程,否则在调用时间API时会报错,该过程可以初始化时间操作
/*
获取当前时刻:
参考系:1970:01:01 00:00:00
*/
ros::Time right_now = ros::Time::now();
ROS_INFO("距离参考系过去了:%.2f秒",right_now.toSec());//浮点数
ROS_INFO("距离参考系过去了:%d秒",right_now.sec);//整数
/*
设置指定时刻:
两种方法
*/
ros::Time t1(100,23232);//秒 毫秒
ros::Time t2(11.22);//秒
ROS_INFO("t1=%.2f",t1.toSec());
ROS_INFO("t2=%.2f",t2.toSec());
/*
设置持续时间:
*/
ros::Time start = ros::Time::now();
ROS_INFO("开始休眠:%.2f",start.toSec());
ros::Duration du(3);
du.sleep();//开始休眠
ros::Time end = ros::Time::now();
ROS_INFO("休眠结束:%.2f",end.toSec());
/*
时间运算
*/
//时刻和持续时间之间可向加减
ros::Time stop = start + du;
ROS_INFO("结束时间:%.2f",stop.toSec());
//时刻与时刻之间不能相加,但可以相减,返回值是一个Duration类型
ros::Duration du1 = end - start;
ROS_INFO("持续时间:%.2f",du1.toSec());
//持续时间和持续时间可进行相加减
ros::Duration du2 = du + du1;
ros::Duration du3 = du - du1;
ROS_INFO("持续时间相加:%.2f",du2.toSec());
ROS_INFO("持续时间相减:%.2f",du3.toSec());
/*
定时器:和ros::Rate()函数功能相似
*/
/*
ros::NodeHandle::createTimer(
ros::Duration period, //定时器时长,duration类型
const ros::TimerCallback &callback, //回调函数
bool oneshot = false, //回调函数是否执行一次,true只执行一次
bool autostart = true) //是否自动启动,true自动启动,否则需手动启动
*/
// ros::Timer timer = nh.createTimer(ros::Duration(1),cb);
// ros::Timer timer = nh.createTimer(ros::Duration(1),cb,true);//只执行一次回调函数
ros::Timer timer = nh.createTimer(ros::Duration(1),cb,false,false);//需手动启动定时器
timer.start();
ros::spin();
return 0;
}
5、ros::shutdown()
- 作用:
关闭节点
6、日志函数:
ROS_DEBUG("hello,DEBUG"); //不会输出
ROS_INFO("hello,INFO"); //默认白色字体
ROS_WARN("Hello,WARN"); //默认黄色字体
ROS_ERROR("hello,ERROR");//默认红色字体
ROS_FATAL("hello,FATAL");//默认红色字体