如何从新的 Lego Mindstorms Robot Inventor 上的自定义 Python 模块导入

2024-04-13

我一直在使用新的乐高® MINDSTORMS® 机器人发明家。

创建新的“项目”时,该项目似乎包含一个文件。然而,在每个示例代码文件的开头,我们可以看到 Mindstorm 模块已导入,如下所示:

from mindstorms import MSHub, Motor, MotorPair, ColorSensor, DistanceSensor, App
from mindstorms.control import wait_for_seconds, wait_until, Timer
from mindstorms.operator import greater_than, greater_than_or_equal_to, less_than, less_than_or_equal_to, equal_to, not_equal_to
import math

有谁知道如何创建自己的模块并将它们导入给定的项目中?是否可以?


更新2022-02-21

回到这里后,原来的解决方案不再有效。乐高改变了项目的目录结构。每次上传都会创建:

  • 一个随机数目录projects
  • a __init__.mpy文件,它是您发送的代码的编译版本

以上意味着我们无法再从上传的代码中读取运行。我们可以做的是创建文件别处在文件系统上让我们的代码持久化。

例如,这个 MVP 将实现您所需要的:

  1. 上传以下内容:
    content = """
    __version__ = "0.1.1-20220221"
    
    def hello() -> None:
        print("hello from {}".format(__version__))
    """
    
    f = open("mindstorms/custom.py", "w")
    f.write(content)
    f.close()
    
  2. 使用以下内容创建第二个项目:
    from mindstorms.custom import hello
    
    hello()
    

以前的解决方案很脆弱,我不确定破坏它的更改实际上是什么时候发生的。我已经对此进行了测试集线器操作系统3.1.43它有效。我不喜欢这个解决方案,因为你只是写出文件,这使得编辑变得有点糟糕,但至少这很好。

Why mindstorms.custom?这似乎是放置您自己的自定义功能的好地方,它不太可能被官方 Mindstorms 发行版覆盖,并将所有代码集中在一个地方。你could从根目录创建您自己的目录并将文件放在那里,但为了易于使用,我们就这样做。

和以前一样,保留下面的旧答案。


EDIT:又花了一些时间在这上面,并弄清楚了!我将原来的答案保留在下面。这是一个简短的可重现的解决方案。测试使用(取自os.uname)

sysname='LEGO Technic Large Hub'
nodename='LEGO Learning System Hub'
release='1.11.0'
version='v1.11-1139-gf7407e5a0 on 2020-06-19'
machine='LEGO Technic Large Hub with STM32F413xx'
  1. 使用以下内容创建一个新的 python 项目:

    import os
    import sys
    
    def example() -> None:
        print("imported")
    
    # EOF
    
    # upload the module to the Hub
    print("beginning upload from {}...".format(__name__))
    os.chdir("projects")
    open("__init__.py", "w").close()
    filename = "{}.py".format(__name__.split("/")[-1])
    new_filename = "mystorms.py"
    try:
        os.remove(new_filename)
    except:
        print("{} does not exists".format(new_filename))
    os.rename(filename, new_filename)
    # remove everything after EOF
    with open(new_filename, "r") as f:
        content = f.read()
    content = content.split("# EOF")[0]
    with open(new_filename, "w") as f:
        f.write(content)
    print(os.listdir())
    
    sys.exit()
    

    之后的东西# EOF执行实际的“上传”并确保当您尝试将其导入其他地方时,不会重新“上传”它。请注意,在常规 python 中,您可以将其包装在if __name__ == "__main__",但 Mindstorms 在运行时并不使用该约定。

  2. 将该项目发送到您的 Hub 并运行它。请注意,您的集线器上将保留这些文件,我不知道您是否需要担心内存限制。

  3. 使用以下内容创建一个新的 python 项目:

    import os
    
    import projects.mystorms as ms
    
    print(os.uname())
    ms.example()
    

以上应该有效。请注意,如果您需要update文件,您必须调整模块代码以删除原始文件(如果存在),但这是一个微小的更改。除了上述之外我没有做过任何事情,但是这个could导致一种将丢失的 stdlib 内容也添加到 Mindstorms 中的方法。


还没有找到解决方案,但我确实浏览了大部分标准库,看看还可以导入哪些相关的内容...下面没有抛出错误,但我还没有尝试对包进行任何操作他们自己。

import array
import builtins
import cmath
import ctypes
import errno
import gc
import hashlib
import heapq
import io
import json
import math
import os
import random
import re
import select
import struct
import sys
import time

潜在的主题似乎是限制对文件系统的访问,并强制使用实际的 Mindstorms 方法来完成任何异步操作(例如hub.speaker.start_beep()等)。有一些目录结构(0-19 文件),但我还没有弄清楚是否可以使用它来实现您所需要的。

另外值得注意的是,你不能import typing, 但是你can在函数中使用类型提示。我也非常不喜欢你不能从控制台复制粘贴。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从新的 Lego Mindstorms Robot Inventor 上的自定义 Python 模块导入 的相关文章

