查看ROS消息命令总结以及ROS下C++编程的一般套路
ros中节点(node)、话题(ropic)、消息(message)、服务(service)等概念是ros的基础,学会查看相关信息对调试代码十分重要。本文分为两部分:一是介绍ROS下常用的消息查看命令,二是总结ROS下基础的编程套路。
(一)ROS下查看消息常用命令
以下消息查看命令全部基于小乌龟例程。
首先要知道通过rosnode、rostopic、rosmsg、rosservice指令查看能够使用的命令,每个命令后面会有相应的information,通过information可以初步理解命令的用途。
rosnode常用命令
rosnode list:该命令可以查看当前活跃的节点,小乌龟运行结果如下:
rosnode info:该命令用来查看节点的发布订阅状态。rosnode info /teleop_turtle为例得到以下结果:
rostopic常用命令
rostopic list:查看当前活跃的话题列表:
rostopic type:通过该命令可以查看话题下的消息类型。以/turtle1/cmd_vel为例,可以知道其消息类型为geometry_msgs/Twist。
topic info:该命令可以查看指定话题的发布订阅状况。以rostopic info /turtle1/cmd_vel为例,得到以下结果:
rostopic echo:通过该命令可以查看话题中消息的实时数据以/turtle1/cmd_vel为例得到以下结果:
rosmsg常用命令
rosmsg list:同样该命令可以查看当前活跃的消息列表,小乌龟例程运行结果如下:
rosmsg info:通过该指令查看消息内部的具体格式,以rosmsg info mavros_msgs/State为例可以得到以下结果(rosmsg show也有一样的作用效果):
rosservice常用命令
rosservice list:通过该命令可以查看当前活跃的服务列表,小乌龟运行例程如下:
另外ROS常用的命令还有rqt_graph,其可以查看程序整体的发布订阅状况,在程序较为复杂的情况下该指令可以直观地感受节点、消息等的运行状况。小乌龟例程的运行结果如下:
(二)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++程序。