Qt设计机器人仿真控制器——按键控制机器人关节转动

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/sinat_21107433/article/details/101859410

1.引言及本文简介

在上两篇博客里,Jungle介绍了Qt键盘事件,并在小程序中应用Qt键盘事件监测按键输入:

在之前的一篇博客(Qt设计机器人仿真控制器)Jungle结合Qt和Coin3D设计实现了机器人仿真控制器,鼠标拖拽控制器界面6个轴的滑条,分别控制机器人6个关节转动。本文Jungle将结合Qt键盘事件和机器人仿真控制器,实现一下功能:

  • 按键按下1、2、3、4、5、6中的某个键n,表示接下来的按键操作将控制第n个关节转动;
  • 按键按下“-”或“+”,控制第n个关节向正向或负向转动。

2.实现

在之前机器人仿真控制器的基础上,加上Qt按键相关功能。

2.1.头文件

  • 增加成员变量axisNum,用于记录用户想要控制哪个轴(1、2、3、4、5、6)
  • 声明Qt按键事件函数
    //按键事件
    void keyPressEvent(QKeyEvent *event);
    void keyReleaseEvent(QKeyEvent *event);
    
    //用户按键控制轴号
    int axisNum;

2.2.实现

在 Qt键盘事件(二)——长按按键反复触发event事件问题解决里提到关于按键event反复被触发的问题,但是在本文里将不作处理,因为本文要实现的效果是:比如用户想按键控制第一个关节,先按下数字“1”键,axisNum被置为1;再按下“-”键,在用户按下过程中(直至用户松键),机器人的第一个关节应该是持续转动,而不是在用户松键的时候才突然转动某个角度。基于上述考虑,keyPressEvent和keyReleaseEvent 实现如下:

void Robot::keyPressEvent(QKeyEvent *event)
{
	double curValue[6] = {0};
	//获取当前机器人各个轴的转动角度
	getAxis(curValue);
	switch(event->key()){
		case Qt::Key_Equal:
			{
				switch(this->axisNum){		
					case 1:
						ui.horizontalSlider_Axis1->setValue(curValue[0]*100+1000);
						break;
					case 2:
						ui.horizontalSlider_Axis2->setValue(curValue[1]*100+1000);
						break;
					case 3:
						ui.horizontalSlider_Axis3->setValue(curValue[2]*100+1000);
						break;
					case 4:
						ui.horizontalSlider_Axis4->setValue(curValue[3]*100+1000);
						break;
					case 5:
						ui.horizontalSlider_Axis5->setValue(curValue[4]*100+1000);
						break;
					case 6:
						ui.horizontalSlider_Axis6->setValue(curValue[5]*100+1000);
						break;
					default:
						break;
				}
			break;
			}
		case Qt::Key_Minus:
			{
				switch(this->axisNum){		
					case 1:
						ui.horizontalSlider_Axis1->setValue(curValue[0]*100-1000);
						break;
					case 2:
						ui.horizontalSlider_Axis2->setValue(curValue[1]*100-1000);
						break;
					case 3:
						ui.horizontalSlider_Axis3->setValue(curValue[2]*100-1000);
						break;
					case 4:
						ui.horizontalSlider_Axis4->setValue(curValue[3]*100-1000);
						break;
					case 5:
						ui.horizontalSlider_Axis5->setValue(curValue[4]*100-1000);
						break;
					case 6:
						ui.horizontalSlider_Axis6->setValue(curValue[5]*100-1000);
						break;
					default:
						break;
				}
				break;
			}
	}
}

void Robot::keyReleaseEvent(QKeyEvent *event)
{
	//在松键的时候记录用户按下的哪个键
	switch(event->key()){
		case Qt::Key_1:
			axisNum = 1;
			break;
		case Qt::Key_2:
			axisNum = 2;
			break;
		case Qt::Key_3:
			axisNum = 3;
			break;
		case Qt::Key_4:
			axisNum = 4;
			break;
		case Qt::Key_5:
			axisNum = 5;
			break;
		case Qt::Key_6:
			axisNum = 6;
			break;
		default:
			break;
	}
}

需要说明的是,在keyPressEvent中,只是通过代码改变horizontalSlider_Axis1(代表控制器界面上机器人第一根轴的滑条)的值来控制机器人的第一个轴,这是因为horizontalSlider_Axis1值改变会自动触发控制机器人运动的槽函数:

	connect(ui.horizontalSlider_Axis1,SIGNAL(valueChanged(int)),this,SLOT(setRobotPose()));
	connect(ui.horizontalSlider_Axis2,SIGNAL(valueChanged(int)),this,SLOT(setRobotPose()));
	connect(ui.horizontalSlider_Axis3,SIGNAL(valueChanged(int)),this,SLOT(setRobotPose()));
	connect(ui.horizontalSlider_Axis4,SIGNAL(valueChanged(int)),this,SLOT(setRobotPose()));
	connect(ui.horizontalSlider_Axis5,SIGNAL(valueChanged(int)),this,SLOT(setRobotPose()));
	connect(ui.horizontalSlider_Axis6,SIGNAL(valueChanged(int)),this,SLOT(setRobotPose()));

3.效果

视频效果请见https://zhuanlan.zhihu.com/p/85066106

欢迎关注知乎专栏:Jungle是一个用Qt的工业Robot

欢迎关注Jungle的微信公众号:Jungle笔记

猜你喜欢

转载自blog.csdn.net/sinat_21107433/article/details/101859410