Acessando parâmetros de C ++

A interface C ++ para os parâmetros ROS é bastante direta:

/void ros::param::set(parameter_name, input_value);
/bool ros::param::get(parameter_name, output_value);

Em ambos os casos, o nome do parâmetro é uma string, que pode ser um nome global, relativo ou privado. O valor de entrada para set pode ser uma std::string, um bool, um int, ou um double; o valor de saída para o get deve ser uma variável (que é passada por referência) de um desses tipos. A função get retorna true se o valor foi lido com sucesso e false se houve algum problema, geralmente indicando que o parâmetro solicitado não foi atribuído a um valor. Para ver essas funções em ação, vamos dar uma olhada em dois exemplos.

Lista 7.1

Um programa C ++ chamado set_bg_color.cpp que define a cor de fundo de uma janela turtlesim.
1   // Este programa aguarda o início do turtlesim e
2   // muda sua cor de fundo.
3   #include<ros/ros.h>
4   #include<std_srvs/Empty.h>
5
6   intmain(intargc,char∗∗argv){
7     ros :: init(argc,argv,"set_bg_color");
8     ros :: NodeHandlenh;
9   
10     // Espere até que o serviço clear esteja disponível, o que
11     // indica que o turtlesim iniciou, e definiu
12     // os parâmetros da cor de fundo.
13     ros :: service :: wait For Service ("clear");
14
15     // Defina a cor de fundo do turtlesim,
16     // substituindo a cor azul padrão.
17     ros :: param :: set ("background_r", 255);
18     ros :: param :: set ("background_g", 255);
19     ros :: param :: set ("background_b", 0);
20
21     // Faça com que o turtlesim pegue os novos valores dos parâmetros.
22     ros :: Service Client clearClient
23         = nh.serviceClient <std_srvs :: Empty>("/clear");
24     std_srvs :: Empty srv;
25     clear Client.call (srv);
26   
27   }

Ele atribui valores inteiros a todos os três parâmetros de cor de fundo do turtlesim. Este programa inclui código para garantir que o nó turtlesim foi iniciado, aguardando o serviço /clear que ele fornece — necessário para garantir que o turtlesim não substitua os valores que definimos aqui — e para chamar esse serviço para forçar o turtlesim a ler os novos valores que definimos. (Nosso foco aqui está nos próprios parâmetros; consulte o Capítulo 8 para obter detalhes sobre os serviços.)

  • A Lista 7.2 mostra um exemplo de ros::param::get.

Lista 7.2

Um programa C++ chamado pubvel_with_max.cpp que estende p pubvel.cpp original lendo sua velocidade linear máxima a partir de um parâmetro.
1   // Este programa publica comandos de velocidade aleatória, usando
2   // uma velocidade linear máxima lida de um parâmetro.
3   # include <ros/ros.h>
4   # include <geometry_msgs/Twist.h>
5   # include <stdlib.h>
6
7   int main(int argc, char ∗∗argv) {
8     ros :: init(argc, argv, "publish_velocity");
9     ros :: NodeHandle nh;
10    ros :: Publisher pub = nh.advertise <geometry_msgs :: Twist>(
11         "turtle1/cmd_vel",1000);
12    srand (time(0));
13 
14    // Pega o parâmetro de velocidade máxima.
15    const std :: string PARAM_NAME = "~max_vel";
16    double maxVel;
17    bool ok = ros :: param :: get(PARAM_NAME, maxVel);
18    if (!ok) {
19      ROS_FATAL_STREAM("Could␣not␣get␣parameter␣"
20      <<PARAM_NAME);
21      exit(1);
22    }
23
24    ros :: Rate rate (2);
25    while (ros :: ok()) {
26      //Crie e envie um comando de velocidade aleatória.
27      geometry_msgs::Twistmsg;
28      msg.linear.x=maxVel∗double(rand())/double(RAND_MAX);
29      msg.angular.z=2∗double(rand())/double(RAND_MAX)−1;
30      pub.publish(msg);
31
32      // Espere até que seja hora de outra iteração.
33      rate.sleep();
34    }
35  }

Ele estende nosso exemplo pubvel original Lista 3.4 lendo um parâmetro de ponto flutuante privado chamado max_vel e usando esse valor para dimensionar as velocidades lineares geradas aleatoriamente. Este programa requer um valor para um parâmetro chamado max_vel em seu namespace privado, que deve ser definido antes de o programa iniciar:

rosparam set /publish_velocity/max_vel 0.1

Se esse parâmetro não estiver disponível, o programa gera um erro fatal e é encerrado.

⏩ É tecnicamente possível (mas um tanto confuso) atribuir um parâmetro privado a um nó em sua linha de comando usando uma sintaxe semelhante a remapeamento, acrescentando um sublinhado (_) ao início do nome:

_param-name:=param-value

Esses tipos de argumentos são convertidos em chamadas ros :: param :: set, substituindo o _ por um para formar um nome privado apropriado, por ros :: init. Por exemplo, poderíamos lançar pubvel_with_max com sucesso usando este comando:

rosrun agitr pubvel_with_max _max_vel:=1