ROS----好多小乌龟
当我们运行完rosrun turtlesim turtlesim_node
后在桌面上出现一只小乌龟,显得那么孤单和寂寞,所以我们就来杀死这个单身龟,再创建一群小乌龟。
之前乌龟的控制是通过topic的发布和订阅来实现,此处的乌龟的死亡和新生是通过service来实现。
启动小乌龟,然后rosservice list
看一下,有哪些服务被启动。可以看到一个/clear、/kill、/spawn、/turtle1/set_pen,从字面理解,kill极有可能就是杀死小乌龟的。所以迫不及待试一下。rosservice info /kill
Node: /turtlesim
URI: rosrpc://dynamicw-Inspiron-3442:44027
Type: turtlesim/Kill
Args: name
需要传入一个参数,也就时杀死的小乌龟的名字,根据名字从生死薄上划去。
rosservie call /kill turtle1
孤独的小乌龟真的没有了。证明猜想正确。
根据/turtle1/set_pen来得到小乌龟的名字为turtle1。
使用同样的方法,查看服务的信息:rosservice info /spawn
Node: /turtlesim
URI: rosrpc://dynamicw-Inspiron-3442:44027
Type: turtlesim/Spawn
Args: x y theta name
/spawn需要四个参数,看着样子很像是创建乌龟的,有坐标,有角度还有名字。
试一下rosservice call /spawn "x:3.0 y:3.0 theta: 3.14 name:'nihao'"
果然在屏幕上出现了一个乌龟,猜想正确。接下来就在代码中创建一个乌龟大家族吧!
#include <ros/ros.h>
#include <turtlesim/Spawn.h>
#include <turtlesim/Kill.h>
#include <string>
#include <iostream>
using namespace std;
int main(int argc,char** argv)
{
//定义好乌龟家族中的名字
string names[] = {"name01","name02","name03","name04","name05","name06","name07","name08","name09","name10"};
ros::init(argc, argv, "moreturtle");
ros::NodeHandle n;
ros::service::waitForService("spawn");//等待/spawn服务启动
ros::ServiceClient client_kill = n.serviceClient<turtlesim::Kill>("kill");//定义一个/kill服务的客户端
turtlesim::Kill kill_name;
kill_name.request.name="turtle1";
client_kill.call(kill_name);//调用/kill服务杀死孤独的小乌龟
ros::ServiceClient client = n.serviceClient<turtlesim::Spawn>("spawn");//定义一个/spawn服务的客户端
turtlesim::Spawn turtle;
for(int i = 0; i < 10;i++)
{
//为每一个乌龟定义未知角度和名字
turtle.request.name="x"+names[i];
turtle.request.x = i+1;
turtle.request.y = 1;
turtle.request.theta = 1.57;
client.call(turtle);//调用/spawn服务生成可爱的小乌龟
}
for(int i = 0;i < 10;i++)
{
turtle.request.name="y"+names[i];
turtle.request.x = 1;
turtle.request.y = i+1;
turtle.request.theta = 0;
client.call(turtle);
}
}