NAO.NET,Python 程序到 .NET





5.00/5 (8投票s)
在 .NET 和其他平台之间运行和交换数据的解决方法
引言
本文主要展示如何
- 使用 .NET 执行任何进程或文件,如 Python 程序
- 使用 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 机器人作为示例
我将代码分成三个部分
- 从 .NET 环境运行 python 代码
- 使用 XML 在 Python 和 .NET 之间交换数据
- 使用 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 文件。
以下是如何
- 在 Python 中创建和写入 XML
- 在 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 模块开始开发它(进行中..),但我可能会在另一篇文章中介绍它