1 创建文件,初始化工作空间
mkdir -p -/catkin_ws/src
cd -/catkin_ws/src
catkin_init_workspace # src下出现CMakeList
2 编译
cd ...
caktin_make # catkin_ws下出现build和devel
3 创建功能包
cd src
#创建指令 #包名(文件夹名字) #依赖的功能包
catkin_create_pkg XXXXXX std_msgs rospy roscpp
此时,新创建的包文件夹下会有include、src、CMakeList.txt、package.xml
“CMake是一种跨平台编译工具,CMake主要是编写CMakeLists.txt文件,然后用cmake命令将MakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库。”
“package.xml 也是一个catkin的package必备文件, 它是这个软件包的描述文件, 用于描述pacakge的基本信息。rospack find 、 rosdep 等命令之所以能快速定位和分析出package的依赖项信息, 就是直接读取了每一个pacakge中的 package.xml 文件。”
在src下编辑文件seg.cpp,添加到CMakeList:
# 可执行文件名 源文件名
add_executable(seg src/seg.cpp)
# 可执行文件名 添加可执行文件的依赖
target_link_libraries(seg ${catkin_LIBRARIES})
注意添加CMakeList时,顺序不要乱了,遇到过生成的可执行文件出现在build而不是在devel中:
CMakeList中声明顺序有问题,要先声明catkin_package(),再声明add_executable()
4 创建新的话题
在当前功能包新建msg文件夹,存放msg文件(由于话题名自带包名,所以yolo录的话题都是darknet_ros_msgs/
开头的,用的时候新建的话题也得是darknet_ros_msgs/
打头,我这里干脆新创建同名包darknet_ros_msgs,专门存话题了)
package.xml下添加:
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend> # 或者<exec_depend>message_runtime</exec_depend>
CMakeList添加
find_package(message_generation) # 话题用到的依赖,比如pcl库等
add_message_files(BoundingBox.msg BoundingBoxes.msg) # 话题文件
catkin_package(message_runtime)
catkin_make
后在catkin_ws/devel/include/darknet_ros_msgs
下生成话题.h文件;
在程序中#include <darknet_ros_msgs/BoundingBox.h>
进来就好;
如果是在单独的功能包中创建的的话题,还需要在CMakeList中find_package(darknet_ros_msgs)
launch文件
<launch>
<!-- 两种参数读入方式 -->
<!-- 1、从yaml文件中 -->
<rosparam file="$(find segmentation)/config/params.yaml" command="load" />
<!-- 2、直接从launch文件中 -->
<param name="center_x" value="381.91"/>
<!-- pkg:包名 type:可执行文件名 name:节点名 -->
<node pkg="segmentation" type="seg" name="seg" output="screen" respawn="true" />
<node name="rviz" pkg="rviz" type="rviz" output="log" args="-d $(find segmentation)/launch/rviz.rviz" />
</launch>
参数服务器
yaml文件直接写就行了,launch文件<rosparam file="$(find segmentation)/config/params.yaml" command="load" />
找到它。
id: 56
poseTopic: "/vins_estimator/odometry"