文章

ROS学习记录(九):生成乌龟以及改变背景色

ROS学习记录(九):生成乌龟以及改变背景色

生成乌龟以及改变背景色

一、生成乌龟

需求描述 :编码实现向 turtlesim 发送请求,在乌龟显示节点的窗体指定位置生成一乌龟,这是一个服务请求操作。

结果演示 :

text

实现分析 :

  1. 首先,需要启动乌龟显示节点。
  2. 要通过ROS命令,来获取乌龟生成服务的服务名称以及服务消息类型。
  3. 编写服务请求节点,生成新的乌龟。

实现流程 :

  1. 通过ros命令获取服务与服务消息信息。
  2. 编码实现服务请求节点。
  3. 启动 roscore、turtlesim_node 、乌龟生成节点,生成新的乌龟。

1.服务名称与服务消息获取

获取话题:/spawn

1
rosservice list

获取消息类型:turtlesim/Spawn

1
rosservice type /spawn

获取消息格式: 如果使用

1
rosservice info /spawn

虽然可以得到参数个数和名字,但无法得到参数的类型,所以要使用下面这个命令

1
rossrv info turtlesim/Spawn

响应结果:

1
2
3
4
5
6
float32 x
float32 y
float32 theta
string name
---
string name

2.服务客户端实现

创建功能包需要依赖的功能包: roscpp rospy std_msgs turtlesim

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include"ros/ros.h"
#include"turtlesim/Spawn.h"
/*
    生成一只小乌龟
    准备工作:
        1.服务话题 /spawn
        2.服务消息类型 turtlesim/Spawn
        3.运行前先启动 turtlesim_node 节点

    实现流程:
        1.包含头文件
*/
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "");
    if(argc != 5)
    {
        ROS_INFO("参数错误,请重新输入");
        return 0;
    }
    // 2.初始化 ros 节点
    ros::init(argc, argv, "test_turtle_spawn");
    // 3.创建 ros 句柄
    ros::NodeHandle nh;
    // 4.创建 service 客户端

    ros::ServiceClient client = nh.serviceClient<turtlesim::Spawn>("/spawn");
    turtlesim::Spawn turtle_data;

    turtle_data.request.x = atof(argv[1]); 
    turtle_data.request.y = atof(argv[2]); 
    turtle_data.request.theta = atof(argv[3]);
    turtle_data.request.name = argv[4];

    // 5.等待服务启动

    ros::service::waitForService("spawn");//需要传递话题参数
    // 6.发送请求
    bool spawn_flag = client.call(turtle_data);
    // 7.处理响应

    if (spawn_flag)
    {
        ROS_INFO("响应成功");
    }
}

二、改变背景色

需求描述 : 修改 turtlesim 乌龟显示节点窗体的背景色,已知背景色是通过参数服务器的方式以 rgb 方式设置的。

结果演示:

text

实现分析:

  1. 首先,需要启动乌龟显示节点。
  2. 要通过ROS命令,来获取参数服务器中设置背景色的参数。
  3. 编写参数设置节点,修改参数服务器中的参数值。

实现流程 :

  1. 通过ros命令获取参数。
  2. 编码实现服参数设置节点。
  3. 启动 roscore、turtlesim_node 与参数设置节点,查看运行结果。

1.参数名获取

获取参数列表:

1
rosparam list

响应结果:

1
2
3
/turtlesim/background_b
/turtlesim/background_g
/turtlesim/background_r

2.参数修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include"ros/ros.h"
/*
    实现参数服务器中参数的增加和修改
    实现:
        两种方式
        1.使用NodeHandle中的nh.setParam();
        2.使用ros::param::set();
*/
int main(int argc, char  *argv[])
{
    ros::init(argc,argv,"test_param");
    ros::NodeHandle nh;
    //向参数服务器发送参数
    ros::param::set("/turtlesim/background_r", 255);
    ros::param::set("/turtlesim/background_g", 255);
    ros::param::set("/turtlesim/background_b", 255);
    //red:255,green:255,bule:255,最后是白色
    return 0;
}

3.运行

先启动参数修改程序,再启动乌龟节点。 PS:启动顺序很重要,另外不要用launch文件启动去测试,launch文件启动的仿真器的背景需要在launch文件里初始化更改,用rosrun turtlesim turtlesim_node命令去启动

本文由作者按照 CC BY 4.0 进行授权

热门标签