六维力传感器数据采集界面程序设计

使用VS2010和QT,结合qwt插件,创建力传感器数据采集界面。模拟正弦信号展示数据,并解决在Ubuntu Clion中的信号采集问题。涉及文件转换、Q_OBJECT宏、信号与槽的连接,以及动态曲线的实时更新。

本文以vs2010+qt 编程,安装qwt插件,设计界面如图所示,以正弦信号模拟传感器接收的数据,运行效果如下所示.
在这里插入图片描述
由于力传感器相关软件信号采集只能在ubuntu的Clion下,所以需要将相关文件复制拷贝到其项目中,需要的文件有:
在这里插入图片描述
其中moc_xx.cpp改成moc_xx.h, 将其在mywidget.cpp中引用,因为qt编译是用Qmake,而Clion是用Cmake, 如果没加会出现以下错误:
在这里插入图片描述
Q_OBJECT未定义,若将Q_OBJECT删掉,则QT基本的信号和槽功能不能实现:
在这里插入图片描述
所以必须加上上述文件moc_xx.h,
在这里插入图片描述
设计步骤:

  1. 参考我的基于vs2010+qt计算器设计界面,添加qwtplot控件,添加开始和结束按钮,分别命好名qwtPlot_X qwtPlot_Y qwtPlot_Z qwtPlot_RX qwtPlot_RY qwtPlot_RZ
  2. 添加click响应和自定义槽函数start()和finish()
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    运行即可出现界面
    3.重新定义QWTPLOT属性
    在这里插入图片描述
    在这里插入图片描述
    定义模拟信号的函数Getdata 和更新qwtplot_x的函数,其中updatadataSlot_X()是实时显示动态曲线的关键
    在这里插入图片描述
    在start()里添加connect(),连接信号和槽
    在这里插入图片描述
    此时运行可出现第一张图像
    动态显示正弦曲线的相关代码

mywidget.h如下:


#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QtWidgets/QWidget>
#include "ui_mywidget.h"
#include <QTimer>
#include <QTime>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
#include <qwt_legend.h>
#include <math.h>
#include <qwt_plot_zoomer.h>
#include <qwt_plot_panner.h>
#include <qwt_plot_magnifier.h>
#include <qwt_plot_grid.h>
#include <qwt_scale_draw.h>

class mywidget : public QWidget
{
	Q_OBJECT

public:
	mywidget(QWidget *parent = 0);
	~mywidget();

public:
	void setupqwt_X(QwtPlot* qwtplot); //设置QWTPLOT的属性
	void setupqwt_Y(QwtPlot* qwtplot);
	void setupqwt_Z(QwtPlot* qwtplot);
	void setupqwt_RX(QwtPlot* qwtplot);
	void setupqwt_RY(QwtPlot* qwtplot);
	void setupqwt_RZ(QwtPlot* qwtplot);
public:

	QVector<double> t_data;
	QVector<double> X_data;
	QVector<double> Y_data;
	QVector<double> Z_data;
	QVector<double> RX_data;
	QVector<double> RY_data;
	QVector<double> RZ_data;


	QTimer updateTimer;

	QwtPlotCurve *curve_X ;
	QwtPlotCurve *curve_Y ;
	QwtPlotCurve *curve_Z ;
	QwtPlotCurve *curve_RX ;
	QwtPlotCurve *curve_RY ;
	QwtPlotCurve *curve_RZ ;

	double getData_X(double );
	double getData_Y(double );
	double getData_Z(double );
	double getData_RX(double );
	double getData_RY(double );
	double getData_RZ(double );


public slots:
	void updatedataSlot_X();
	void updatedataSlot_Y();
	void updatedataSlot_Z();
	void updatedataSlot_RX();
	void updatedataSlot_RY();
	void updatedataSlot_RZ();
	void start();
	void finish();

	

private:
	Ui::mywidgetClass ui;

};

#endif // MYWIDGET_H

mywidget.cpp如下:

#include "mywidget.h"

mywidget::mywidget(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	setupqwt_X(ui.qwtPlot_X);
	setupqwt_Y(ui.qwtPlot_Y);
	setupqwt_Z(ui.qwtPlot_Z);
	setupqwt_RX(ui.qwtPlot_RX);
	setupqwt_RY(ui.qwtPlot_RY);
	setupqwt_RZ(ui.qwtPlot_RZ);
}

mywidget::~mywidget()
{

}

void mywidget::setupqwt_X(QwtPlot* qwtplot)
{
	//初始化xdata,x对应长度为5的坐标,y初始全为0
	for(int i=1;i<5001;i++)
	{
		t_data.append(double(i)/1000-5);
		X_data.append(0);
	}	
	qwtplot->setTitle("The force of X");
	qwtplot->setCanvasBackground(Qt::gray);//背景

	//添加曲线
	curve_X = new QwtPlotCurve();
	curve_X->setPen( Qt::yellow, 1 ); //曲线的颜色 宽度;

	QTime curtime;
	curtime=curtime.currentTime();

	//设置刻度
	qwtplot->setAxisScale(QwtPlot::yLeft,-2,2,1); //设置刻度范围-2到2,间隔是1
	qwtplot->setAxisScale(QwtPlot::xBottom,-5,0,1);

	//设置网格
	QwtPlotGrid *grid = ne
### 使用CAN总线进行六维力传感器数据采集方法及实现 #### 1. 硬件连接与配置 为了通过CAN总线获取六维力传感器的数据,需先完成硬件连接。通常情况下,六维力传感器会配备有支持CAN通信的接口模块。例如,某些型号的小型六维力传感器如ATI Nano17可能自带CAN接口或可通过适配器转换为CAN信号输出[^1]。 对于具体的接线方式,一般遵循标准的CAN布线原则:两根差分信号线(CAN_High 和 CAN_Low),以及电源和接地线。确保屏蔽层良好接地以减少电磁干扰的影响。 #### 2. 协议解析与初始化设置 每款基于CAN通讯协议工作的六维力传感器都有其特定的消息格式定义。这包括但不限于ID分配、数据长度编码(DLC)设定、各物理量对应的字节位置及其单位换算关系等。查阅所选产品的技术手册来确认这些细节非常重要。 在程序层面,则要依据上述信息编写相应的驱动函数用于初始化设备参数并建立监听机制等待接收来自传感器的新鲜采样值。以下是Python环境下利用`can`库的一个简单实例: ```python import can bus = can.interface.Bus(bustype='socketcan', channel='can0', bitrate=500000) def receive_data(): message = bus.recv() # Blocking wait until a message is received. if message.arbitration_id == SENSOR_ID: # Replace with actual sensor ID data_bytes = list(message.data) fx, fy, fz, mx, my, mz = parse_can_message(data_bytes) return (fx, fy, fz), (mx, my, mz) def parse_can_message(byte_array): """Parse the byte array into force and torque components.""" # Implement parsing logic here based on your specific sensor's protocol pass ``` 此段代码展示了如何创建一个CAN总线对象,并实现了基本的消息接收功能。实际应用中还需要根据具体产品文档调整消息过滤条件和其他选项。 #### 3. 数据处理与校准 由于不同品牌甚至同一系列内的各个个体之间可能存在细微差异,在正式投入使用前往往需要执行一次性的标定流程。该过程涉及施加已知大小的方向/扭矩组合到传感器上,记录下此时产生的电信号强度作为参考基准点;之后再据此构建映射表或者拟合曲线以便后续能够准确反推出真实的学参量。 此外,考虑到环境温度变化等因素可能会引起零漂现象,建议定期重复上述步骤保持测量精度稳定可靠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值