随机推荐

  • 双倍的 Pow 实现

    我正在开发一个用于运动控制的代码 但我遇到了 pow 函数的问题 我使用VS2010作为IDE 这是我的问题 我有 double p 100 0000 double d 1000 0000 t1 pow p 8 0000 d 1 00 4
  • YouTube.Builder 的正确使用方法

    我需要获取用户 YouTube 视频 这是我的代码 仅尝试获取用户 YouTube 频道 但它不起作用 选择帐户后 加载Youtube频道总是抛出错误 我读了这个answer https stackoverflow com a 214077
  • 如何使用类库中的控制器?

    我在类库中有控制器 但我无法弄清楚如何让主项目识别它们 主项目引用了我的类库 我需要在某处注册它们吗 我想同时使用控制器和 ApiController EDIT 路线配置 创建项目后未更改 public class RouteConfig
  • 在 swift 中将 UIImage 转换为 base64 字符串

    我正在尝试将 UIImage 转换为 base64 字符串 目的是将其上传到后端服务器 然而 我在这篇文章中找到的转换代码 应该是Apple自己的实现 生成了一个无效的字符串 UIImage 和 Base64 字符串之间的转换 https
  • Javafx程序可以通过GUI和命令行控制吗?

    我正在使用 Javafx GUI 但我也需要来自命令行的相同级别的功能 我想知道创建一个同时具有命令行和 Javafx 功能的主类的最佳方法是什么 这样您就可以在 GUI 上做一件事 然后在命令行上做下一件事 命令行还会更新 GUI 显示
  • CSV 日期格式

    我有一个 VB 应用程序 它提取数据并创建 3 个 CSV 文件 a csv b csv c csv 然后我使用另一个 Excel 电子表格 import xls 将上述 CSV 文件中的所有数据导入到此工作表中 import xls 文件
  • 使用 python 进行多元线性回归

    我想用 python 计算多元线性回归 我找到了这个简单线性回归的代码 import numpy as np from matplotlib pyplot import x np array 1 2 3 4 5 y np array 2 3
  • 无法启动服务器。服务器实例未配置

    在尝试为我的项目设置 tomcat 服务器时 出现以下错误 请参阅下面的完整堆栈跟踪 java lang ClassNotFoundException com springsource tcserver serviceability dep
  • libstdc++.so.6 与 cuda 相关的链接器问题

    今天我在链接我编译的 cuda 内容时遇到了问题 我有一个最新的 debian 测试 w 2 6 32 3 amd64 我整天都在写我的代码 不时编译 没有问题 但在进行了较小的代码更改后 我收到以下错误 gcc o pa CUDA o h
  • 在 ASP.Net Core 2 MVC 中禁用模型验证的正确方法

    使用扩展方法设置 MVC services AddMvc 然后在控制器中 这也可能适用于 GET 使用主体中提供的参数创建 POST 操作的方法 例如 HttpPost save public Entity Save FromBody En
  • 如何在 php 中实现位掩码?

    我不确定位掩码是否是正确的术语 让我解释 在 PHP 中 error reporting函数可以通过多种方式调用 Report simple running errors error reporting E ERROR E WARNING
  • Delphi:如何停止 TAction 快捷键自动重复?

    我正在使用 Delphi TActionList 带有用于某些操作的快捷键 我想防止某些操作被键盘自动重复多次触发 但我确实这样做not想要影响全局自动重复操作 这样做的最佳方法是什么 澄清 我仍然需要处理多个快速按键 这是only我想忽略
  • 如何使用扫描仪使该 switch 语句起作用?

    我正在尝试编写一个程序 将字母表中的任何字母 大写或小写 转换为拼音字母表 例如 如果我输入 A 或 a 我的程序会给我 将其更改为 Alpha 我对此和 switch 语句做了很多研究 但我总是陷入困境 我意识到我不能在扫描仪中使用 ch
  • 使用 chrome 进行 OfflineAudioContext FFT 分析

    我正在尝试构建一个波形生成器 它获取音频文件幅度值并在 JavaScript 中尽快 比实时更快 将它们显示到画布上 所以我使用 OfflineAudioContext webkitOfflineAudioContext 加载文件并开始分析
  • 如何更改 Linux 内核交换守护进程 (kswapd) 超时?

    我想通过使用闪存 SSD 等快速设备作为交换设备来减少 kswapd 超时以提高性能 您可以更改以下行为kswapd通过2种方式 通过Proc文件系统 From IBM 开发者工作坊 http www ibm com developerwo
  • Cuda Bayer/CFA 去马赛克示例

    我编写了一个 CUDA4 Bayer 去马赛克例程 但它比在 16 核 GTS250 上运行的单线程 CPU 代码慢 块大小是 16 16 图像暗淡是 16 的倍数 但更改此值并不会改善它 我做了什么明显愚蠢的事情吗 calling rou
  • 多个常数到一个矩阵并将它们转换为matlab中的块对角矩阵

    我有a1 a2 a3 它们是常数 我有一个矩阵A 我想做的是得到a1 A a2 A a3 A三个矩阵 然后我想将它们转移到对角块矩阵中 对于三个常数的情况 这很容易 我可以让b1 a1 A b2 a2 A b3 a3 A 然后在matlab
  • WCF 错误 - 已超出传入消息的最大消息大小配额 (65536) [重复]

    这个问题在这里已经有答案了 我的设置 托管在 IIS Express 中的 ASP NET 客户端 控制台应用程序中托管的 WCF 服务 在管理模式下运行 Visual Studio NET 2012 我试图从 WCF 服务返回 2 个 L
  • 如何在div中浮动span?

    我正在尝试学习如何在没有 Bootstrap 帮助的情况下实际使用 CSS 我有以下内容 可以在这里查看 http plnkr co edit FTCft1YOfQ4xy7FKWEHE p preview http plnkr co edi
  • 如何从新的 Lego Mindstorms Robot Inventor 上的自定义 Python 模块导入

    我一直在使用新的乐高 MINDSTORMS 机器人发明家 创建新的 项目 时 该项目似乎包含一个文件 然而 在每个示例代码文件的开头 我们可以看到 Mindstorm 模块已导入 如下所示 from mindstorms import MS