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

2022-07-24 15:27:52 浏览数 (1)

引言

本文结合Qt按键,实现通过按键控制机器人的姿态。

01

引言及本文简介

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

Qt键盘事件(一)——检测按键输入

Qt键盘事件(二)——长按按键反复触发event事件问题解决

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

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

02

头文件设计

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

03

实现

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

代码语言:javascript复制
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值改变会自动触发控制机器人运动的槽函数:

代码语言:javascript复制
  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()));

04

效果

http://mpvideo.qpic.cn/0af227dgze7fkcambigqcayfaecvhxfwfqs37vqqaiaa4ayjauha.f10002.mp4?

0 人点赞