找回密码
 立即注册
首页 业界区 业界 【ROS教程】ROS常用API讲解

【ROS教程】ROS常用API讲解

洪势 2025-6-9 09:36:03
@
目录

  • 1.节点初始化
  • 2.话题通信

    • 2.1 创建发布者对象
    • 2.2 消息发布
    • 2.3 创建订阅者对象

  • 3.服务通信

    • 3.1 创建服务对象
    • 3.2 创建客户对象
    • 3.3 客户发送请求
    • 3.4 客户对象等待服务

  • 4. 回旋函数

    • 4.1 spin
    • 4.2 spinOnce

  • 5.时间

    • 5.1 时刻

      • 5.1.1 获取当前时刻
      • 5.1.2 设置时刻

    • 5.2 时间间隔

      • 5.2.1 设置时间间隔
      • 5.2.2 进行休眠

    • 5.3 设置运行频率

  • 6.参数设置

    • 6.1 修改或新增参数
    • 6.2 获取参数
    • 6.3 删除参数


1.节点初始化
  1. ROSCPP_DECL void init(int &argc, char **argv, const std::string& name, uint32_t options = 0);
  2. ROSCPP_DECL void init(const M_string& remappings, const std::string& name, uint32_t options = 0);
  3. ROSCPP_DECL void init(const VP_string& remapping_args, const std::string& name, uint32_t options = 0);
复制代码

  • 这里讲解第一种初始化方式
参数含义argcmain函数的第一个参数argvmain函数的第二个参数name节点的名字,必须是唯一的2.话题通信

2.1 创建发布者对象
  1. template <class M>
  2. Publisher NodeHandle::advertise(const std::string& topic, uint32_t queue_size, bool latch = false);
  3.   
  4. template <class M>
  5. Publisher NodeHandle::advertise(const std::string& topic, uint32_t queue_size,
  6.                         const SubscriberStatusCallback& connect_cb,
  7.                         const SubscriberStatusCallback& disconnect_cb = SubscriberStatusCallback(),
  8.                         const VoidConstPtr& tracked_object = VoidConstPtr(),
  9.                         bool latch = false);
复制代码

  • 这里讲解第一种构造方式
参数含义topic话题的名字,必须是唯一的queue_size等待发送给订阅者的最大消息数量latch如果为 true,该话题发布的最后一条消息将被保存,并且后期当有订阅者连接时会将该消息发送给订阅者2.2 消息发布
  1. template <typename M>
  2.       void Publisher::publish(const M& message) const;
复制代码
参数含义message被组织的消息2.3 创建订阅者对象
  1. template<class M>
  2. Subscriber NodeHandle::subscribe(const std::string& topic, uint32_t queue_size, void(*fp)(const boost::shared_ptr<M const>&), const TransportHints& transport_hints = TransportHints());
  3. template<class M>
  4. Subscriber NodeHandle::subscribe(const std::string& topic, uint32_t queue_size, const boost::function<void (const boost::shared_ptr<M const>&)>& callback,
  5.                          const VoidConstPtr& tracked_object = VoidConstPtr(), const TransportHints& transport_hints = TransportHints());
复制代码
参数含义topic话题的名字,必须是唯一的queue_sizemain函数的第二个参数fp回调函数的函数指针return调用成功时,返回一个订阅者对象,失败时,返回空对象3.服务通信

