下载完后的rtde包内有rtde
和examples
两个文件夹,前者是接口,后者是例程,采集数据在examples下有例程。
如下所示,对我们采集数据有用的有两个文件:record_configuration.xml
、record.py
将上述两个文件及库拷贝到工作空间下,如下图所示:
打开record_configuration.xml
,写入如下代码段内容,目的是采集时间戳、运动状态及理想运动状态数据。值得注意的是,采集的数据中一个时间戳所对应的数据顺序即按如下代码标签顺序存储,即:
时间戳 — q1 — q2 — … — q6 — dq1 — dq2 — … — dq6 — i1 — i2 — … — i6 — qd1 — qd2 …
对于其他标签数据的采集,可参考《Real Time Data Exchange(RTDE) Guide》或官网。
<?xml version="1.0"?>
<rtde_config>
<recipe key="out">
<field name="timestamp" type="DOUBLE"/>
<field name="actual_q" type="VECTOR6D"/>
<field name="actual_qd" type="VECTOR6D"/>
<field name="actual_current" type="VECTOR6D"/>
<field name="target_q" type="VECTOR6D"/>
<field name="target_qd" type="VECTOR6D"/>
<field name="target_qdd" type="VECTOR6D"/>
<field name="target_current" type="VECTOR6D"/>
</recipe>
</rtde_config>
打开record.py
,修改IP和采样频率,此处UR3e的IP被博主修改为了192.168.1.200
,按最大采样频率500Hz
进行采集。
修改的代码见文末,运行record.py
,会在工作空间中生成robot_data.csv
文件,删除数据title,使用load
命令导入MATLAB处理即可。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
import logging
import sys
sys.path.append('')
import rtde.rtde as rtde
import rtde.rtde_config as rtde_config
import rtde.csv_writer as csv_writer
import rtde.csv_binary_writer as csv_binary_writer
#parameters
parser = argparse.ArgumentParser()
parser.add_argument('--host', default='192.168.1.200', help='name of host to connect to (localhost)')
parser.add_argument('--port', type=int, default=30004, help='port number (30004)')
parser.add_argument('--samples', type=int, default=0, help='number of samples to record')
parser.add_argument('--frequency', type=int, default=500, help='the sampling frequency in Herz')
parser.add_argument('--config', default='record_configuration.xml', help='data configuration file to use (record_configuration.xml)')
parser.add_argument('--output', default='robot_data.csv', help='data output file to write to (robot_data.csv)')
parser.add_argument("--verbose", help="increase output verbosity", action="store_true")
parser.add_argument("--buffered", help="Use buffered receive which doesn't skip data", action="store_true")
parser.add_argument("--binary", help="save the data in binary format", action="store_true")
args = parser.parse_args()
if args.verbose:
logging.basicConfig(level=logging.INFO)
conf = rtde_config.ConfigFile(args.config)
output_names, output_types = conf.get_recipe('out')
con = rtde.RTDE(args.host, args.port)
con.connect()
# get controller version
con.get_controller_version()
# setup recipes
if not con.send_output_setup(output_names, output_types, frequency = args.frequency):
logging.error('Unable to configure output')
sys.exit()
#start data synchronization
if not con.send_start():
logging.error('Unable to start synchronization')
sys.exit()
writeModes = 'wb' if args.binary else 'w'
with open(args.output, writeModes) as csvfile:
writer = None
if args.binary:
writer = csv_binary_writer.CSVBinaryWriter(csvfile, output_names, output_types)
else:
writer = csv_writer.CSVWriter(csvfile, output_names, output_types)
writer.writeheader()
i = 1
keep_running = True
while keep_running:
if i%args.frequency == 0:
if args.samples > 0:
sys.stdout.write("\r")
sys.stdout.write("{:.2%} done.".format(float(i)/float(args.samples)))
sys.stdout.flush()
else:
sys.stdout.write("\r")
sys.stdout.write("{:3d} samples.".format(i))
sys.stdout.flush()
if args.samples > 0 and i >= args.samples:
keep_running = False
try:
if args.buffered:
state = con.receive_buffered(args.binary)
else:
state = con.receive(args.binary)
if state is not None:
writer.writerow(state)
i += 1
except KeyboardInterrupt:
keep_running = False
except rtde.RTDEException:
con.disconnect()
sys.exit()
sys.stdout.write("\rComplete! \n")
con.send_pause()
con.disconnect()