十一、ROS常用API汇总(C++)

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");//默认红色字体
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值