URe系列机器人RTDE采集实时数据的教程

本文介绍如何使用RTDE包配置UR3e机器人以500Hz频率采集时间戳、运动状态等数据,并通过Python脚本将数据保存为CSV文件供进一步分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载完后的rtde包内有rtdeexamples两个文件夹,前者是接口,后者是例程,采集数据在examples下有例程。
在这里插入图片描述
如下所示,对我们采集数据有用的有两个文件:record_configuration.xmlrecord.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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值