目录
自定义头文件调用
自定义源文件调用
python模块导入
本节主要介绍ROS的C++实现中,如何使用头文件与源文件的方式封装代码,具体内容如下:
- 设置头文件,可执行文件作为源文件;
- 分别设置头文件,源文件与可执行文件。
在ROS中关于头文件的使用,核心内容在于CMakeLists.txt文件的配置,不同的封装方式,配置上也有差异。
自定义头文件调用
需求:设计头文件,可执行文件本身作为源文件。
流程:
- 编写头文件;
- 编写可执行文件(同时也是源文件);
- 编辑配置文件并执行。
切换到代码
创建功能包
导入依赖
再include中的功能包里新建文件
复制以下代码
#ifndef _HELLO_H
#define _HELLO_H
/*
声明 namespace
|---clas
|---run
*/
namespace hello_ns{
class HelloPub {
public:
void run();
};
}
#endif
头文件就编写完毕了
编写可执行文件实现
#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;
}
然后配置includePath
先找到路径
复制路径
添加进去
其实就是在main函数中调用run函数
然后配置CMakeLists
把这个注释放开
配置可执行文件
然后编译
然后在终端中执行
执行成功,上面有个报错不用管
自定义源文件调用
需求:设计头文件与源文件,在可执行文件中包含头文件。
流程:
- 编写头文件;
- 编写源文件;
- 编写可执行文件;
- 编辑配置文件并执行。
跟上面的区别实际上是剥离了可执行文件与源文件
新建功能包
新建头文件
复制以下代码
#ifndef _HAHA_H
#define _HAHA_H
namespace hello_ns {
class My {
public:
void run();
};
}
#endif
然后新建源文件
然后加可执行路径
此时头文件和源文件已经编写完,此时就要编写可执行文件
复制以下代码
#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;
}
但此时有个问题,可执行文件虽然包含了hello.h这个头文件 ,但却没有包含源文件hello.cpp
此时进行配置
解除注释
上图add_library下是声明c++库
第一个是头文件
第二个是源文件
这一步是为了将use_hello链接到head_src
这一步是把头文件源文件和可执行文件连接到一起
编译执行
回顾一下目的
要让源文件hello.cpp中的函数被执行
执行成功
python模块导入
Python中导入其他模块时,也需要相关处理。
需求:首先新建一个Python文件A,再创建Python文件UseA,在UseA中导入A并调用A的实现。
实现:
- 新建两个Python文件,使用 import 实现导入关系;
- 添加可执行权限、编辑配置文件并执行UseA。
新建文件
复制代码
#! /usr/bin/env python
num = 1000
再新建文件
复制以下代码
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)
添加执行权限,并修改配置
报错显示找不到这个tools模块
说明可能是环境变量出问题了
其实是因为rosrun执行的路径不是tools所在的scripts路径下
所以为了验证
我们进入scripts用python来执行
此时输出正确结果
所以关键点是rosrun的执行路径实在demo03_ws工作空间下的
所以找不到tools
来验证一下
果然是在这
换成python执行
路径是在scripts
no module named tools
原因:rosrun 执行时,参考路径是工作空间的路径,在工作空间下无法查找依赖的模块
解决:可以声明python的环境变量,当依赖某个模块时,先去指定的环境变量中查找依赖
按照以下代码解决
终端中执行
用rosrun执行成功
路径写绝对影响的是可移植性质
以下是优化
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)