查看ROS消息命令总结以及ROS下C++编程的一般套路

查看ROS消息命令总结以及ROS下C++编程的一般套路

   ros中节点(node)、话题(ropic)、消息(message)、服务(service)等概念是ros的基础,学会查看相关信息对调试代码十分重要。本文分为两部分:一是介绍ROS下常用的消息查看命令,二是总结ROS下基础的编程套路。

(一)ROS下查看消息常用命令

  以下消息查看命令全部基于小乌龟例程。
  首先要知道通过rosnode、rostopic、rosmsg、rosservice指令查看能够使用的命令,每个命令后面会有相应的information,通过information可以初步理解命令的用途。
查看ROS消息命令总结以及ROS下C++编程的一般套路
查看ROS消息命令总结以及ROS下C++编程的一般套路
查看ROS消息命令总结以及ROS下C++编程的一般套路
查看ROS消息命令总结以及ROS下C++编程的一般套路

rosnode常用命令

  rosnode list:该命令可以查看当前活跃的节点,小乌龟运行结果如下:
查看ROS消息命令总结以及ROS下C++编程的一般套路
  rosnode info:该命令用来查看节点的发布订阅状态。rosnode info /teleop_turtle为例得到以下结果:
查看ROS消息命令总结以及ROS下C++编程的一般套路

rostopic常用命令

  rostopic list:查看当前活跃的话题列表:
查看ROS消息命令总结以及ROS下C++编程的一般套路
  rostopic type:通过该命令可以查看话题下的消息类型。以/turtle1/cmd_vel为例,可以知道其消息类型为geometry_msgs/Twist。
查看ROS消息命令总结以及ROS下C++编程的一般套路
  topic info:该命令可以查看指定话题的发布订阅状况。以rostopic info /turtle1/cmd_vel为例,得到以下结果:
查看ROS消息命令总结以及ROS下C++编程的一般套路
  rostopic echo:通过该命令可以查看话题中消息的实时数据以/turtle1/cmd_vel为例得到以下结果:
查看ROS消息命令总结以及ROS下C++编程的一般套路

rosmsg常用命令

  rosmsg list:同样该命令可以查看当前活跃的消息列表,小乌龟例程运行结果如下:
查看ROS消息命令总结以及ROS下C++编程的一般套路
  rosmsg info:通过该指令查看消息内部的具体格式,以rosmsg info mavros_msgs/State为例可以得到以下结果(rosmsg show也有一样的作用效果):

查看ROS消息命令总结以及ROS下C++编程的一般套路

rosservice常用命令

  rosservice list:通过该命令可以查看当前活跃的服务列表,小乌龟运行例程如下:
查看ROS消息命令总结以及ROS下C++编程的一般套路

  另外ROS常用的命令还有rqt_graph,其可以查看程序整体的发布订阅状况,在程序较为复杂的情况下该指令可以直观地感受节点、消息等的运行状况。小乌龟例程的运行结果如下:
查看ROS消息命令总结以及ROS下C++编程的一般套路

(二)ROS下基础的C++编程套路

以增加小乌龟发布速度消息为例,需要注意以下四个部分:

一、头文件部分
  头文件需要包含你所要发的消息类型。在小乌龟例程中,发布速度的话题是/turtle1/vel_cmd。这需要包含相关头文件信息,就是rostopic type /turtle1/vel_cmd的类型,即包含#include <geometry_msgs/Twist.h>头文件。

二、公告,获取句柄部分
  发布消息前需要公告并且获取相应的句柄。在小乌龟例程中,我们就可以写:
ros::publisher vel_tar_pub = nh.advertise<geometry_msgs::Twist(“/turtle1/vel_cmd”, 10);
一般需要修改的有三部分:
1.vel_tar_pub:就是一个名称(自己取);
2.geometry_msgs::Twist:消息类型(rostopic type 话题名 得到的消息类型);
3./turtle1/vel_cmd:需要发布的话题名;

三、 实例化发布的消息
geometry_msgs::Twist vel_cmd;
 vel_cmd.linear.x = 2;
 vel_cmd.angular.x = 1;

四、发布消息
vel_tar_pub.publish(vel_cmd);

综上所述,ROS下一个发布速度消息的C++程序是这样的:
#include <ros/ros.h>
#include <……>
#include <……>
#include <geometry_msgs/Twist.h>//包含需要发布的消息类型

int main(int argc, char **argv)
{
  ros::init(argc, argv, “offb_node”);
  ros::NodeHandle nh;

  ros::ServiceClient arming_client =  nh.serviceClient<mavros_msgs::CommandBool>
(“mavros/cmd/arming”);
 …
 …
 …
ros::publisher vel_tar_pub = nh.advertise<geometry_msgs::Twist>
(“/turtle1/vel_cmd”, 10);//

  ros::Rate rate(20.0);

geometry_msgs::Twist vel_cmd;
 vel_cmd.linear.x = 2;
 vel_cmd.angular.x = 1;

 while(ros::ok()){

  vel_tar_pub.publish(vel_cmd);

  ros::spinOnce();
  rate.sleep();
 }

}

  综上叙述了利用ROS下查看相关消息指令,协助编写ROS下的C++程序。