1、创建工作区
工作区中要包含src文件夹
mkdir test #新建test文件夹作为工作区
cd test #进入工作区
mkdir src #工作区中新建src文件夹
2、创建功能包
cd src #进入src文件夹
catkin_create_pkg hello_ros #创建功能包,名字为hello_ros
此时src文件夹会生成两个文件CMakelist.txt package.xml
3、创建编写源文件
在src文件夹下创建hello.cpp文件并编写代码
#include <ros/ros.h>
int main(int argc, char **argv)
{
ros::init(argc,argv,"hello"); #初始化ROS客户端库
ros::NodeHandle n; #创建此对象,此程序被注册为节点管理器的节点
ROS_INFO("Hello ROS!"); #生成一条消息,终端会打印这句话
ros::spinOnce(); #处理节点订阅话题的所有回调函数
}
4、编辑CMakeLists.txt文件
声明依赖库,确保catkin能向c++编辑器提供合适的标记来定位所需的头文件和链接库
cmake_minimum_required(VERSION 2.8.3) #自动生成
project(hello_ros) #自动生成的,后面是功能包的名字
find_package(catkin REQUIRED COMPONENTS roscpp) #所依赖的其他catkin包添加到COMPONENTS后面,用空格隔开
include_directories( include ${catkin_INCLUDE_DIRS}) #包含的索引路径
add_executable(hello hello.cpp) #手动添加 第一个是可执行文件的文件名,后面是源,可以多个,用空格隔开
target_link_libraries(hello ${catkin_LIBRARIES}) #此可执行文件所需的链接库,第一个可执行文件名,后面为链接库,可多个,用空格隔开
5、编译工作区
回到工作区路径下,编译工作区
cd test #回到工作区路径,就是src的上一层
catkin_make #编译工作区
此时工作区中会出现devel和build两个子目录
6、设置环境变量setup.bash
source devel setup.bash
7、执行hello程序
先启动
roscore
启动后,执行程序
rosrun hello_ros hello #hello_ros是功能包的名字,后面是可执行文件名
运行后终端会打印如下
【INFO】【1543652338.493910660】:hello,ROS!
添加自定义头文件.hpp和源文件.cpp
1、编写test.hpp文件,放在功能包文件夹下 include/hello 文件夹下
#ifndef _TEST_H_
#define _TEST_H_
class test
{
public:
void show() const;
};
#endif
2、编写test.cpp文件,放在功能包文件夹下 src 文件夹下
#include "test.hpp" //注意下面3.1步的路径,否则可能找不到文件
#include <iostream>
void test::show() const
{
std::cout<<"test"<<std::endl;
}
3、修改CMakeLists.txt文件
修改的地方有三个
1、
include_directories(
include ##此处原本有#号,去掉,这里是.hpp文件的路径
include/hello ##实际.hpp存放在include下的hello文件夹中,可以添加多个
${catkin_INCLUDE_DIRS}
)
2、
add_library( ##用来手动链接.hpp和.cpp文件
test ##自定义的链接库名,后面用来识别
include/hello/test.hpp ##.hpp的路径
src/test.cpp ##.cpp的路径
)
3、
target_link_libraries(hellotest ##可执行文件名
test ##上面自定义的链接库名
${catkin_LIBRARIES} ##原来的链接库名
)
4、main函数调用自定义库
#include <ros/ros.h>
#include “test.hpp” //注意上面3.1步的路径,否则可能找不到文件
int main(int argc, char **argv)
{
ros::init(argc,argv,"hello"); #初始化ROS客户端库
ros::NodeHandle n; #创建此对象,此程序被注册为节点管理器的节点
ROS_INFO("Hello ROS!"); #生成一条消息,终端会打印这句话
test my_test; //自定义的class
my_test.show(); //调用自定义的函数,会打印test
ros::spinOnce(); #处理节点订阅话题的所有回调函数
}
5、编译、运行
具体步骤重复上面的5、6、7步骤
最终运行结果为
【INFO】【1543652338.493910660】:hello,ROS!
test