1.创建一个功能包
首先,创建一个文件夹作为我们的“工作空间”,然后在工作空间内新建一个src文件夹:
接着我们在我们的工作空间的目录下,运行以下代码:
catkin_make
然后在工作空间里会出现:build
、devel
、.catkin_workspace
这三个文件。/src里会出现CMakeLists.txt
这个文件。
以下是一段题外话:
我不知道为什么很多博客都将/src作为工作空间,并且在运行catkin_make
之前会在/src里运行catkin_init_workspace
,实际上,运行catkin_make
的时候,会默认多执行一句等同于catkin_init_workspace
的代码,而且.catkin_workspace
无论是那种方法,都是生成在/src里,所以我不知道到底/src是工作空间,还是其父文件夹是工作空间,反正我的理解是后者。
直接使用catkin_make
:
先init
再make
:
我又去Wiki上看了看,根目录的确是工作空间,那个src是资源空间:
题外话结束
接下来就是在/src运行代码,创建一个功能包:
看看代码结构:catkin_create_pkg 包名 依赖包1 依赖包2 依赖包…
我们使用ROS就可以极大地利用其提供的依赖包。
catkin_create_pkg test std_msgs roscpp rospy
然后我们得到以下结果:
它提示我们修改package.xml里的值,但是这个文件是维护者标签,相当于包的说明,开源类型等等等,我们调试的时候可以不用修改,最后再修改即可。至于如何修改标签,我们可以在这篇文章中查到详细的方法:ROS入门教程-1.1.3 创建ROS程序包—8.自定义 package.xml
2.编写一个节点
然后我们在/src/test/src
里编写我们的代码,比如:hello.cpp:
#include"ros/ros.h"
int main(int argc,char **argv)
{
ros::init(argc,argv,"hello");
ros::NodeHandle n;
ros::Rate loop_rate(10);
while(ros::ok())
{
ROS_INFO("Hello World!");
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
为了我们能够让包找到hello这个节点,我们需要编辑其信息:
修改包内的CMakeLists.txt
:
取消掉catkin_package()
的部分注释:
并在后面添加以下代码:
add_executable(hello src/hello.cpp)
target_link_libraries(hello ${catkin_LIBRARIES})
具体它们是看嘛的,可以看文件里的注释:
如果添加过于靠前,可能导致找不到包,最规范的还是改在注释那部分附近
保存后,我推荐将我们这个工作空间添加到我们系统环境里,不然每次我们编译或运行都要额外写一句代码,让它能找到我们的工作空间:
在主目录下编辑.bashrc
文件:sudo gedit .bashrc
,在文件末尾添加我们devel/setup.bash这个文件:
保存后 ,新打开一个终端 source一下:
我们去工作空间编译:catkin_make
这样就编译好了:
试试效果:
好了,成功!