65.9K
CodeProject 正在变化。 阅读更多。
Home

通过 Kinect 控制 NAO

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (5投票s)

2019 年 1 月 28 日

CPOL

3分钟阅读

viewsIcon

12207

downloadIcon

216

如何使用Kinect控制基于NAOqi的机器人,如NAO、Pepper

引言

本文展示了如何使用Kinect设备,通过NAO-Kinect来控制NAOqi机器人,如 (NAO, Pepper, Romeo)。

背景

我的梦想是控制机器人。 其中一部分是使用Kinect控制机器人,这就是我实现的方法。

我之前开发过一个关于使用Kinect和Arduino控制伺服电机的程序,详见CodeProject。 同样,我还在YouTube链接中展示了使用Kinect控制机械臂。现在,当我拥有自己的NAO机器人时,我对其进行了升级。我希望你喜欢它,并且它可能对你的程序有所帮助。

这个项目的功能

  1. 捕捉站在Kinect前面的人的关节位置
  2. 在Windows Forms应用程序中以数字和图形的形式显示
  3. 将Kinect关节值从Windows传递到NAOqi机器人环境(Python)
  4. 将动作应用到基于NAOqi的机器人上,例如:(NAO、Pepper或romeo)

必备组件

要实现此项目,您必须具备一些软件和硬件

硬件

  1. Kinect (推荐V2)
  2. 带USB3端口的Windows电脑
  3. 基于NAOqi的机器人(可选)

软件

  1. Kinect SDK

    Aldebaran 网站登录/注册并下载

  2. NAOqi SDK: "pynaoqi-2.1.4.13.win32.exe" (推荐版本)
  3. Choregraphe: "choregraphe-suite-2.1.4.13-win32-setup.exe"(推荐版本)

Using the Code

代码分为四个部分和规则。

  1. Main
    • 类型: Windows 应用程序
    • 规则: 用户界面
    • 描述: 显示Kinect关节值和机器人数据,并与用户操作交互的项目
  2. dllKinectCatcher
    • 类型: Windows DLL
    • 规则: Kinect - Windows 界面
    • 描述: 捕捉来自Kinect的所需事件和实时数据值的项目
  3. DllNAO.netV2
    • 类型: Windows DLL
    • 规则: NAOqi - Windows 界面
    • 描述: 使用C#控制基于NAOqi的机器人,是对下面列出的原始NAO.NET项目的改进
  4. Baku.libqiDotNet
    • 类型: Windows DLL
    • 规则: dotnet NAoqi 界面
    • 描述: 针对“qi Framework”的非官方 .NET 包装库,该库是由Aldebaran Robotics创建的消息传递库

1. 主项目

主项目是一个Windows Forms应用程序。(介绍表单和控制表单)

它只是一个简单的Windows Forms应用程序,其中包含许多textBox来保存每个人的关节坐标 (X,Y,Z)。实时数据展示。

主项目的关注点

最有趣的点在于所有文本框如何同时更新而没有停滞...它使用线程和后台工作来完成。

示例代码

这个例子演示了如何使用BeginInvoke Async 更新手部(左和右)的值

//Right Hand
txtKinRHandX.BeginInvoke
  (new Action(() => txtKinRHandX.Text = e.hand.Get(utilities.Side.Right).x.ToString()));
txtKinRHandY.BeginInvoke
  (new Action(() => txtKinRHandY.Text = e.hand.Get(utilities.Side.Right).y.ToString()));
txtKinRHandZ.BeginInvoke
  (new Action(() => txtKinRHandZ.Text = e.hand.Get(utilities.Side.Right).z.ToString()));

//Left Hand
txtKinLHandX.BeginInvoke
  (new Action(() => txtKinLHandX.Text = e.hand.Get(utilities.Side.Left).x.ToString()));
txtKinLHandY.BeginInvoke
  (new Action(() => txtKinLHandY.Text = e.hand.Get(utilities.Side.Left).y.ToString()));
txtKinLHandZ.BeginInvoke
  (new Action(() => txtKinLHandZ.Text = e.hand.Get(utilities.Side.Left).z.ToString()));

2. dllKinect

dllKinect是一个Windows DLL项目,允许从Kinect捕捉关节数据,并将其转换为适合读取的数据。

