通过 Kinect 控制 NAO






4.83/5 (5投票s)
如何使用Kinect控制基于NAOqi的机器人,如NAO、Pepper
引言
本文展示了如何使用Kinect设备,通过NAO-Kinect来控制NAOqi机器人,如 (NAO, Pepper, Romeo)。
背景
我的梦想是控制机器人。 其中一部分是使用Kinect控制机器人,这就是我实现的方法。
我之前开发过一个关于使用Kinect和Arduino控制伺服电机的程序,详见CodeProject。 同样,我还在YouTube链接中展示了使用Kinect控制机械臂。现在,当我拥有自己的NAO机器人时,我对其进行了升级。我希望你喜欢它,并且它可能对你的程序有所帮助。
这个项目的功能
- 捕捉站在Kinect前面的人的关节位置
- 在Windows Forms应用程序中以数字和图形的形式显示
- 将Kinect关节值从Windows传递到NAOqi机器人环境(Python)
- 将动作应用到基于NAOqi的机器人上,例如:(NAO、Pepper或romeo)
必备组件
要实现此项目,您必须具备一些软件和硬件
硬件
- Kinect (推荐V2)
- 带USB3端口的Windows电脑
- 基于NAOqi的机器人(可选)
软件
-
从Aldebaran 网站登录/注册并下载
- NAOqi SDK: "pynaoqi-2.1.4.13.win32.exe" (推荐版本)
- Choregraphe: "choregraphe-suite-2.1.4.13-win32-setup.exe"(推荐版本)
Using the Code
代码分为四个部分和规则。
- Main
- 类型: Windows 应用程序
- 规则: 用户界面
- 描述: 显示Kinect关节值和机器人数据,并与用户操作交互的项目
- dllKinectCatcher
- 类型: Windows DLL
- 规则: Kinect - Windows 界面
- 描述: 捕捉来自Kinect的所需事件和实时数据值的项目
- DllNAO.netV2
- 类型: Windows DLL
- 规则: NAOqi - Windows 界面
- 描述: 使用C#控制基于NAOqi的机器人,是对下面列出的原始NAO.NET项目的改进
- 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上更新更多代码和控制选项。 欲了解更多项目或帮助,你可以在下面留言与我联系。