型号和序列号等参数如下:
Description: Six-Axis Force/Torque Sensor Manufacturer: ATI Industrial Automation Serial Number: FT29352 Model: Gamma Calibration: SI-130-10 Electronics: Net F/T Gain Multiplier: 100% |
F/T Tramsducer 将力和力矩转换成电信号并发送到teansducer cable中,这个信号是数字量的信号。其余的一些型号例如Nana和Mini发送的信号是模拟量信号。传感器和盒子接线方式如下,可以通过CAN总线或者网线的方式通信。
我们采用的方式是通过网线连接,所以Can的端口是被占用的,实际接的是24V直流电源。
|
|
上一张实际的接线图,24V电源通过220V转24V的开关电源提供,注意开关电源的电流不要过大。
接下来按照使用手册的说明,应该将网口接到电脑上,电脑的操作系统要求是win7,并且设置电脑的IP地址为192.168.1.100,子网掩码为255.255.255.0,然后在电脑上通过浏览器访问192.168.1.1即可进入传感器的使用和配置界面。我们实际使用的场景是在ROS中的机械臂上,所以操作系统是Linux,由于手册并没有提到linux,所以实测了一下,发现是可以使用的,和windows一模一样。将网线连接到工控机(内置系统为ubuntu14.04+ROS),设置IP地址为静态IP,192.168.1.xxx即可。设置方法参考:https://blog.csdn.net/qq_34935373/article/details/96474491
网页访问如下,注意system status为healthy,当初测试的时候由于线缆接口的地方有点接触不良,导致system status一直报错,而且盒子的指示灯也没有按照指定的方式闪烁。
大致简单的对传感器进行如下设置,不具有参考性,需要按照实际工作环境和要求设置。
Setting界面,是否使能低通滤波器,是否对峰值进行监控(每个轴的最高和最低力和力矩值会被保存为最大峰值和最小峰值),设置软件偏移矢量,初始值为0。在Snapshot界面点击bias按钮,即可设置将传感器数据当前值作为零点,此时bias vector数值就是相差的偏移量,可以在setting界面再将bias vector数据都还原成0并apply,实际应用中,每次启动软件会自动将静止状态的传感器数值设置成bias vector,用来消除运动时候的偏差。
Thresholding界面,设置各个轴的阈值,单位可以是N,也可以是counts,其中Counts = Desired Loading Level × Counts per Force = N × 1000000 counts/N。
本产品提供了16组配置,方便用户应用于不同场景,设置一组参数然后保存,注意此处需要产品序列号。
注意此处设置的单位,后面要统一。 Tool trasnform全都是0表示的是力矩传感器的原点在底面的中心处。
通信方式,网络通信,由于用CAN接口供电,所以注意Protocol要设成CAN Bus(图示设置会报错DeviceNet Protocol erroIF)。 其中RDT表示通信的方式为UDP的方式,频率为7000HZ.同理也可以使用下面的TCP方式,UDP相比较TCP,速度更快,但是可能会丢包。
设置完成之后,从官网下载java的demo可视化程序,进行简单测试。windows环境下需要事先安装JAVA的运行环境,linux环境下同理。
F/T传感器的配置是通过发送URL来对硬件进行设置,其实我也可以通过软件编程的方式来对传感器进行设置,而不需要访问网页,而且通过网络编程的方法,可以直接通过TCP或者UDP获取到数据并进行处理,而不需要想上面那样需要demo来显示。
/* 通过UDP读取一次传感器的数据 */
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define PORT 49152 /* 传感器使用的端口 */
#define COMMAND 2
#define NUM_SAMPLES 1 /* 采集一次数据 */
/* 定义数据格式和UDP数据类型 */
typedef unsigned int uint32;
typedef int int32;
typedef unsigned short uint16;
typedef short int16;
typedef unsigned char byte;
typedef struct response_struct {
uint32 rdt_sequence;
uint32 ft_sequence;
uint32 status;
int32 FTData[6];
} RESPONSE;
int main ( int argc, char ** argv ) {
int socketHandle; /* Handle to UDP socket used to communicate with Net F/T. */
struct sockaddr_in addr; /* Address of Net F/T. */
struct hostent *he; /* Host entry for Net F/T. */
byte request[8]; /* The request data sent to the Net F/T. */
RESPONSE resp; /* The structured response received from the Net F/T. */
byte response[36]; /* The raw response data received from the Net F/T. */
int i; /* Generic loop/array index. */
int err; /* Error status of operations. */
char * AXES[] = { "Fx", "Fy", "Fz", "Tx", "Ty", "Tz" };
/* 运行程序需要加上目的地址192.168.1.1 */
if ( 2 > argc )
{
fprintf( stderr, "Usage: %s IPADDRESS\n", argv[0] );
return -1;
}
/* 开始UDP通信 */
socketHandle = socket(AF_INET, SOCK_DGRAM, 0);
if (socketHandle == -1) {
exit(1);
}
/* 具体参考 9.1 in Net F/T user manual. */
*(uint16*)&request[0] = htons(0x1234);
*(uint16*)&request[2] = htons(COMMAND);
*(uint32*)&request[4] = htonl(NUM_SAMPLES);
/* 发送请求 */
he = gethostbyname(argv[1]);
memcpy(&addr.sin_addr, he->h_addr_list[0], he->h_length);
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
err = connect( socketHandle, (struct sockaddr *)&addr, sizeof(addr) );
if (err == -1) {
exit(2);
}
send( socketHandle, request, 8, 0 );
/* 接收响应 */
recv( socketHandle, response, 36, 0 );
resp.rdt_sequence = ntohl(*(uint32*)&response[0]);
resp.ft_sequence = ntohl(*(uint32*)&response[4]);
resp.status = ntohl(*(uint32*)&response[8]);
for( i = 0; i < 6; i++ ) {
resp.FTData[i] = ntohl(*(int32*)&response[12 + i * 4]);
}
/* 打印显示数据 */
printf( "Status: 0x%08x\n", resp.status );
for (i =0;i < 6;i++) {
printf("%s: %d\n", AXES[i], resp.FTData[i]);
}
return 0;
}
通过gcc netft.c -o netft 生成文件运行./netft 192.168.1.1即可。
接下来通过ROS对传感器进行设置并读取数据,首先要对传感器的标定矩阵有所了解,知道传感器是如何通过计算得到最终的六轴数据。
/* 头文件 ft_sensor.h */
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include