
最近购买了新的六维力传感器,信号采集过程一波三折,下面进行了梳理,防止以后再遇到类似问题。
相关硬件参数
六维力传感器
±15v供电,输出差分信号,每一维力/力矩信号各有两根线,分别标定了基础电压和满量程电压。
基础电压:力传感器0N时对应的电压值;
满量程电压:力传感器满量程时对应的电压值。
稳压电源
明伟电源(淘宝有售),D-30F15,输出电压±15v,功率30w

采集卡
阿尔泰USB3131A-16位 100K采集(淘宝有售),最多支持8路差分信号采集。

每个通道的采样速率设置为15000,15000 * 6 = 90000 < 100000,合理。
采用模拟量输入电压连续采样方式,nRefGround设置为ACTS2200_AI_REFGND_DIFF,其他采集卡的相关设置程序不再赘述。
电压信号转换
我使用的传感器的基础电压zero_voltages_[6]、满量程电压full_scale_voltages_[6]、量程full_scale_fts[6]分别如下:
double zero_voltages_[6] = {1.038, 1.128, 1.412, 0.432, 0.263, 0.697};
double full_scale_voltages_[6] = {5.948, 6.270, 6.760, 5.670, 5.321, 5.684};
double full_scale_fts[6] = {200, 200, 200, 10, 10, 10};
假设采集卡采集到的六维力/力矩原始电压信号放在voltage_origin[6]中,转换程序如下:
for(int i = 0; i < 6; i++)
{
// 获取当前通道相关参数
int channel_idx = i;
double voltage = voltage_origin[channel_idx];
double zero_voltage = zero_voltages_[channel_idx];
double full_scale_ft = full_scale_fts[channel_idx];
double full_scale_voltage = full_scale_voltages_[channel_idx];
// 计算当前通道力/力矩数值
fx_n_6d[i] = (zero_voltage - voltage) / (full_scale_voltage - zero_voltage) * full_scale_ft;
}
每一维的“电压-力/力矩”值图像关系基本如图所示(以Fx为例)

虽然上面的程序已经可以实际应用(在替换原本的传感器时基本无需任何修改),但是将其可视化之后,我发现还是跟我描述的有一些不一致,力值应该是和电压成正比的,图中画出的关系是反比的,在实际应用中
过程中遇到的问题
问题1

由于原始的配套的线裸露部分较短,我采用了接线端子进行延长,再将延长之后的信号线接入采集卡,发现对传感器施力,检测不到电压变化。
经过排查发现,采用接线端子,虽然锁死了线头,但是并没有真实形成连接,万用表通断检测不出连通。

之后我还是采用了焊接延长线的方式,问题解决,测量到的传感器输出电压可以随着施加的外力进行变化。
问题2
在与机械臂联调姿态阻抗控制时,发现力矩部分图像显示错误。
第一反应我以为是传感器坏了,因为六维力/力矩的转换程序都是采用一样的算法,力部分的图像显示没有问题,但是力矩部分三维的图像显示均存在问题。
在排查过程中,手动对传感器施加外力,观测电压信号,在一定范围内力矩-电压的变化仍然符合线性,但是超过“某个临界值”后,图像跳变到零点了。
感觉还是程序问题,原本使用的程序如下:
for(int i = 0; i < 6; i++)
{
// 获取当前通道相关参数
int channel_idx = i;
double voltage = voltage_origin[channel_idx];
double zero_voltage = zero_voltages_[channel_idx];
double full_scale_ft = full_scale_fts[channel_idx];
double full_scale_voltage = full_scale_voltages_[channel_idx];
double voltage_offset = voltage - zero_voltage;
double voltage_range;
if(voltage_origin[i] >= zero_voltage)
{
voltage_range = full_scale_voltage - zero_voltage;
}
else
{
voltage_range = zero_voltage - full_scale_voltage;
}
fx_n_6d[i] = (voltage_offset / voltage_range) * full_scale_ft;
}
最后在检查程序时,发现原本的程序(AI编写)存在一个临界值判断,去掉该部分,直接进行电压转换,问题解决。
792

被折叠的 条评论
为什么被折叠?



