要求::
1、按照课件内容,分别完成话题、服务模式的ROS程序设计,并实践;
2、练习ROS动作编程:客户端发送一个运动坐标,模拟机器人运动到目标位置的过程。包括服务端和客户端的代码实现,要求带有实时位置反馈。同时注意学习cmakelists 的使用方法。
3、在两台电脑上演示ROS的分布式通信,可以小海龟控制或其他例子演示,记录过程。
一,完成话题和服务模式的ROS程序设计
创建工作空间
mkdir catkin_ws
cd catkin_ws/
mkdir src
catkin_init_workspace
编译工作空间,生成工作环境
cd ..
catkin_make
![](https://i-blog.csdnimg.cn/blog_migrate/19e61076f6fc4f958bb326daa397039b.png)
创建功能包
cd src/
catkin_create_pkg qgr_topic roscpp rospy std_msgs geometry_msgs turtlesim
创建发表服务节点
cd qgr_topic/
mkdir srv
cd srv
touch Person.srv
程序设计
person_serve.cpp
#include <ros/ros.h>
#include "qgr_topic/Person.h"
// service回调函数,输入参数req,输出参数res
bool personCallback(qgr_topic::Person::Request &req,
qgr_topic::Person::Response &res)
{
// 显示请求数据
ROS_INFO("Person: name:%s age:%d sex:%d", req.name.c_str(), req.age, req.sex);
// 设置反馈数据
res.result = "OK";
return true;
}
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "person_server");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个名为/show_person的server,注册回调函数personCallback
ros::ServiceServer person_service = n.advertiseService("/show_person", personCallback);
// 循环等待回调函数
ROS_INFO("Ready to show person informtion.");
ros::spin();
return 0;
}
person_client.cpp
#include <ros/ros.h>
#include "qgr_topic/Person.h"
int main(int argc, char** argv)
{
// 初始化ROS节点
ros::init(argc, argv, "person_client");
// 创建节点句柄
ros::NodeHandle node;
// 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service
ros::service::waitForService("/show_person");
ros::ServiceClient person_client = node.serviceClient<qgr_topic::Person>("/show_person");
// 初始化qgr_topic::Person的请求数据
qgr_topic::Person srv;
srv.request.name = "Tom";
srv.request.age = 20;
srv.request.sex = qgr_topic::Person::Request::male;
// 请求服务调用
ROS_INFO("Call service to show person[name:%s, age:%d, sex:%d]",
srv.request.name.c_str(), srv.request.age, srv.request.sex);
person_client.call(srv);
// 显示服务调用结果
ROS_IN