3.1 创建服务对象
  1.   template<class T, class MReq, class MRes>
  2.   ServiceServer NodeHandle::advertiseService(const std::string& service, bool(T::*srv_func)(MReq &, MRes &), T *obj);
  3.   
  4.   template<class T, class MReq, class MRes>
  5.   ServiceServer NodeHandle::advertiseService(const std::string& service, bool(T::*srv_func)(ServiceEvent<MReq, MRes>&), T *obj);
  6.   template<class T, class MReq, class MRes>
  7.   ServiceServer NodeHandle::advertiseService(const std::string& service, bool(T::*srv_func)(MReq &, MRes &), const boost::shared_ptr<T>& obj);
  8.   template<class T, class MReq, class MRes>
  9.   ServiceServer NodeHandle::advertiseService(const std::string& service, bool(T::*srv_func)(ServiceEvent<MReq, MRes>&), const boost::shared_ptr<T>& obj);
  10.   template<class MReq, class MRes>
  11.   ServiceServer NodeHandle::advertiseService(const std::string& service, bool(*srv_func)(MReq&, MRes&));
  12.   template<class MReq, class MRes>
  13.   ServiceServer NodeHandle::advertiseService(const std::string& service, bool(*srv_func)(ServiceEvent<MReq, MRes>&));
  14.   
  15.   template<class MReq, class MRes>
  16.   ServiceServer NodeHandle::advertiseService(const std::string& service, const boost::function<bool(MReq&, MRes&)>& callback,
  17.                                  const VoidConstPtr& tracked_object = VoidConstPtr());
  18.   template<class S>
  19.   ServiceServer NodeHandle::advertiseService(const std::string& service, const boost::function<bool(S&)>& callback,
  20.                                  const VoidConstPtr& tracked_object = VoidConstPtr());
复制代码
参数含义service服务名称,必须是唯一的srv_func接收到请求时,需要处理请求的回调函数return请求成功时返回服务对象,否则返回空对象3.2 创建客户对象
  1.   template<class MReq, class MRes>
  2.   ServiceClient NodeHandle::serviceClient(const std::string& service_name, bool persistent = false,
  3.                               const M_string& header_values = M_string());
  4.   template<class Service>
  5.   ServiceClient NodeHandle::serviceClient(const std::string& service_name, bool persistent = false,
  6.                               const M_string& header_values = M_string());
  7.                            
复制代码
参数含义service_name服务名称,必须是唯一的3.3 客户发送请求
  1.   template<class Service>
  2.   bool ServiceClient::call(Service& service);
复制代码
参数含义service.srv文件定义的服务类型3.4 客户对象等待服务
  1. ROSCPP_DECL bool service::waitForService(const std::string& service_name, int32_t timeout);
  2. ROSCPP_DECL bool service::waitForService(const std::string& service_name, ros::Duration timeout = ros::Duration(-1));
复制代码
参数含义service_name被等待的服务名称,必须是唯一的timeout等待最大时常,默认为 -1,可以永久等待直至节点关闭return成功返回 true,否则返回 false4. 回旋函数


  • 简而言之,用到回调函数,就要用回旋函数处理
4.1 spin
  1. /**
  2. * \brief 进入循环处理回调
  3. */
  4. ROSCPP_DECL void spin();
复制代码
4.2 spinOnce
  1. /**
  2. * \brief 处理一轮回调
  3. *
  4. * 一般应用场景:
  5. *     在循环体内,处理所有可用的回调函数
  6. *
  7. */
  8. ROSCPP_DECL void spinOnce();
复制代码
5.时间

5.1 时刻

5.1.1 获取当前时刻
  1. ros::init(argc,argv,"hello_time");
  2. ros::NodeHandle nh;//必须创建句柄,否则时间没有初始化,导致后续API调用失败
  3. ros::Time right_now = ros::Time::now();//将当前时刻封装成对象
  4. ROS_INFO("当前时刻:%.2f",right_now.toSec());//获取距离 1970年01月01日 00:00:00 的秒数
  5. ROS_INFO("当前时刻:%d",right_now.sec);//获取距离 1970年01月01日 00:00:00 的秒数
复制代码
5.1.2 设置时刻
  1. ros::init(argc,argv,"hello_time");
  2. ros::NodeHandle nh;//必须创建句柄,否则时间没有初始化,导致后续API调用失败
  3. ros::Time someTime(100,100000000);// 参数1:秒数  参数2:纳秒
  4. ROS_INFO("时刻:%.2f",someTime.toSec()); //100.10
  5. ros::Time someTime2(100.3);//直接传入 double 类型的秒数
  6. ROS_INFO("时刻:%.2f",someTime2.toSec()); //100.30
复制代码
5.2 时间间隔

