前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Qt设计机器人仿真控制器——按键控制机器人关节转动

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

作者头像
用户6557940
发布2022-07-24 15:27:52
9110
发布2022-07-24 15:27:52
举报
文章被收录于专栏:Jungle笔记Jungle笔记

引言

本文结合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?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Jungle笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档