问题产生:
最近帮助一位师兄做一个机械臂关节的数据采集,然后需要读取机械臂在运动过程中的关节数据,然后进行一个读取,本身ROS可以利用rqt_gui可以实时的显示关节轨迹或者通过rostopic echo /joint_state 来查看发布的具体内容,但是这两种方式都不能让我们获得完整的文本数据。所以这篇文章主要是利用ros节点结合c++文本存储的方法来读取写入实时的关节数据。
需要环境
ubuntu 16.04 + Ros kinetic
Universal Robot 包
socket控制UR5python包
机械臂控制包
socket控制UR5python包
获取到当前的位置数据:
get_current_tcp()
控制指令
move_to_tcp()
注意这里接收的指令关于旋转部分是旋转向量(Rx,Ry,Rz),也就是UR5上示教器所接收到的数据,并不是我们传统意义上的欧拉角。它们俩之间有一个转换关系,也在上面的python包中提供了。
如下对比图:
程序实现
具体实现就是:
首先订阅关节话题,然后打开存储文件的位置和名称,最后把相应的关节位置和速度信息取出放在文件中存储。
这里我订阅的频率是1000hz,然后为了大致算出每个取出数据的大致时间,我通过把此时时间减去起始时间得出当前取出数据的时间。
#include "ros/ros.h"
//#include <ros/package.h>
#include "std_msgs/String.h"
#include <iostream>
#include <fstream>
#include "sensor_msgs/JointState.h"
/**
* This tutorial demonstrates simple receipt of messages over the ROS system.
*/
using namespace std;
ofstream f1, f2;
double duration=0; //time duration
double start_time = 0;
void jointstatesCallback(const sensor_msgs::JointStateConstPtr& msg)
{