用GPT与Arduino打造智能机器人:MachinaScript框架实战指南
1. 项目概述:当GPT遇见Arduino,你的第一个智能机器人伙伴
如果你对机器人感兴趣,但又觉得传统的编程方式过于复杂,或者你希望自己的机器人能像科幻电影里那样,真正“听懂”人话并做出反应,那么这个项目就是为你准备的。今天,我们来聊聊如何用GPT和Arduino,结合一个名为MachinaScript的框架,亲手打造一个能理解自然语言指令的自动化机器人。这听起来可能很高深,但实际操作起来,你会发现它的门槛远比想象中低。核心思路很简单:我们用一个运行在电脑上的大型语言模型(比如GPT)作为机器人的“大脑”,负责理解你的语音或文字指令;用一块Arduino开发板作为机器人的“身体”,负责控制舵机、传感器等物理部件;而MachinaScript,就是连接大脑和身体的那套“神经语言”,它定义了一种LLM-JSON格式,让GPT的输出能精准地转化为Arduino可以执行的电机动作序列。
这个项目的魅力在于它的模块化和开放性。你不需要从零开始设计复杂的通信协议或动作解析逻辑。MachinaScript框架已经为你搭建好了从指令接收、LLM生成、脚本解析到串口发送的完整管道。你只需要像搭积木一样,组装好硬件,配置好软件,然后通过一个简单的文本文件告诉GPT你的机器人长什么样、能做什么、甚至是什么性格,它就能开始为你工作了。我们这次构建的是一个双舵机模拟的机器人头部,它可以实现“点头”、“摇头”、“环顾四周”等动作。但这只是一个起点,基于这个框架,你可以轻松扩展出带摄像头的巡逻机器人、带机械臂的抓取机器人,或者任何你想象中的形态。
2. 核心思路与框架设计解析
2.1 为什么是“LLM + 微控制器”的架构?
在深入代码之前,我们先拆解一下这个方案的设计逻辑。传统的机器人控制,无论是遥控还是自动程序,其指令集都是预先定义好的、有限的。你想让机器人做一个新动作,就必须去修改底层代码。而大型语言模型(LLM)的出现,带来了根本性的改变。LLM的核心能力是理解和生成自然语言,并能进行一定程度的逻辑推理。当我们把“转动头部30度”这样的自然语言指令丢给GPT时,它不仅能理解,还能将其转化为一套结构化的、机器可读的指令。
但GPT本身无法直接驱动电机,这就是Arduino这类微控制器的用武之地。微控制器擅长实时、精确地控制硬件引脚,产生PWM信号来驱动舵机。所以,一个自然而然的架构就是: “大脑”(LLM在电脑上运行)负责思考和规划,“身体”(Arduino)负责执行,而两者之间需要一种高效、无歧义的“协议”来沟通 。这就是MachinaScript框架要解决的核心问题。它没有选择复杂的自定义二进制协议,而是巧妙地利用了LLM本身极其擅长生成结构化JSON的特点,设计了一套LLM-JSON语言。这样一来,GPT生成指令和开发者阅读、调试指令都变得非常直观。
2.2 MachinaScript框架的模块化管道
MachinaScript将整个机器人控制流程抽象为一个清晰的四步管道,这种设计极大地提升了系统的可维护性和可扩展性。理解这个管道,是后续一切操作的基础。
第一步:输入接收(Input Reception) 。这是流程的起点。你的机器人如何感知世界、接收命令?在这个示例项目中,我们通过电脑的麦克风进行语音输入,使用一个简单的语音识别库(如 SpeechRecognition )将“Hey robot, look up!”这样的语音转换为文本。但这只是其中一种方式。这个模块是完全可定制的。你可以将其替换为:
- 文本输入 :直接在一个Web界面或命令行中输入指令。
- 视觉输入 :通过摄像头捕捉图像,结合多模态LLM(如GPT-4V)来生成指令,例如“走向那个红色的杯子”。
- 传感器输入 :读取温度、距离传感器数据,触发相应的行为逻辑。
第二步:指令生成(Instruction Generation) 。这是LLM大显身手的环节。系统会将上一步得到的用户指令(如“look up”),连同两个关键的文本文件,一起构造成一个完整的提示词(Prompt),发送给LLM。这两个文件是:
machinascript_language.txt: 定义了MachinaScript语言的语法规则,相当于告诉GPT“请用以下格式来回答”。这个文件通常不需要改动。machinascript_project_specs.txt: 描述了 你这个特定机器人 的硬件配置、能力范围和个性。这是项目的灵魂文件,你需要在这里详细定义你的机器人有多少个电机、每个电机的运动范围、它具备哪些“技能”(如拍照、闪灯),甚至它的“性格”是活泼的还是严肃的。 LLM在理解了用户指令和机器人规格后,就会输出一份符合MachinaScript语法的JSON指令集。
第三步:指令解析(Instruction Parsing) 。运行在电脑上的“大脑”程序(如 brain_openai.py )会接收到LLM返回的JSON字符串。程序的工作就是解析这个JSON,提取出里面的具体动作(Actions)。每个动作可能包含多个“运动”(Movements,如同时转动两个舵机)和多个“技能”(Skills,如执行一次拍照函数)。解析器需要验证指令的合法性,并将其转化为程序内部可操作的数据结构。
第四步:动作序列化与执行(Action Serialization) 。解析后的动作需要被翻译成Arduino能懂的语言。对于运动指令,程序会将其序列化成类似 A:45,10;B:0,10; 这样的简洁字符串命令,其中 A 代表电机ID, 45 代表目标角度, 10 代表运动速度。这个字符串通过USB串口发送给Arduino。对于技能指令,则会在电脑端直接调用对应的Python函数(如控制摄像头拍照)。Arduino收到串口命令后,驱动相应的舵机运动到指定位置,从而完成整个闭环。
注意 :这个管道的每个环节都是松耦合的。你可以更换不同的LLM提供商(OpenAI, 本地LLM, HuggingChat),可以增加更复杂的输入模块,也可以为Arduino添加更多的执行器,而无需重写整个系统架构。这种设计是项目能够快速迭代和个性化的关键。
3. 硬件准备与Arduino“身体”端搭建
3.1 物料清单与电路连接
动手的第一步是把机器人的“身体”搭建起来。对于这个双舵机机器人头部示例,你需要准备以下硬件:
- Arduino Uno开发板 x1 : 项目的心脏,负责接收指令并控制舵机。
- SG90微型舵机 x2 : 分别模拟头部的垂直(上下点头)和水平(左右摇头)运动。
- 面包板 x1 : 用于方便地连接电路。
- 跳线(杜邦线)若干 : 公对公、公对母都需要一些。
- USB数据线(A to B)x1 : 用于连接Arduino和电脑,同时供电和通信。
- 电脑一台 : 需要运行Python“大脑”程序和LLM服务。
电路连接非常简单,遵循舵机标准接法即可:
- 舵机1(neck_vertical,控制上下) :
- 棕色线(GND) -> 连接至面包板的负极排,再通过跳线连接到Arduino的
GND引脚。 - 红色线(VCC) -> 连接至面包板的正极排,再连接到Arduino的
5V引脚。 注意 :如果同时驱动多个舵机,建议使用外部电源为舵机供电,以防Arduino板载稳压器过载。 - 橙色线(信号) -> 直接连接到Arduino的 数字引脚9 。
- 棕色线(GND) -> 连接至面包板的负极排,再通过跳线连接到Arduino的
- 舵机2(neck_horizontal,控制左右) :
- GND -> 接面包板负极排。
- VCC -> 接面包板正极排。
- 信号线 -> 连接到Arduino的 数字引脚10 。
- 电源 : 确保面包板的正负极排分别与Arduino的
5V和GND连接牢固。
连接好后,你可以用热熔胶或支架将两个舵机固定在一起,形成一个简单的云台结构,这就是我们机器人的“脖子”了。
3.2 Arduino端代码解析与烧录
硬件连接无误后,我们需要给Arduino“身体”注入灵魂——即上传控制程序。从MachinaScript项目仓库中,找到 MachinaBody/machinascript_body.ino 文件,用Arduino IDE打开它。
让我们看看这段代码的核心逻辑。它主要做了三件事:
- 初始化 :在
setup()函数中,初始化串口通信(通常为9600波特率),并将两个舵机信号引脚(9和10)关联到Servo对象上。 - 命令监听与解析 :在
loop()函数中,持续监听来自串口的数据。它期待收到的命令格式是MotorID:degrees,speed;。例如,A:90,15;B:45,8;。代码会逐个字符读取,识别出电机标识(A或B)、目标角度和速度,并将这些值存储起来。 - 舵机控制 :解析完一个完整的命令段(以分号
;结束)后,代码会根据解析出的角度和速度值,调用servo.write()函数驱动舵机运动。这里有一个关键细节:代码中通常会将接收到的“速度”值映射为一个延迟时间,用于控制舵机从当前位置移动到目标位置的速度,从而实现平滑运动而非瞬间跳变。
烧录与测试步骤 :
- 用USB线连接Arduino和电脑。
- 在Arduino IDE中选择正确的板卡类型(
Arduino Uno)和端口(如COM3或/dev/ttyUSB0)。 - 点击“上传”按钮,将代码烧录到Arduino中。
- 上传成功后,打开IDE的串口监视器(Serial Monitor)。将右下角的波特率设置为与代码中一致的9600,并将行结束符设置为“换行符”。
- 在发送框内输入测试命令,例如
A:90,10;,然后点击发送。你应该能看到连接在引脚9上的舵机缓慢转动到90度的位置。再输入B:45,15;测试第二个舵机。这是验证硬件和基础通信是否正常的关键一步。
4. 软件环境配置与“大脑”端部署
4.1 Python环境与依赖库安装
机器人的“身体”准备好后,我们来配置“大脑”。“大脑”是一个运行在你电脑上的Python程序,它负责与LLM对话、解析指令并控制Arduino。
首先,确保你的电脑上安装了Python 3.7或更高版本。打开终端或命令提示符,我们创建一个独立的虚拟环境并安装依赖,这是一个好习惯,可以避免包版本冲突。
# 创建并进入项目目录
mkdir my_machina_robot && cd my_machina_robot
# 创建Python虚拟环境(以venv为例)
python3 -m venv venv
# 激活虚拟环境
# Windows:
venv\Scripts\activate
# macOS/Linux:
source venv/bin/activate
接下来,根据你选择的LLM“大脑”,安装不同的依赖包。以最常用的 brain_openai.py (使用OpenAI API)为例:
pip install openai pyserial speechrecognition pyaudio
openai: 用于调用OpenAI的GPT API。pyserial: 用于通过串口与Arduino通信,这是“大脑”与“身体”对话的桥梁。speechrecognition和pyaudio: 用于实现语音输入功能。安装pyaudio在某些系统上可能需要额外步骤,例如在macOS上可能需要brew install portaudio,在Linux上可能需要sudo apt-get install python3-pyaudio。
实操心得 :
pyaudio的安装可能是第一个坑。如果遇到错误,可以尝试搜索“Install PyAudio on [你的操作系统]”寻找特定解决方案。一个备选方案是使用pipwin(仅限Windows)来安装预编译的wheel包。如果语音输入实在搞不定,也可以暂时修改brain_openai.py,将输入方式改为简单的控制台文本输入,这能让你快速验证核心流程。
4.2 获取并配置MachinaScript框架
从GitHub克隆MachinaScript项目仓库,这是所有代码和配置文件的基础。
git clone https://github.com/babycommando/machinascript-for-robots.git
cd machinascript-for-robots
克隆后,你会看到 MachinaBrain 和 MachinaBody 两个核心文件夹。我们已经看过 MachinaBody 里的Arduino代码了,现在重点在 MachinaBrain 。
-
配置OpenAI API密钥 :打开
brain_openai.py,在文件开头附近找到设置API密钥的地方。你需要将自己的OpenAI API密钥填入。 绝对不要 将密钥直接硬编码在代码中然后上传到公开仓库。最佳实践是使用环境变量:import os from openai import OpenAI client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))然后在运行程序前,在终端中设置环境变量:
# Windows (cmd) set OPENAI_API_KEY=your-api-key-here # Windows (PowerShell) $env:OPENAI_API_KEY="your-api-key-here" # macOS/Linux export OPENAI_API_KEY=your-api-key-here -
配置串口 :在同一个文件中,找到初始化串口连接的部分(通常使用
serial.Serial)。你需要将port参数修改为你的Arduino实际连接的串口。在Windows上通常是COM3、COM4等;在macOS/Linux上是/dev/tty.usbmodemXXXX或/dev/ttyUSB0。波特率baudrate需要与Arduino程序中设置的保持一致(默认9600)。
4.3 定义你的机器人:项目规格文件详解
这是整个项目中最具创造性的部分。打开 MachinaBrain/machinascript_project_specs.txt 文件。这个文件的内容会被插入到每次发给GPT的提示词中,用于“教导”GPT你的机器人是什么、能做什么、该怎么行动。
文件内容是一个结构化的描述,虽然示例中用了类JSON格式,但本质上它就是一段给LLM看的文本。你需要清晰、无歧义地描述以下信息:
- Motors (电机) : 列出所有电机,给每个电机一个唯一的ID,并说明其运动范围(例如0到180度)。这告诉GPT机器人有哪些可动的关节。
{ "Motors": [ {"id": "motor_neck_vertical", "range": [0, 180], "description": "Controls nodding up and down. 90 is center."}, {"id": "motor_neck_horizontal", "range": [0, 180], "description": "Controls turning left and right. 90 is center."} ], - Skills (技能) : 定义机器人除了运动之外的能力。每个技能对应“大脑”Python程序中的一个函数。描述要具体,说明触发条件和效果。
"Skills": [ {"id": "say_hello", "description": "The robot greets the user by printing a friendly message to the console."}, {"id": "status_report", "description": "Reports the current angle of both servos to the console."} ], - Limitations (限制) : 设定安全规则和物理限制,防止GPT生成危险或不可能的动作。例如限制最大速度、禁止某些角度组合等。
"Limitations": [ {"rule": "motor_neck_vertical should avoid extreme positions below 20 and above 160 to prevent mechanical strain."}, {"rule": "Simultaneous movement speed for both motors should not be 'fast' to prevent high current draw."} ], - Personality & Agency (个性与自主性) : 这是注入灵魂的地方。你可以定义机器人的性格(如“幽默”、“谨慎”、“好奇”),这会影响GPT生成指令的语言风格和动作选择。
Agency_Level可以设置为low(严格遵循指令)、medium(可做简单推断)或high(允许更多创造性解释)。"Personality": ["Playful", "slightly clumsy", "enthusiastic"], "Agency_Level": "medium" }
注意事项 :在编写
specs文件时,描述要尽可能精确。模糊的描述会导致GPT生成不可预测或错误的指令。例如,与其写“可以快速转动”,不如明确“速度参数分为‘slow’(5), ‘medium’(10), ‘fast’(15)三档”。每次修改specs文件后,都需要重启“大脑”程序才能生效。
5. 核心环节:LLM-JSON语言与动作生成原理
5.1 MachinaScript语法深度解析
MachinaScript的本质是一种为控制机器人而设计的领域特定语言(DSL),其载体是JSON格式。这种设计充分利用了LLM生成结构化数据的能力,以及JSON本身易于程序解析的特性。让我们拆解一个完整的MachinaScript指令例子:
{
"Machina_Actions": {
"action_1": {
"description": "Look up and then slowly scan from left to right",
"movements": [
{
"motor": "motor_neck_vertical",
"degrees": 135,
"speed": "medium"
},
{
"motor": "motor_neck_horizontal",
"degrees": 45,
"speed": "slow"
},
{
"motor": "motor_neck_horizontal",
"degrees": 135,
"speed": "slow"
}
],
"useSkills": [
{
"skill": "status_report",
"parameters": {}
}
]
}
}
}
- 顶层结构 :根对象包含一个
Machina_Actions键,其值是一个字典。这种设计允许在一个响应中包含多个独立的action,便于执行复杂任务序列。 - Action (动作) :每个动作是一个独立的执行单元,用唯一的键(如
action_1)标识。每个动作包含:description: 人类可读的描述,帮助开发者理解这个动作的意图。movements: 一个 数组 ,包含一个或多个运动指令。 数组的顺序就是执行的顺序 。这是实现复杂动画的关键。例如,上面的例子先让垂直舵机抬头(degrees: 135),然后让水平舵机缓慢地从45度转到135度,实现“从左到右扫描”的效果。useSkills: 一个数组,定义在此动作中需要调用的技能函数。技能可以与运动并行或按序执行,具体取决于brain代码中的实现逻辑。
- Movement (运动) :定义了单个电机的单次运动。包含:
motor: 对应specs文件中定义的电机ID。degrees: 目标角度,必须在电机定义的range范围内。speed: 运动速度。这里用的是字符串"slow",需要在brain的代码中映射为具体的数值(如延迟时间)。你也可以直接使用数字。
- Skill (技能) :调用一个在
specs中声明、在brain中实现的函数。可以传递parameters。
这种结构的美妙之处在于它的表现力。通过组合多个有序的 movements ,你可以轻松地编排出“点头三次”、“兴奋地抖动”、“沉思般地缓慢转动”等富有表现力的动作序列。GPT在理解了 specs 中的硬件限制和个性描述后,能够生成符合物理约束且具有“性格”的动作脚本。
5.2 “大脑”程序的工作流程剖析
以 brain_openai.py 为例,我们深入看一下从接收到用户语音到驱动舵机转动的完整代码流程:
-
初始化与加载 :程序启动时,会读取
machinascript_language.txt(语法定义)和machinascript_project_specs.txt(你的机器人规格),将它们拼接成一个完整的system_prompt。同时,初始化串口连接和语音识别器。 -
主循环与输入接收 :
while True: print("Listening for wake word 'Hey robot'...") # 使用语音识别库持续监听,直到听到唤醒词 audio = recognizer.listen(source) text = recognizer.recognize_google(audio) if "hey robot" in text.lower(): # 唤醒后,提示用户给出指令 user_command = get_user_command() # 再次监听获取具体命令这段代码实现了一个简单的语音唤醒机制。在实际应用中,你可能需要更鲁棒的唤醒词检测库,如
Snowboy或Porcupine,以降低误触发率和CPU占用。 -
构造提示词与调用LLM :将用户指令(
user_command)和之前准备好的system_prompt组合,发送给OpenAI的Chat Completion API。messages = [ {"role": "system", "content": system_prompt}, {"role": "user", "content": f"Generate MachinaScript for: {user_command}"} ] response = client.chat.completions.create( model="gpt-3.5-turbo", # 或 gpt-4 messages=messages, temperature=0.7, # 控制创造性,机器人控制建议较低值如0.3-0.7 max_tokens=500 ) machina_script_text = response.choices[0].message.content这里的
temperature参数很重要。对于机器人控制这种需要精确、可靠输出的任务,建议设置较低的值(如0.3),以减少LLM的随机性,让生成的动作更稳定、可预测。 -
解析与执行 :程序尝试将LLM返回的文本解析为JSON。解析成功后,进入
execute_machina_script函数。def execute_machina_script(script): data = json.loads(script) actions = data.get("Machina_Actions", {}) for action_id, action_content in actions.items(): # 执行运动 movements = action_content.get("movements", []) for move in movements: motor_id = move["motor"] degrees = move["degrees"] speed_str = move.get("speed", "medium") speed_val = speed_map[speed_str] # 将“slow”映射为具体数值 # 序列化为“A:90,10;”格式 serial_cmd = f"{motor_id_map[motor_id]}:{degrees},{speed_val};" arduino_serial.write(serial_cmd.encode()) time.sleep(0.5) # 等待动作执行 # 执行技能 skills = action_content.get("useSkills", []) for skill in skills: if skill["skill"] == "status_report": print("Current servo positions: ...") # ... 调用其他技能函数这个函数是“大脑”的核心。它遍历每个动作中的每个运动,根据
specs里定义的映射关系(例如将motor_neck_vertical映射为串口命令中的A),生成最终的串口指令字符串,并通过pyserial发送。同时,它也会检查并执行相应的技能函数。
6. 调试、问题排查与进阶技巧
6.1 常见问题与解决方案速查表
在构建过程中,你几乎一定会遇到一些问题。下面是一个快速排查指南:
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| Arduino舵机不动 | 1. 电源问题 2. 接线错误 3. 串口未连接或端口错误 4. 代码未上传成功 |
1. 检查舵机VCC是否接5V,GND是否共地。尝试单独用外部电源供电。 2. 确认信号线接在了代码中定义的引脚(如9和10)。 3. 在Arduino IDE中确认选择了正确的端口,并用串口监视器手动发送 A:90,10; 测试。 4. 重新编译并上传代码,观察上传过程中的提示信息。 |
电脑端Python程序报错 SerialException |
1. 串口被占用 2. 端口号错误 3. 波特率不匹配 |
1. 关闭Arduino IDE的串口监视器或其他可能占用该端口的软件。 2. 在设备管理器中确认Arduino的COM口号,并更新Python代码中的 port 变量。 3. 确保Python代码中的 baudrate 与Arduino程序中的 Serial.begin() 速率一致。 |
| LLM返回的指令格式错误或无法解析 | 1. specs 文件描述不清 2. system_prompt 拼接错误 3. LLM的 temperature 过高 |
1. 检查 machinascript_project_specs.txt ,确保JSON格式正确(可使用在线JSON校验器),描述清晰无歧义。 2. 打印出完整的 system_prompt ,检查 language 和 specs 文件内容是否正确加载和拼接。 3. 将API调用的 temperature 参数调低至0.3再试。 |
| 语音识别不准确或无法唤醒 | 1. 麦克风问题 2. 环境噪音大 3. 语音识别库配置问题 |
1. 检查系统麦克风设置,确保Python程序有权限访问麦克风。 2. 在安静环境下测试,或尝试使用离嘴更近的麦克风。 3. 尝试使用 recognizer.recognize_google 的其他参数,或换用离线的 recognize_sphinx (需安装CMU Sphinx)测试。 |
| 动作执行顺序错乱或不同步 | 1. 串口命令发送太快 2. 动作解析逻辑未考虑顺序 |
1. 在 execute_machina_script 函数中,每个 serial.write() 后增加一个短暂的 time.sleep() ,确保Arduino有足够时间处理上一个命令。 2. 确认代码严格按照 movements 数组的顺序执行,并且在前一个动作完成(如通过延时或等待Arduino回传信号)后再执行下一个。 |
6.2 从示例到创造:个性化你的机器人
当基础的双舵机头部运行起来后,你就可以开始无限扩展了。MachinaScript框架的威力在于其灵活性。
硬件扩展 :
- 更多自由度 :增加舵机,构建一个多关节的机械臂。只需在
specs文件的Motors数组里添加新的电机定义,并在Arduino代码中初始化新的Servo对象。 - 环境感知 :添加传感器。例如,接入一个超声波测距传感器(HC-SR04),然后定义一个
avoid_obstacle技能。在specs中描述这个技能:“当检测到前方20厘米内有障碍物时,自动停止前进并向右转”。在brain代码中实现读取传感器数据并做出判断的逻辑。 - 交互输出 :加入一个LED灯环来表达情绪,或者加入一个MP3模块让机器人可以说话。将这些定义为新的
Skills。
软件与行为扩展 :
- 多模态交互 :使用
brain_openai.py的修改版,结合GPT-4V的视觉能力。让机器人通过摄像头“看”世界,然后生成指令。例如,你可以举着一个写有“点头”的卡片,机器人识别后就会做出点头动作。 - 自主行为模式 :修改主循环,不再等待语音唤醒,而是让机器人进入一个“自主探索”模式。例如,结合摄像头和视觉LLM,让机器人持续分析环境,并生成如“巡视房间”、“寻找红色物体”等自驱动的MachinaScript。
- 优化提示工程 :精细打磨
machinascript_project_specs.txt和machinascript_language.txt。你可以为不同的任务设计不同的“人格”模板。比如,一个“护理机器人”模板可能包含缓慢、平稳的运动限制和温和的个性描述;而一个“演示机器人”模板则可能包含更夸张、有表现力的动作描述。
性能与稳定性优化 :
- 本地LLM部署 :如果担心API延迟、成本或隐私,可以使用
brain_local_llms.py,搭配在本地运行的LLM(如Llama 3, Gemma等)。这需要一定的本地GPU资源,但能获得更快的响应速度和完全离线的体验。 - 错误处理与重试 :在
brain代码中增加健壮的错误处理。例如,如果LLM返回的JSON解析失败,可以尝试让GPT重新生成,或者回退到一个安全的默认动作。 - 运动平滑算法 :在Arduino端,可以实现更复杂的运动插值算法(如缓动函数),让舵机的运动更加平滑自然,而不是简单的线性移动。
这个项目的终点不是你复现了一个会动的机器人头,而是你掌握了一套将自然语言想象力转化为物理世界动作的方法论。从理解管道开始,到硬件连接、代码调试,最后到无限的个性化扩展,每一步都充满了动手的乐趣和创造的成就感。MachinaScript框架像一把钥匙,打开了一扇门,门后是一个由语言驱动物理动作的新世界。
更多推荐



所有评论(0)