栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 1、ros::init(argc,argv,name,options)
  • 2、ros::Publisher pub = nh.advertise("/turtle1/cmd_vel",1000)
  • 3、spinOnce()和spin()
  • 4、时间函数
  • 5、ros::shutdown()
  • 6、日志函数:

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(“/turtle1/cmd_vel”,1000)
  • 作用:
    创建发布者对象
  • 参数:
    • geometry_msgs::Twist: 被发布的数据类型
    • /turtle1/cmd_vel: 话题名称
    • 1000: 队列长度
    • latch(可选): 其类型为bool值,默认为False,设置为True时,该话题发布的最后一条消息会被保存,当有新的订阅方订阅时,会将该消息发送给订阅方,且只发送一次。例如在雷达导航中,需要发布者发布一张静态地图,如果设置发布频率一直发送,则效率太低。这时候就可以设置latch为true,这样,当有新的订阅者订阅该话题时,就会向该订阅者发送该静态地图。还比如订阅方订阅了发布方的一个参数,发布方提前停止发送消息了,这是将参数设置为true,就可以接收最后一次发布方发出的消息。否则的话,就无法就收到发送方的消息。
  • 代码实现:
    ros::Publisher pub = nh.advertise("/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时会报错,该过程可以初始化时间操作
    
  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::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");//默认红色字体
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/980420.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号