(三)ROS学习
一.话题编程
1.具体流程
- 创建发布者
1.初始化ros节点ros::init();
,创建节点句柄ros::NodeHandle name;
(方便管理具体节点的资源);
2.向ros master注册节点信息(发布话题名和话题中的消息类型)ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000)
//发布名为chatter的topic,消息类型为std_msgs::String,1000为队列长度;
3.设置发布消息的循环频率ros::Eate loop_rate();
- 创建订阅者
1.初始化ros节点,创建节点句柄;
2.订阅需要的话题ros::Subscriber sub = n.subscribe ("chatter",1000,chatterCallback);
//订阅名为chatter的topic,1000为队列长度,注册回调函数chatterCallback(因订阅者不知道何时会有消息进入,故通过多线程的方式在后台循环等待,当有消息进入时会在回调函数中进行数据处理);
3.循环等待话题消息ros::spin();
,接收到消息后进入回调函数,在回调函数中完成消息处理; - 添加编译选项
- 运行可执行文件
2.话题通信模型
3.如何编译代码:
- 设置需要编译的代码和生成的可执行文件;
- 设置链接库;
- 设置依赖。
# 找到catkin_ws/src/learning_communication里的CMakeLists.txt
# cmake是Linux下常使用的编译C++的工具,CMakeLists里面指定了由源码到目标文件的规则,就是去配置一些具体的编译选项,只不过其中都是加了注释,消掉注释改一下即可
# add_executable: 使用给定的源文件,为工程引入一个可执行文件。
# target_link_libraries:该指令的作用为将目标文件与库文件进行链接,指定所生成的可执行文件所链接的库文件,通常卸载add_executable()之后。要生成一个ros节点,必须添加catkin_LIBRARIES。
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
- CMakeLists.txt 原本是 Cmake 编译系统的规则文件,而Catkin编译系统基本沿用了 CMake 的编译风格,只是针对ROS工程添加了一些宏定义,所以在写法上,catkin的 CMakeLists.txt 与 Cmake的基本一致。
4.如何运行可执行文件:
# 先启动ROS Master
roscore
# 运行talker和listener
rosrun learning_communication talker
rosrun learning_communication listener
5.如何自定义话题消息
- 定义msg文件
- 在package.xml中添加功能包依赖
- 在CMakeLists.txt添加编译选项
二.服务编程
1.具体流程
- 创建服务器
- 创建客户端
- 添加编译选项
- 运行可执行程序
2.服务通信模型
3.如何自定义服务请求与应答
- 定义srv文件;
- 在package.xml中添加功能包依赖;
- 在CMakeLists.txt添加编译选项。
4.如何实现一个服务器
- 初始化ros节点;
- 创建Server实例;
- 循环等待服务请求,进入回调函数,在回调函数中完成服务功能处理,并反馈应答数据。
5.如何实现一个客户端
- 初始化ros节点;
- 创建一个Client实例;
- 发布服务请求数据,等待Server处理之后的应答结果。
6.交互过程(以加法程序为例)
- Server节点启动后的日志信息:
rosrun learning_communication server
- Client启动后发布服务请求,并成功接收到反馈结果:
rosrun learning_communication client 3 5
- Server接收到服务调用后完成加法求解,并将结果反馈给client。
二.动作编程
1.什么是动作(action):特点就是需要维持一段时间且有及时的反馈并可以随时取消这个通信
- 一种问答通信机制
- 带有连续反馈
- 可以在任务过程中止运行
- 基于ros的消息机制实现
2.Action的接口
- goal:发布任务目标
- cancel:请求取消任务
- status:通知客户端当前的状态
- feedback:周期反馈任务运行的监控数据
- result:向客户端发送任务的执行结果
3.如何自定义动作消息
- 定义action文件;
- 在package.xml中添加功能包依赖;
- 在CMakeLists.txt添加编译选项。
4.如何实现一个动作服务器
- 初始化ros节点;
- 创建动作服务器实例;
- 启动服务器,等待动作请求,在回调函数中完成动作服务功能的处理,并反馈进度信息;
- 动作完成,发送结束信息。
5.如何实现一个动作客户端
- 初始化ros节点;
- 创建动作客户端实例;
- 连接动作服务端,发送动作目标,根据不同类型的服务器反馈处理回调函数。