工欲善其事,必先利其器
本篇博文依旧是小白教程,最近在写利用二次规划方法优化机械臂关节轨迹的代码。想要通过查看误差变量的时间趋势线看一下控制效果。百度了一下,有rqt_plot这个亲民的小白包。
1.百度到了什么?
https://blog.csdn.net/ktigerhero3/article/details/80927310
这个博主的博文讲得比较清楚,就没有继续往下搜了。
2.然后看到了什么?
注意,由于rqt_plot开启了一个节点,所以要先运行roscore,把master运行起来。
$ roscore
$ rosrun rqt_plot rqt_plot
这个时候,我们会看到弹出了一个窗口,先不管他。知己知彼百战不殆,姑且从宏观的角度看一下这个节点的信息。
$ rostopic list
然后没有弹出什么特别的与rqt_plot相关的东西,也就是说,这个rqt_plot本身不会发布消息。
$ rosnode list
可以看到一个匿名发布的节点,也就是说,可以任意开n个rqt_plot也是不影响的。
$ rosnode info rqt_gui_py_node_xxx
查看一下这个节点的信息,看到该节点没有订阅消息,提供了两种服务,没有发布任何消息。
$ rosnode info /rqt_gui_py_node_23864
--------------------------------------------------------------------------------
Node [/rqt_gui_py_node_23864]
Publications:
* /rosout [rosgraph_msgs/Log]
Subscriptions: None
Services:
* /rqt_gui_py_node_23864/get_loggers
* /rqt_gui_py_node_23864/set_logger_level
contacting node http://dianyehuang-G7-7588:33125/ ...
Pid: 23864
Connections:
* topic: /rosout
* to: /rosout
* direction: outbound
* transport: TCPROS
3.怎么用?
从功能上看,rqt_plot需要订阅消息,接收这些消息然后按时间序列画出曲线。在弹出的窗口中,我们可以在topic的文本框中填写我们自己编写的发布的“topic”。接下来需要考虑的是,消息的类型应该是怎么样子的?由前面的博主的代码中我们可以看到,可以是单个变量,也可以是向量。Vector3的类型是怎么样的?我们可以通过rosmsg show 来看一下:
$ rosmsg show geometry_msgs/Vector3
float64 x
float64 y
float64 z
可见,当我们自定义msg的时候,能够对应上变量就可以了。
4. 测试代码
自定义msg
rqtpltMsg,msg
float64 x
float64 y
int32 z
对应代码如下:
#include <ros/ros.h>
#include "my_package/rqtpltMsg.h"
#include <iostream>
#include <math.h>
using namespace std;
int main(int argc, char** argv)
{
ros::init(argc,argv, "test_rqtplt");
ros::NodeHandle nh;
ros::Publisher my_pub = nh.advertise<my_package::rqtpltMsg>("my_msg_plt",1);
my_package::rqtpltMsg msg;
ros::Rate loopRate(200);
double t=0;
while(ros::ok()){
msg.x=0.1*sin(2*t);
msg.y=0.2*cos(t);
msg.z=0;
my_pub.publish(msg);
loopRate.sleep();
t+=1.0/200.0;
}
}