博客
关于我
在ROS中使用c++类
阅读量:495 次
发布时间:2019-03-07

本文共 3216 字,大约阅读时间需要 10 分钟。

ROS类开发指南:从头到尾完整的C++开发流程

一、类的定义与接口定义

在ROS项目开发中,类的定义是开发过程中最基础且重要的步骤之一。类的定义涉及到类的成员函数的原型和私有、公共数据成员的定义。

  • 头文件定义

    • 确保在头文件中声明类及其成员函数的原型。例如,使用自定义头文件名如#define EXAMPLE_ROS_CLASS_H
    • 包含必要的标准库头文件和ROS相关的头文件,如<math.h>、<stdlib.h>、<string>、<vector>和<ros/ros.h>等。
    • 定义类的构造函数原型,并在需要的时候引入必要的头文件。
  • 数据成员的定义

    • 数据成员分为私有和公共两种类型。私有成员只能在类的成员函数中使用,而公共成员可以在类及其继承类的对象中使用。
  • 成员函数的原型定义

    • 成员函数的原型需要在头文件中声明,这样才能在其他文件使用这些函数。
  • 二、实现/cpp文件开发

  • 包含头文件

    • 在cpp文件的开头包含已经定义过的头文件,确保所有必要的类型和函数声明可以被正确解析。
  • 实现成员函数

    • 按照原型实现成员函数。对于涉及ROS节点的处理逻辑(如订阅、发布、服务等),将初始化逻辑封装在构造函数中执行。
  • 构造函数的实现

    • 构造函数负责初始化类的成员变量和订阅、发布、服务等ROS组件。
    • 需要注意的是,ROS节点的初始化通常是在主函数(main)中进行,构造函数一般是通过NodeHandle传递一个节点句柄。
  • 三、具体实现示例

    1. 头文件内容示例

    #ifndef EXAMPLE_ROS_CLASS_H#define EXAMPLE_ROS_CLASS_H#include 
    #include
    #include
    class ExampleRosClass {public: ExampleRosClass(ros::NodeHandle* nodehandle); ~ExampleRosClass(); void initializeSubscribers(); void initializePublishers(); void initializeServices(); void subscriberCallback(const std_msgs::Float32& message_holder); bool serviceCallback(std_srvs::TriggerRequest& request, std_srvs::TriggerResponse& response);private: ros::NodeHandle nh_; ros::Subscriber minimal_subscriber_; ros::ServiceServer minimal_service_; ros::Publisher minimal_publisher_; double val_from_subscriber_; double val_to_remember_;};#endif

    2. cpp文件内容示例

    #include "example_ros_class.h"class ExampleRosClass::ExampleRosClass(ros::NodeHandle* nodehandle) {    nh_(*nodehandle);    initializeSubscribers();    initializePublishers();    initializeServices();    val_to_remember_ = 0.0;}void ExampleRosClass::initializeSubscribers() {    ROS_INFO("Initializing Subscribers");    minimal_subscriber_ = nh_.subscribe("example_class_input_topic", 1, &ExampleRosClass::subscriberCallback, this);}void ExampleRosClass::initializePublishers() {    ROS_INFO("Initializing Publishers");    minimal_publisher_ = nh_.advertise
    ("example_class_output_topic", 1, true);}void ExampleRosClass::subscriberCallback(const std_msgs::Float32& message_holder) { ROS_INFO("myCallback activated: received value %f", message_holder.data); val_from_subscriber_ = message_holder.data; std_msgs::Float32 output_msg; output_msg.data = val_to_remember_ += val_from_subscriber_; minimal_publisher_.publish(output_msg);}bool ExampleRosClass::serviceCallback(std_srvs::TriggerRequest& request, std_srvs::TriggerResponse& response) { ROS_INFO("service callback activated"); response.success = true; response.message = "here is a response string"; return true;}int main(int argc, char** argv) { ros::init(argc, argv, "exampleRosClass"); ROS_INFO("main: instantiating an object of type ExampleRosClass"); ExampleRosClass exampleRosClass(&nh); ROS_INFO("main: going into spin"); ros::spin(); return 0;}

    四、测试与验证

  • 运行服务

    • 在终端执行:
      rosservice call example_minimal_service
  • 发布话题

    • 在终端执行:
      rostopic pub -r 2 example_class_input_topic stm_msgs/Float32 2.0
  • 查看运行状态

    • 在终端执行:
      rostopic list
    • 检查订阅和发布的状态,确认Topic和Service是否正常运行。
  • 五、优化与扩展

  • 构造函数的初始化逻辑

    • 尽量将复杂的初始化逻辑放到构造函数中完成,确保类对象的完整性和一致性。
  • 回调函数的优化

    • subscriberCallback中增加对异常情况的处理,确保程序的健壮性。
  • 文档的完善

    • 在类的注释中详细描述每个成员函数的功能和使用方式,方便其他开发者理解和使用。
  • 通过以上步骤,可以完整地实现一个简单的ROS类开发项目,从定义类接口到实际代码实现,再到功能验证与优化。

    转载地址:http://pvkcz.baihongyu.com/

    你可能感兴趣的文章
    php输出数据到csv文件
    查看>>
    php输出语句
    查看>>
    php运行原理详细说明
    查看>>
    php运行环境出现Undefined index 或variable时解决方法
    查看>>
    php进程通信
    查看>>
    R&Python Data Science 系列:数据处理(2)
    查看>>
    php递归算法总结
    查看>>
    PHP递归遍历文件夹
    查看>>
    R&Python Data Science 系列:数据处理(1)
    查看>>
    php错误日志文件
    查看>>
    PHP错误解决:Array and string offset access syntax with curly braces is deprecated
    查看>>
    php隐藏手机号中间4位方法总结
    查看>>
    php面向对象三大特征封装、多态、继承
    查看>>
    php面向对象全攻略
    查看>>
    php面向对象的基础题
    查看>>
    php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结)...
    查看>>
    php页面增加自选项,php-在Woocommerce中添加新的自定义默认订购目录选项
    查看>>
    php页面静态化技术;学习笔记
    查看>>
    php项目心得以及总结
    查看>>
    R&Python Data Science 系列:数据处理(4)长宽格式数据转换
    查看>>