为什么选择DLL Kinect?

微软提供了用于控制Kinect的Kinect SDK,但该SDK仅提供WPF平台,而不是Windows应用程序。

为了方便将数据捕捉到Windows Forms应用程序中,我不得不开发这个应用程序,这意味着如果你将直接使用WPF开发你的应用程序,你可以取消这个DLL项目。

示例代码

注意:此代码只是一个关于如何捕捉关节的示例。

public  KinectCatcher.utilities.Position Get(KinectCatcher.utilities.Side hand)
{
    KinectCatcher.utilities.Position position = new utilities.Position();
    switch (hand)
    {
        case KinectCatcher.utilities.Side.Right:
            position = RightHandPosition;
           return position;
        case KinectCatcher.utilities.Side.Left:
           position = LeftHandPosition;
             return position;  
        default:
             return new utilities.Position();
    }
}

3. DllNAO.netV2

解决方案的第二个主要部分是NAO.NET项目,它允许你捕捉和转换关节数据,从Windows到NAOqi运动数据,这些数据可以应用于机器人。

过去,我发布了另一篇文章,介绍了如何从Windows应用程序执行Python,并且例如,我可以使用它来控制NAO机器人,你可以在这里查看:NAO.NET V1。但它不适合这种情况,因为它很通用,很慢,并且还有许多其他问题,所以我不得不做一些使用另一种技术的事情,比如消息传递,并开发了另一个版本,名为NAO.NETV2。

主代码

这是主代码,它解释了NAO.NETv2的工作原理。 它可以使用windows控制任何NAOqi机器人,这很棒,并且具有足够的控制能力。

try
{
    if (!session.IsConnected)
    {
        result.ResultStatus = ACall.structAcallResult.Result.failure;
        result.dateTime = DateTime.Now;
        result.Message = "Not Connected";
        return result;
    }
    var nAOQiService = session.GetService(NAOqiParameters.Service.ToString("F"));
    switch (NAOqiParameters.Service)
    {
        case NAOqiServices.ALMemory:
            break;
        case NAOqiServices.ALTextToSpeech:
        
            result.NAOqiObject = 
                nAOQiService[NAOqiParameters.method].Call(NAOqiParameters.SingleParamValue);
            result.Message = "called ALTextToSpeech Successfully";
            
            break;
        #region Motion Service
        case NAOqiServices.ALMotion:
            
            QiList< QiString> names
                        = QiList.Create(NAOqiParameters.names);
            QiList< QiList<QiDouble>> angleLists = 
                QiList.Create< QiList< QiDouble>>(new QiList<QiDouble>[] 
                { QiList.Create(NAOqiParameters.AngleList[0]) });
            
            for ( int i = 1 ; i < NAOqiParameters.AngleList.Count(); i++ ) 
            {
                angleLists.QiValue.AddElement
                        (QiList.Create(NAOqiParameters.AngleList[i]).QiValue);
            }
            QiList< QiList<QiDouble>> timeLists = 
                QiList.Create< QiList<QiDouble>>(new QiList<QiDouble>[] 
                { QiList.Create(NAOqiParameters.timeLists[0]) });
            for ( int i = 1; i < NAOqiParameters.timeLists.Count() ; i++ )
            {
                timeLists.QiValue.AddElement
                     (QiList.Create(NAOqiParameters.timeLists[i]).QiValue);
            }
           QiBool isAbsolute;
            if (NAOqiParameters.isAbsolute)
            {
                isAbsolute = new QiBool(true);
            }
            else
            {
                isAbsolute = new QiBool(false);
            }
            result.NAOqiObject = nAOQiService["angleInterpolation"].Call
                         (names, angleLists, timeLists, isAbsolute);
            result.Message = "successfully called ALMotioin Service";
            
            break;
        #endregion Motion Service
        default:
            break;
    }
    
    result.dateTime = DateTime.Now;
 
    result.ResultStatus = ACall.structAcallResult.Result.Sucess;
    session.Close();
    session.Destroy();
    return result;
}

历史

当然,我想对这个项目有更多的控制和集成,我可能会在gitHub上更新更多代码和控制选项。 欲了解更多项目或帮助,你可以在下面留言与我联系。

© . All rights reserved.