5.2.1 设置时间间隔
  1. ros::init(argc,argv,"hello_time");
  2. ros::NodeHandle nh;//必须创建句柄,否则时间没有初始化,导致后续API调用失败
  3. ros::Duration du(10);//持续10秒钟,参数是double类型的,以秒为单位
  4. ROS_INFO("持续时间:%.2f",du.toSec());//将持续时间换算成秒
复制代码
5.2.2 进行休眠
  1. ros::init(argc,argv,"hello_time");
  2. ros::NodeHandle nh;//必须创建句柄,否则时间没有初始化,导致后续API调用失败
  3. ros::Duration du(10);//持续10秒钟,参数是double类型的,以秒为单位
  4. du.sleep();//按照指定的持续时间休眠
复制代码
5.3 设置运行频率
  1. Rate::Rate(double frequency);
复制代码
参数含义frequency运行频率6.参数设置

6.1 修改或新增参数
  1.   void NodeHandle::setParam(const std::string& key, const XmlRpc::XmlRpcValue& v) const;
  2.   void NodeHandle::setParam(const std::string& key, const std::string& s) const;
  3.   void NodeHandle::setParam(const std::string& key, const char* s) const;
  4.   void NodeHandle::setParam(const std::string& key, double d) const;
  5.   void NodeHandle::setParam(const std::string& key, int i) const;
  6.   void NodeHandle::setParam(const std::string& key, bool b) const;
  7.   void NodeHandle::setParam(const std::string& key, const std::vector<std::string>& vec) const;
  8.   void NodeHandle::setParam(const std::string& key, const std::vector<double>& vec) const;
  9.   void NodeHandle::setParam(const std::string& key, const std::vector<float>& vec) const;
  10.   void NodeHandle::setParam(const std::string& key, const std::vector<int>& vec) const;
  11.   void NodeHandle::setParam(const std::string& key, const std::vector<bool>& vec) const;
  12.   void NodeHandle::setParam(const std::string& key, const std::map<std::string, std::string>& map) const;
  13.   void NodeHandle::setParam(const std::string& key, const std::map<std::string, double>& map) const;
  14.   void NodeHandle::setParam(const std::string& key, const std::map<std::string, float>& map) const;
  15.   void NodeHandle::setParam(const std::string& key, const std::map<std::string, int>& map) const;
  16.   void NodeHandle::setParam(const std::string& key, const std::map<std::string, bool>& map) const;
复制代码

  • ROS提供了16种可以设置的参数类型,如上。
  • 使用 ros::param::set有完全相同的效果
6.2 获取参数
  1. /*
  2.     参数服务器操作之查询_C++实现:
  3.     在 roscpp 中提供了两套 API 实现参数操作
  4.   
  5.     ros::NodeHandle::param(键,默认值)
  6.             存在,返回对应结果,否则返回默认值
  7.     ros::NodeHandle::getParam(键,存储结果的变量)
  8.             存在,返回 true,且将值赋值给参数2
  9.             若果键不存在,那么返回值为 false,且不为参数2赋值
  10.     ros::NodeHandle::getParamCached(键,存储结果的变量)--提高变量获取效率
  11.             存在,返回 true,且将值赋值给参数2
  12.             若果键不存在,那么返回值为 false,且不为参数2赋值
  13.     ros::NodeHandle::getParamNames(std::vector<std::string>)
  14.             获取所有的键,并存储在参数 vector 中
  15.     ros::NodeHandle::hasParam(键)
  16.             是否包含某个键,存在返回 true,否则返回 false
  17.     ros::NodeHandle::searchParam(参数1,参数2)
  18.             搜索键,参数1是被搜索的键,参数2存储搜索结果的变量
  19.     ros::param ----- 与 NodeHandle 类似
  20. */
复制代码
6.3 删除参数
  1. /*
  2.     参数服务器操作之删除_C++实现:
  3.     ros::NodeHandle::deleteParam("键")
  4.         根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
  5.     ros::param::del("键")
  6.         根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
  7. */
复制代码
本文由博客一文多发平台 OpenWrite 发布!

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册