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.
- A Lista 7.1 ilustra
ros::param::set
.
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, porros :: init
. Por exemplo, poderíamos lançarpubvel_with_max
com sucesso usando este comando:rosrun agitr pubvel_with_max _max_vel:=1