系列文章目录
第一章 ROS概述与环境搭建
第二章 ROS通信机制
第三章 ROS通信机制进阶
第四章 ROS运行管理
第五章 ROS常用组件
第六章 机器人系统仿真
第七章 机器人系统仿真
第八章 机器人系统仿真
第九章 机器人系统仿真
第十章 机器人系统仿真
文章目录
前言
- 用来复习回顾使用
- 本篇笔记视频讲解地址:Bilibili大学
- 笔记配合视频效果更好
- 如有错误和遗漏,可私信与评论进行指正,看到了会及时更改
怕什么真理无穷,进一寸有一寸的欢喜
- 与各位共勉
三、ROS通信机制进阶
6.ROS中的头文件与源文件
- 设置头文件,可执行文件作为源文件;
- 分别设置头文件,源文件与可执行文件
6.1自定义头文件调用
需求:设计头文件,可执行文件本身作为源文件。
流程:
- 编写头文件;
- 编写可执行文件(同时也是源文件);
- 编辑配置文件并执行。
6.1.1头文件
在功能包下的 include/功能包名 目录下新建头文件: hello.h,示例内容如下:
代码如下:
#ifndef _HELLO_H
#define _HELLO_H
/* 声明 namespace
|--class
|--run
*/
namespace hello_ns {
class Myhello
{
private:
/* data */
public:
void run(); //成员函数
};
}
#endif
为防止编译头文件出现异常,需配置 .vscode 下 c_cpp_properties.json 的 includepath属性 :
"/home/wht/at_demo/demo03_ws/src/plumbing_head/include/**"//配置head文件的位置
上一行结尾记得加逗号隔开;
6.1.2可执行文件
在 src 目录下新建文件:hello.cpp,编写调用头文件函数。示例内容如下:
代码如下:
#include <ros/ros.h>
#include "plumbing_head/hello.h"
namespace hello_ns{
void Myhello::run(){
ROS_INFO("run 函数执行-------------");
}
}
int main(int argc, char* argv[])
{
setlocale(LC_ALL,"");
ros::init(argc, argv, "hello_head");
//函数调用
hello_ns::Myhello myHello;
myHello.run();
return 0;
}
6.1.3配置文件
配置CMakeLists.txt文件,头文件相关配置如下:
代码如下:
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(hello src/hello.cpp)
add_dependencies(hello ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(hello
${catkin_LIBRARIES}
)
编译并执行 ;
6.2自定义源文件调用
大型文件里面,头文件用来声明类,源文件拿来定义,然后其他的函数即可执行文件通过调用源文件定义好的函数来实现相关功能;
需求:设计头文件与源文件,在可执行文件中包含头文件。
流程:
- 编写头文件;
- 编写源文件;
- 编写可执行文件;
- 编辑配置文件并执行。
6.2.1头文件
在功能包下的 include/功能包名 目录下新建头文件: hello.h,用于声明类。
代码如下:
#ifndef _HELLO_H
#define _HELLO_H
/* 声明 namespace
|--class
|--run
*/
namespace hello_ns {
class Myhello
{
private:
/* data */
public:
void run(); //成员函数
};
}
#endif
为防止编译头文件出现异常,需配置 .vscode 下 c_cpp_properties.json 的 includepath属性 :
"/home/wht/at_demo/demo03_ws/src/plumbing_head_src/include/**"//配置head文件的位置
上一行结尾记得加逗号隔开;
6.2.2源文件
在 src 目录下新建文件:hello.cpp,用于定义相关函数。
代码如下:
#include <ros/ros.h>
#include "plumbing_head_src/hello.h"
namespace hello_ns{
void My::run(){
ROS_INFO("调用源文件函数成功-------------");
}
}
6.2.3可执行文件
在 src 目录下再新建文件:use_hello.cpp,调用源文件文件函数。
代码如下:
#include <ros/ros.h>//因为源文件已经包含,所以可以省略
#include "plumbing_head_src/hello.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL, "");
ros::init(argc, argv, "hello_head_src");
//函数调用
hello_ns::Myhello myHello;
myHello.run(); //此时虽然包含了plumbing_head_src/hello.h 即包含了头文件,但不能链接源文件hello.cpp 需要配置
return 0;
}
6.2.4配置文件
配置CMakeLists.txt文件,头文件&源文件相关配置如下:
代码如下:
#包含头文件
include_directories(
include
${catkin_INCLUDE_DIRS}
)
## 声明C++库
# 库的名字 起名字随便起,但是与后面的要对应
# 第一个是头文件include/plumbing_head_src/hello.h
# 第二个源文件 hello.cpp
add_library(head_src
include/${PROJECT_NAME}/hello.h
src/hello.cpp
)
# 执行权限配置
add_executable(use_hello src/use_hello.cpp)
# 执行权限配置
add_dependencies(use_hello ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
# 库的配置 设置成上面库的名字
add_dependencies(head_src ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
# 库的配置
target_link_libraries(head_src
${catkin_LIBRARIES}
)
# 执行权限配置 需要链接到库上
target_link_libraries(use_hello
head_src
${catkin_LIBRARIES}
)
编译并执行 ;
总结:
第二种是以后常用的一种方法
大型文件里面,头文件用来声明类,源文件拿来定义,然后其他的函数即可执行文件通过调用源文件定义好的函数来实现相关功能;