创建工作空间
新建一个文件夹My_v1_ws,作为存放工作空间的位置;
mkdir My_v1_ws
然后在这个目录下,执行catkin_make,这样会生成两个文件夹build 和 devel;
而且src文件夹下会生成CMakelist文件;
再在src目录下新建文件夹,比如应用层使用的mkdir applications,同样,也可以新建其他的文件夹;
创建功能包
cd到applications文件夹下,创建功能包basic_com ,依赖是std_msgs:
catkin_create_pkg basic_com roscpp std_msgs
这样就创建了功能包;
修改功能包名称 mv basic_com a01_basic_com_cpp,application 第一个功能包,名称+使用的语言;
可以回到My_v1_ws下,使用catkin_make,空包编译一下,看看有没有问题;
创建节点
在a01_basic_com_cpp/src文件夹下,创建CPP源文件basic_com_node.cpp,在a01_basic_com_cpp/include/basic_com文件夹下,创建头文件;
修改CMakeList
1.因为是按照catkin生成的位置放置的头文件,所以,iclude_derectories中可以包含include文件夹了;
2.在添加可执行文件:默认生成的可执行文件后面是添加了一个_node
3.生成链接库
编译节点
先启动roscore
在工作空间下再新开一个终端,source ./devel/setup.bash,然后再catkin_make;
运行节点
在工作空间下source ./devel/setup.bash,然后再rosrun basic_com,也就是包名;
ros命令
rosnode -help可以查看node相关的命令;
rostopic -help可以查看topic相关的命令
参数服务器:
服务节点;
话题topic通信
使用的是ros::Publisher和ros::Subscriber;
句柄使用的函数是advertise和subscribe;
包含的头文件
ros::init(argc,argv,"basic_com_node");basic_com_node是节点的名称;
init.h是init函数用到的,还有创建句柄,创建发布者publisher、接受者等用到的。
使用node节点创建的一个发布对象,返回值传递给定义的Pub,advertise函数中有几个参数,包括消息类型,队列长度,还要一个latch参数,不常用;
订阅者的参数中有一个是回调函数;
服务server通信
消息内容不易丢失,比较稳定;
类型ros::ServiceServer
句柄使用的函数是advertiseService和serviceClient;
服务-参数-值;
自定义服务类型
在节点所在文件夹a01_basic_com_cpp下新建srv文件夹,在srv文件夹下新建以.srv结尾的文件,按照请求和返回的参数来编写内容,中间以三个短横线---隔开;
下面一共修改了5处;
修改CMakeList
修改文件夹a01_basic_com_cpp下的,在find_package中添加message_generation;
再取消注释add_service_files,然后添加自己的srv文件:
再取消注释generate_messages:
修改xml文件
添加编译时候的依赖和执行时候的依赖;
编译完使用的时候,还是先创建句柄,然后使用advertiseService函数发布服务,使用serviceClient订阅服务;
可以使用rosserveice call 发布服务消息的请求;