本文记录ROS中的自定义文件的调用,主要包括自定义头文件和源文件的使用。
1 自定义C++头文件的调用
注意这个文件目录的结构,尤其是 hello.h 这个自定义的头文件在 include/plumbing_head
文件夹之下,这个会直接影响后续头文件的引用。
hello.h文件的内容
#ifndef _HELLO_H
#define _HELLO_H
namespace hello_ns{
class HelloPub {
public:
void run();
};
}
#endif
src下面定义hello.cpp
hello.cpp的内容
#include "ros/ros.h"
#include "plumbing_head/hello.h"
//"/home/Documents/learn/ros/ros_ws_demo1/src/plumbing_head/include/**",
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;
}
上述源代码如何起作用?仍需下面的配置
1 项目目录下的c_cpp_properties.json文件的 includePath 配置该 .h 头文件所在的位置,一定要注意前面说的hello.h 这个自定义的头文件在 include/plumbing_head文件夹下
"includePath": [
"/home/Documents/learn/ros/ros_ws_demo1/src/plumbing_head/include/**"
],
2 配置 CMakeLists.txt
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(hello_node src/hello.cpp)
add_dependencies(hello_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(hello_node
${catkin_LIBRARIES}
)
然后即可编译运行,启动roscore后,尝试运行该节点即可,就可以发现正常执行了。
2 自定义C++文件的调用
同样是在该工作空间下,定义haha.cpp 和 test_haha.cpp,一个为源文件,一个为测试文件。实现逻辑为:在haha.cpp中对函数进行了定义,而test_haha.cpp中对haha.cpp中定义的函数进行调用。
haha.cpp 内容
#include "plumbing_head/hello.h"
#include "ros/ros.h"
namespace hello_ns{
void HelloPub::run(){
ROS_INFO("hello,head and src ...");
}
}
test_haha.cpp内容
#include "ros/ros.h"
#include "plumbing_head/hello.h"
int main(int argc,char *argv[]){
ros::init(argc,argv,"head_src");
hello_ns::HelloPub helloPub;
helloPub.run();
return 0;
}
难点还是在于配置层面,在以上配置CMakeLists.txt基础上,再进行下面的配置
add_library(head_src
include/${PROJECT_NAME}/hello.h
src/haha.cpp
)
add_dependencies(head_src ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_executable(test_haha_node src/test_haha.cpp)
add_dependencies(test_haha_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(head_src
${catkin_LIBRARIES}
)
target_link_libraries(test_haha_node
head_src
${catkin_LIBRARIES}
)
然后进行编译后,启动roscore节点,然后运行test_haha_node。
3 Python模块的自定义引用
Python的文件结构如下
haha.py
num = 10
test_haha.py
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import os
import sys
import rospy
p = os.path.abspath(".")
rospy.loginfo("*"*10+p)
# 临时环境变量,不然无法加载到 haha.py,,因为在运行过程中,默认路径为工作空间目录而不是scripts目录
sys.path.insert(0,p + "/src/plumbing_head/scripts")
import haha
if __name__=="__main__":
rospy.init_node("hah")
#rospy.loginfo("*"*10+os.path.abspath("."))
rospy.loginfo(haha.num)
【注】注意修改上面两个py文件的执行权限。
CMakeLists.txt的配置
catkin_install_python(PROGRAMS
scripts/haha.py
scripts/test_haha.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
然后运行即可