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

NAO.NET,Python 程序到 .NET

starIconstarIconstarIconstarIconstarIcon

5.00/5 (8投票s)

2015年6月19日

CPOL

3分钟阅读

viewsIcon

42454

downloadIcon

831

在 .NET 和其他平台之间运行和交换数据的解决方法

引言

Youtube 文章视频

本文主要展示如何

  1. 使用 .NET 执行任何进程或文件,如 Python 程序
  2. 使用 XML 在 Python 和 .NET 之间交换数据

背景

我有一个名为 NAO V5 的机器人。这个机器人版本不支持 .NET,但它使用 Python 来操作机器人。 如果你想让 .NET 运行命令并与 Python 交换数据以用于你的应用程序,这对你将很有用。 如果你有 NAO 机器人并且你想使用 .NET framework,就像我的情况一样,你可以使用附加的 DLL。

在这个例子中,我只使用 NAO 机器人 v5 作为一个例子,因为它不支持 .NET,而之前的版本支持 .NET。

包含的文件

附加的文件包括

  • .NET Windows 应用程序作为接口
  • .NET DLL 用于与 Python 程序交互
  • Python 示例文件
  • INI 配置文件(你可以更改其值以适应你的环境)

Using the Code

要使用此代码,你需要

  • 具有 C# 一定知识的 .NET
  • 一些关于 Python 的知识

此代码向你展示以下技巧

  • 从 .NET 环境中使用 C# 执行 Python 文件
  • 从执行文件中获取结果数据
  • 编写和读取 XML 文件
  • 读取 INI 文件
  • 通过 XML 文件在 Python 和 .NET 之间交换数据
  • 使用 NAO 机器人作为示例

我将代码分成三个部分

  1. 从 .NET 环境运行 python 代码
  2. 使用 XML 在 Python 和 .NET 之间交换数据
  3. 使用 NAO 机器人的完整示例

1. 从 .NET 环境运行 Python 代码

如果你想从 .NET C# 程序执行 python 程序,那么你使用此脚本

myProcess.StartInfo.FileName = fileName; //This is python File Name
myProcess.StartInfo.CreateNoWindow = true;
myProcess.EnableRaisingEvents = true;
myProcess.Exited += new EventHandler(myProcess_Exited);
myProcess.Start();

这个代码也在 MSDN 中。

2. 使用 XML 在 Python 和 .NET 之间交换数据

通常,之前的代码不允许你从进程结果或 python 程序中获得你需要的很多信息,以添加更多的值。 你可以使用很多方法,我选择 XML 文件。

以下是如何

  1. 在 Python 中创建和写入 XML
  2. 在 C# 中读取 XML

A. 在 Python 中编写 XML

E = lxml.builder.ElementMaker()
ROOT = E.root
DOC = E.doc
XMLHeadYaw = E.HeadYaw
XMLHeadPitch = E.HeadPitch
XMLLHand = E.LHand
XMLRHand = E.RHand

the_doc = ROOT(
        DOC(
            XMLHeadYaw('', value=str(HeadYaw)),
            XMLHeadPitch('', value=str(HeadPitch)),
            XMLLHand('', value=str(LHand)),
            XMLRHand('', value=str(RHand)),
            )   
        )

B. 在 C# 中读取 XML

   public static string GetNAOValue(string ItemName,string ItemField)
        {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(clsDefinitions.xmlFile);
                    XmlNode ItemNode = doc.GetElementsByTagName(ItemName).Item(0);
                    return ItemNode.Attributes[ItemField].Value;
	}

3. 使用 NAO 机器人的完整示例

在我的情况下:我必须调整 Python 文件,以便使用我将从我的 .NET C# 程序传递的参数作为开头。

if __name__ == "__main__":
   robotIP = clsStatics.clsStatics.RobotIP
   PORT = clsStatics.clsStatics.RobotPort
   Hand = "RHand"
   Angle = 1
   if len(sys.argv) > 1: 
        robotIP = sys.argv[1]
        clsFile.clsFile.logInFile(str(robotIP))
        Hand =  sys.argv[2]
        clsFile.clsFile.logInFile(str(Hand))
        Angle= float(sys.argv[3])
        clsFile.clsFile.logInFile(str(Angle))

HandMove(robotIP,PORT,Hand,Angle)

然后,调整 .NET 以执行这些 Python 文件,就像我上面讨论的那样,然后添加 INI 文件来配置机器人信息,然后添加 XML 以从机器人和 Python 环境向 .NET 环境传递更多数据和结果(可选,你也可以取消此步骤)。

关注点

我发现这是一个与 .NET C# 等其他平台(如 Python)交互的好方法。 通过包装 C# 代码在同时运行两个程序时获取和传递数据。 *注意: 你可以将此代码用于任何其他程序或从你的 .NET 程序执行任何进程。

历史

  • 添加了更多 NAO 机器人事件(目前有手部、头部,还可以拍照)
  • 需要向 DLL 添加更多操作
  • 从机器人中捕获了更多事件和内存值
  • 还有一个用于 .NET 的 OpenCV 模块开始开发它(进行中..),但我可能会在另一篇文章中介绍它
© . All rights reserved.