博客
关于我
在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/

    你可能感兴趣的文章
    Python--Redis实战:第四章:数据安全与性能保障:第4节:复制
    查看>>
    python--基本代码规范
    查看>>
    Python--抽象类接口类
    查看>>
    PYTHON--欧拉习题二
    查看>>
    python--高级应用总结
    查看>>
    python-520表白代码,我看谁说程序员不懂浪漫,送你几套表白代码,一步到位
    查看>>
    Python-Asyncio TypeError:无法在‘;等待‘;表达式中使用对象DICT
    查看>>
    Python-AttributeError:‘;dict&39;对象没有属性‘;序列‘;
    查看>>
    Python-ldap:是否可以在不显式写入密码的情况下进行绑定?
    查看>>
    python出现 unknown encoding: idna 的处理方法
    查看>>
    Python出现 RuntimeError: dictionary changed size during iteration 的解决方法
    查看>>
    Python-numpy(2)数组的操作
    查看>>
    Python-Numpy的tile函数用法
    查看>>
    python-open函数
    查看>>
    Python-Pandas-将特定函数应用于给定级别-多索引数据框架
    查看>>
    python-queue队列通信
    查看>>
    python-ros No module named PyKDL
    查看>>
    python-social-auth 是否需要会话
    查看>>
    Python再获年度编程语言,微软或成最大赢家
    查看>>
    python-week5
    查看>>