ROS的模板库的创建(.so)与使用

1、创建模板库(so)

创建模板库.so 有利于代码的复用

1.1、 创建头文件与源文件

在ROS工作空间创建一个包文件creating_ros_library,在include/creating_ros_library 下创建头文件。在src中创建源文件

#ifndef EXAMPLE_ROS_CLASS_H
#define EXAMPLE_ROS_CLASS_H
#include<math.h>
#include<stdlib.h>
#include<string>
#include<vector>
#include<ros/ros.h>
#include<std_msgs/Bool.h>
#include<std_msgs/Float32.h>
#include<std_srvs/Trigger.h>

class ExampleRosClass
{
    public:
        ExampleRosClass(ros::NodeHandle* nodehand);
    private:
        ros::NodeHandle nh_;
        ros::Subscriber mi_sub_;
        ros::Publisher mi_pub_;
        ros::ServiceServer mi_ser_;

        double val_from_subscriber_;
        double val_to_remember_;
        void initializeSubscribers();
        void initializePublish();
        void initializeServices();
        void subscriberCallback(const std_msgs::Float32& message);
        bool serviceCallback(std_srvs::TriggerRequest &request,std_srvs::TriggerResponse &respons);
};
#endif
#include"creating_ros_library/example_ros_class.h"
ExampleRosClass::ExampleRosClass(ros::NodeHandle* nodehand):nh_(*nodehand)
{
    ROS_INFO("Initializing ExampleRosClass.....");
    initializeSubscribers();
    initializePublish();
    initializeServices();
}
void ExampleRosClass::initializeSubscribers()
{
    ROS_INFO("Initializing ubscribers");
    mi_sub_ = nh_.subscribe("ex_class_topic",1,&ExampleRosClass::subscriberCallback,this);
}
void ExampleRosClass::initializePublish()
{
    ROS_INFO("Initializing Publish");
    mi_pub_ = nh_.advertise<std_msgs::Float32>("ex_class_topic",1,true);
}

void ExampleRosClass::initializeServices()
{
    ROS_INFO("Initializing Services");
    mi_ser_ = nh_.advertiseService("ex_class_service",&ExampleRosClass::serviceCallback,this);
}

void ExampleRosClass::subscriberCallback(const std_msgs::Float32& message)
{
    val_from_subscriber_ = message.data;
    ROS_INFO("myCallBack activated: received value %f",val_from_subscriber_);
    std_msgs::Float32 output_msg;
    val_to_remember_ += val_from_subscriber_;
    output_msg.data = val_to_remember_;
    mi_pub_.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,"exampleClass");
    ros::NodeHandle nh;
    ROS_INFO("init......");
    ExampleRosClass ex(&nh);
    ROS_INFO("go spin......");
    ros::spin();
    return 0;
}
1.2 、修改CMakeLists进行编译

创建.so只需要修改以下地方

include_directories(
include
  ${catkin_INCLUDE_DIRS}
)

add_library(example_ros_library
  src/example_ros_class.cpp
)

编译后在工作空间的devel/lib中会有生成的.so文件

2、其他功能包使用此库文件

2.1、创建功能包using_ros_lib,在src中编写源文件
#include<creating_ros_library/example_ros_class.h>  //引用库文件的头文件

int main(int argc, char  *argv[])
{
    ros::init(argc,argv,"test_main");
    ros::NodeHandle nh;
    ROS_INFO("init main....");
    ExampleRosClass ex(&nh);
    ROS_INFO("go spin ....");
    ros::spin();
    return 0;
}

2.2、修改CMakeLists和帕package.xml

在此处涉及到引用其他功能包的头文件问题,遇到引用其他功能包头文件找不到也可以按此进行

  • 1、修改其他功能包creating_ros_library 的CMakelistes如下
catkin_package(
 INCLUDE_DIRS include
#  LIBRARIES example_ros_library
#  CATKIN_DEPENDS roscpp std_msgs std_srvs
#  DEPENDS system_lib
)
* 在创建库的时候也可以打开
  • 2、修改本功能包using_ros_lib的CMakeLists
find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  std_srvs
  creating_ros_library  *很关键
)

catkin_package(
 INCLUDE_DIRS include
#  LIBRARIES using_ros_library
#  CATKIN_DEPENDS creating_ros_library roscpp std_msgs std_srvs
#  DEPENDS system_lib
)

include_directories(
include
  ${catkin_INCLUDE_DIRS}
)

add_executable(usinglib src/example_ros_lib_test.cpp)
target_link_libraries(usinglib
  ${catkin_LIBRARIES}
  example_ros_library *上面生成的库名
)
  • 3、修改package.xml
  <build_depend>creating_ros_library</build_depend>
  <build_export_depend>creating_ros_library</build_export_depend>
  <exec_depend>creating_ros_library</exec_depend>

如果创建功能包的时候加上对其他包的引用可以,少改不少
catkin_create_pkg using_ros_library roscpp std_msgs std_srvs creating_ros_library

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值