八、ros中的头文件与源文件

本节主要介绍ROS的C++实现中,如何使用头文件与源文件的方式封装代码,具体内容如下:

1、设置头文件,可执行文件作为源文件;

2、分别设置头文件,源文件与可执行文件。

在ROS中关于头文件的使用,核心内容在于CMakeLists.txt文件的配置,不同的封装方式,配置上也有差异。

3.2.1自定义头文件的调用

在 src 目录下新建文件:hello.cpp,示例内容如下:

#include "ros/ros.h"
#include "test_head/hello.h"

namespace hello_ns {

void HelloPub::run(){
    ROS_INFO("自定义头文件的使用....");
}

}

int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"test_head_node");
    hello_ns::HelloPub helloPub;
    helloPub.run();
    return 0;
}
Copy

3.配置文件

配置CMakeLists.txt文件,头文件相关配置如下:

include_directories(
include
  ${catkin_INCLUDE_DIRS}
)
Copy

可执行配置文件配置方式与之前一致:

add_executable(hello src/hello.cpp)

add_dependencies(hello ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

target_link_libraries(hello
  ${catkin_LIBRARIES}
)
Copy

最后,编译并执行,控制台可以输出自定义的文本信息。

需求:设计头文件,可执行文件本身作为源文件。你可以让我们设置一个头文件,头文件里面有命名空间有类。类下面我们声明了一个函数叫run函数,接下来在可执行文件中需要实现这run函数,并且呢去调用它

流程:

1、编写头文件;

2、编写可执行文件(同时也是源文件);需要去执行那个run函数去

3、编辑配置文件并执行。

首先创建一个功能包,导入依赖

先定位到功能包,功能包下面有个include,include下面又有一个和功能包重名的目录,我们需要在这个目录下新建一个头文件,hello.h,创建完毕以后先声明以一下这个头文件保护,

#ifndef _HELLO_H

#define _HELLO_H

要声明namemespace

                     要声明一个class

                                   创建一个run

namespace hello_ns{

class HelloPub {

public:

    void run();

};

}

#endif

头文件这个就完毕了

接下来是新建一个可执行文件,在src下新建一个.cpp文件

需要包含hello.h

现在在vscode中我想要调用这个头文件的话,必须得配置下,配置是找到下面这个

在这里面配置我头文件的路径,这个路径呢

打印一下,直接复制进去       

配置cmake有了头文件多了一个配置

注释解开就行了。

3.2.2自定义源文件的调用

需求:设计头文件与源文件,在可执行文件中包含头文件。

流程:

  1. 编写头文件;
  2. 编写源文件;
  3. 编写可执行文件;
  4. 编辑配置文件并执行。

1.头文件

头文件设置于 3.2.1 类似,在功能包下的 include/功能包名 目录下新建头文件: haha.h,示例内容如下:

#ifndef _HAHA_H
#define _HAHA_H

namespace hello_ns {

class My {

public:
    void run();

};

}

#endif
Copy

注意:

在 VScode 中,为了后续包含头文件时不抛出异常,请配置 .vscode 下 c_cpp_properties.json 的 includepath属性

"/home/用户/工作空间/src/功能包/include/**"
Copy

2.源文件

在 src 目录下新建文件:haha.cpp,示例内容如下:

#include "test_head_src/haha.h"
#include "ros/ros.h"

namespace hello_ns{

void My::run(){
    ROS_INFO("hello,head and src ...");
}

}
Copy

3.可执行文件

在 src 目录下新建文件: use_head.cpp,示例内容如下:

#include "ros/ros.h"
#include "test_head_src/haha.h"

int main(int argc, char *argv[])
{
    ros::init(argc,argv,"hahah");
    hello_ns::My my;
    my.run();
    return 0;
}
Copy

4.配置文件

头文件与源文件相关配置:

include_directories(
include
  ${catkin_INCLUDE_DIRS}
)

## 声明C++库
add_library(head
  include/test_head_src/haha.h
  src/haha.cpp
)

add_dependencies(head ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

target_link_libraries(head
  ${catkin_LIBRARIES}
)
Copy

可执行文件配置:

add_executable(use_head src/use_head.cpp)

add_dependencies(use_head ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

#此处需要添加之前设置的 head 库
target_link_libraries(use_head
  head
  ${catkin_LIBRARIES}
)

需求:设计头文件与源文件,在可执行文件中包含头文件。在案例1的基础之上把那个源文件和可执行文件进行一个剥离。

流程:

编写头文件;

编写源文件;

编写可执行文件;

编辑配置文件并执行。

头文件

源文件:

可执行文件

这个代码虽然包含了hello.h,但是他没有办法连接到hello.cpp的,那么一会我们配置的时候就要围绕这个链接着重展开。

想让它运行的配置cmakelist

放开include

接下来要配置c++库,起个名字随便起(head_src)

上面是库的配置

3、python模块导入

Python模块导入

与C++类似的,在Python中导入其他模块时,也需要相关处理。

需求:首先新建一个Python文件A,再创建Python文件UseA,在UseA中导入A并调用A的实现。

实现:

  1. 新建两个Python文件,使用 import 实现导入关系;
  2. 添加可执行权限、编辑配置文件并执行UseA。

1.新建两个Python文件并使用import导入

文件A实现(包含一个变量):

#! /usr/bin/env python
num = 1000
Copy

文件B核心实现:

import os
import sys

path = os.path.abspath(".")
# 核心
sys.path.insert(0,path + "/src/plumbing_pub_sub/scripts")

import tools

....
....
    rospy.loginfo("num = %d",tools.num)
Copy

2.添加可执行权限,编辑配置文件并执行

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值