博客
关于我
在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在心理学研究中的应用有哪些_心理学在线研究可用平台简介和应用进展
    查看>>
    python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
    查看>>
    python在gpu上运行_【python】python开启GPU加速
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在Conda环境中,但在Windows虚拟环境中没有激活
    查看>>
    python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
    查看>>
    python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
    查看>>
    Python图像处理:从内存加载jpeg
    查看>>
    python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
    查看>>
    python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
    查看>>
    python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
    查看>>
    python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
    查看>>
    Python哪个版本最稳定好用2023.10.19
    查看>>
    Python和黑客技术的渊源
    查看>>
    Python和RF编写接口自动化
    查看>>
    Python和RF编写web自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>
    python和java哪个更值得学——来自知乎高赞回答
    查看>>
    python和c混合编程 github_在pycharm中使用git版本管理以及同步github的方法
    查看>>