创建工作空间:
mkdir -p 自定义工作空间/src
cd 自定义工作空间
catkin_make
这里的自定义工作空间是自己命名的,我命名的是test_ws,接下来创建一个简单的功能包:
cd src
catkin_create_pkg test roscpp rospy std_msgs
其中,test是包名,roscpp rospy std_msgs是包依赖的库。
创建自定义头文件:
在路径:test_ws/src/test/include/test ( 工作空间/src/包文件名/include/包文件名/ )下,创建头文件 test.h:
#ifndef _TEST_H_
#define _TEST_H_
// 声明命名空间
namespace test_ns
{
// 声明类
class Test
{
public:
// 声明函数
void run();
};
}
#endif
这里我一开始把include文件夹下的test文件夹删掉了,单独创建了一个test.h文件,后面编译一直没通过,后来在之前的test里面创建test.h就好了。
使用头文件,并在程序中直接实现函数功能:
在 src/ 下,创建 test.cpp 文件,具体代码如下:
#include "ros/ros.h"
#include "test/test.h"
// 自定义函数具体功能的实现
namespace test_ns
{
void Test::run()
{
ROS_INFO("测试成功!");
}
}
int main(int argc, char *argv[])
{
// 设置中文编码
setlocale(LC_ALL, "");
// ROS 初始化
ros::init(argc, argv, "test_node");
// 创建一个 Test 对象
test_ns::Test mytest;
// 调用自定义函数
mytest.run();
return 0;
}
配置CmakeLists文件:
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(test1 src/test.cpp)
add_dependencies(test1 ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(test1
${catkin_LIBRARIES}
)
这里的可执行文件不能使用test,实测catkin_make会报错,应该是因为目录和项目同名错误,改成别的就能编译通过了
运行可执行文件:
编译通过后,在终端执行
rosrun test test1
test是包名,test1是编译后的可执行文件,运行结果如下:
测试完毕!
附:C++中命名空间的作用:
(1)免命名冲突:在大型项目中,不同的库和模块可能会使用相同的名称。命名空间允许你将名称隔离开,防止命名冲突。
(2)组织代码:命名空间可以帮助组织代码,使得代码结构更加清晰。你可以按功能或模块将代码分组。
(3)简化代码:使用命名空间可以避免在代码中使用长名称。例如,你可以使用std::vector而不是std::tr1::vector。
(4)控制名称的可见性:命名空间可以控制名称的可见性,只有在同一命名空间中的名称才能被直接访问。
(5)支持模板元编程:在模板编程中,命名空间可以用于实现模板的特化和偏特化。