如果没有工作空间,首先需要创建一个工作空间
mkdir -p ~/catkin_ws/src # 创建了第二层级的文件夹src,这是放ROS软件包的地方 cd ~/catkin_ws/src # 进入工作空间,catkin_make必须在工作空间这个路径上执行 catkin_init_workspace # 初始化src目录,生成的CMakeLists.txt为功能包编译配置
编译工作空间
cd ~/catkin_ws # 回到工作空间,catkin_make必须在工作空间下执行; catkin_make # 开始编译,调用系统自动完成编译和链接过程,构建生成目标文件 # catkin编译之前需要回到工作空间目录,catkin_make在其他路径下编译不会成功 # 对于Python3用户,在一个空的 catkin 工作空间中第一次运行catkin_make的命令应为 catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3 # 这将会配置 catkin_make 使用Python3 可以在随后的构建中只使用catkin_make
设置环境变量
# 查看当前目录应该能看到 'build' 和 'devel' 这两个文件夹 # 在 'devel' 文件夹里面可以看到几个setup.*sh 文件 # source 这些文件中的任何一个都可以将当前工作空间设置在ROS工作环境的最顶层 source devel/setup.bash # 刷新坏境
要保证工作空间已配置正确,需确保ROS_PACKAGE_PATH环境变量包含当前的工作空间目录,采用以下命令查看:
echo $ROS_PACKAGE_PATH # 出现 /home/<youruser>/catkin_ws/src:/opt/ros/kinetic/share
1. 创建功能包
# 同一个工作空间下,不允许存在同名功能包 # 创建功能包,和依赖项 catkin_create_pkg <package_name>[depend1] [depend2] [depend3] # 例如 catkin_create_pkg hello_world
创建成功后会生成一个文件夹,里面有CMakeLists.txt和package.xml两个文件
2. 编写功能包的源代码
进入刚刚新建的功能包目录内,创建src目录
在新建的src目录下新建一个代码文件
例如 新建一个my_hello_world.cpp
写入代码
//包含头文件ros/ros.h,ROS提供的C++客户端库,在后面的编译配置中要添加相应的依赖库roscpp #include "ros/ros.h" int main(int argc,char **argv) { ros::init(argc,argv,"hello_node"); //初始化ros节点;并指明节点的名称为 hello_node ros::NodeHandle n; //声明一个ros节点的句柄; //调用了roscpp库提供的方法ROS_INFO_STREAM来打印信息。这里打印字符串"hello world!"。 ROS_INFO_STREAM("hello world!"); }
3.功能包编译配置
3.1 在package.xml中添加功能包依赖
添加roscpp依赖库
# 找到<buildtool_depend>catkin</buildtool_depend> # 在这句话的下面添加以下内容: <build_depend>roscpp</build_depend> <build_export_depend>roscpp</build_export_depend> <exec_depend>roscpp</exec_depend> # 注意对齐
3.2 在CMakeList.txt添加编译选项
声明依赖库:对于hello_world.cpp来说包含了ros/ros.h这个库,需要添加名为roscpp的依赖库:
# 在CMakeLists.txt文件,在find_package(catkin REQUIRED ...)字段中添加roscpp,添加后的字段: find_package(catkin REQUIRED COMPONENTS roscpp)
# 在CMakeLists.txt中找到include_directories(...)字段,去掉${catkin_INCLUDE_DIRS}前面的注释 include_directories( include ${catkin_INCLUDE_DIRS}
3.3 声明可执行文件
# 在CMakeLists.txt中添加两句,来声明需要创建的可执行文件;一般在文件最后一行添加 add_executable(my_hello_world_node src/my_hello_world_node.cpp) target_link_libraries(my_hello_world_node ${catkin_LIBRARIES})
4.编译功能
编译有两种:编译工作空间内所有功能包、编译工作空间内指定的功能包
4.1 编译工作空间内所有功能包
cd ~/catkin_ws # 回到工作空间,catkin_make必须在工作空间下执行; catkin_make # 开始编译,调用系统自动完成编译和链接过程,构建生成目标文件 source ~/catkin_ws/devel/setup.bash # 刷新环境
编译完成后,如果有新的目标文件产生,那么一般紧跟着要source刷新环境,使得系统能够找到刚才编译生成的ROS可执行文件
4.2 编译工作空间内的指定功能包
# 其实就是加入参数 -DCATKIN_WHITELIST_PACKAGES=” ”,在双引号中填入需要编译的功能包名字,用空格分割 cd ~/catkin_ws catkin_make -DCATKIN_WHITELIST_PACKAGES="hello_world" source ~/catkin_ws/devel/setup.bash # 激活catkin_ws工作空间
5.启用功能包
首先打开一个终端启动ros节点管理器,ros节点管理器是所有节点运行的基础
roscore
第二步,再打开一个命令行终端,输入以下命令:
# 用rosrun <package_name> <node_name>启动功能包中的节点 source ~/catkin_ws/devel/setup.bash # 激活catkin_ws工作空间 rosrun hello_world my_hello_world # 启动功能包中的节点
参考链接
https://blog.csdn.net/lvmengzou/article/details/110836849
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!