本文共 3216 字,大约阅读时间需要 10 分钟。
在ROS项目开发中,类的定义是开发过程中最基础且重要的步骤之一。类的定义涉及到类的成员函数的原型和私有、公共数据成员的定义。
头文件定义:
#define EXAMPLE_ROS_CLASS_H。<math.h>、<stdlib.h>、<string>、<vector>和<ros/ros.h>等。数据成员的定义:
成员函数的原型定义:
包含头文件:
实现成员函数:
构造函数的实现:
main)中进行,构造函数一般是通过NodeHandle传递一个节点句柄。#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
#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
构造函数的初始化逻辑:
回调函数的优化:
subscriberCallback中增加对异常情况的处理,确保程序的健壮性。文档的完善:
通过以上步骤,可以完整地实现一个简单的ROS类开发项目,从定义类接口到实际代码实现,再到功能验证与优化。
转载地址:http://pvkcz.baihongyu.com/