Lima工具箱
项目描述
Lima工具箱
一套命令行工具,希望能简化Lima相机的配置和开发。
安装
TL;DR
在您喜欢的Python环境中,输入
pip install lima-toolbox[all]
工具箱由核心库和用于各种相机的插件组成。
可以使用以下方式安装核心:
pip安装lima-toolbox
要安装特定相机(的)支持,请使用(例如)
pip install lima-toolbox[basler,eiger]
最后,您可以在提供的相机迷你目录中找到。
欢迎实现新相机(或改进、修复现有相机)的PR。
CLI
最有用的工具可能是CLI。您可以使用它来发现网络上的相机,显示有关特定相机的信息,甚至执行捕获。
lima CLI提供全局命令,如scan
,它们不针对特定相机。此外,每个相机都提供其自己的子命令集。可以通过输入lima <camera> <sub-command>
(例如:lima eiger --host=bl99eiger info
)来访问它们。
输入lima --help
将显示帮助。帮助是上下文相关的,因此输入lima basler --help
将显示basler子命令集的帮助。
相机发现
提供scan功能的相机工具箱插件允许您通过使用scan
命令来发现它们
$ lima scan --table-style=box_rounded
Basler:
╭──────────────┬──────────────────────────────┬───────────────────────┬───────────┬────────────┬───────────┬────────╮
│ Class │ Friendly name │ Full name │ Name │ Serial Nb. │ User name │ Vendor │
├──────────────┼──────────────────────────────┼───────────────────────┼───────────┼────────────┼───────────┼────────┤
│ BaslerCamEmu │ Basler Emulation (0815-0000) │ Emulation (0815-0000) │ Emulation │ 0815-0000 │ │ Basler │
├──────────────┼──────────────────────────────┼───────────────────────┼───────────┼────────────┼───────────┼────────┤
│ BaslerCamEmu │ Basler Emulation (0815-0001) │ Emulation (0815-0001) │ Emulation │ 0815-0001 │ │ Basler │
├──────────────┼──────────────────────────────┼───────────────────────┼───────────┼────────────┼───────────┼────────┤
│ BaslerCamEmu │ Basler Emulation (0815-0002) │ Emulation (0815-0002) │ Emulation │ 0815-0002 │ │ Basler │
╰──────────────┴──────────────────────────────┴───────────────────────┴───────────┴────────────┴───────────┴────────╯
Eiger:
╭───────────┬───────────┬─────────────┬──────┬───────╮
│ Host │ Alias(es) │ Address(es) │ Port │ API │
├───────────┼───────────┼─────────────┼──────┼───────┤
│ bl04eiger │ │ 172.95.4.11 │ 8000 │ 1.6.0 │
╰───────────┴───────────┴─────────────┴──────┴───────╯
MythenSLS:
╭────────────┬─────────────┬──────┬────────┬──────────┬──────────┬───────────┬────────────╮
│ Host │ IP │ Port │ Type │ #Modules │ Settings │ Threshold │ Dyn. Range │
├────────────┼─────────────┼──────┼────────┼──────────┼──────────┼───────────┼────────────┤
│ bl04mythen │ 172.95.4.10 │ 1952 │ MYTHEN │ 6 │ STANDARD │ 9071 │ 32 │
╰────────────┴─────────────┴──────┴────────┴──────────┴──────────┴───────────┴────────────╯
在这里您可以查看3个模拟的Basler相机,一个Eiger相机和一个Mythen SLS相机可供使用。
常见的相机命令
如上所述,每个相机都提供自己的一组特定子命令。子命令info
和acquire
对所有相机都是通用的(尽管具体的子命令选项可能有所不同)。
用于识别相机的选项集合对每个相机都是特定的。例如,为了识别一个Eiger,您必须提供--url=<hostname>
选项。
请注意,没有任何强制要求特定的相机实现任何通用子命令。但如果插件这样做的话,这被认为是一种好的做法(为了保持一致性)。
相机插件可以可选地实现scan
命令。它应该提供与全局扫描相同的结果,但结果仅限于相机类型。
相机信息
使用info
子命令可以检索相机的基本信息。
示例
$ lima eiger --url=bl04eiger info
CurrImageType: 10
DefImageType: 10
DetectorImageSize: <3110x3269>
DetectorModel: Dectris Eiger 9M
DetectorType: E-18-0102
InstrumentName: instrument
MaxImageSize: <3110x3269>
PixelSize: (7.5e-05, 7.5e-05)
UserDetectorName: E-18-0102
$ lima mythensls --url bl04mythen info
CurrImageType 10
DefImageType 10
DetectorImageSize <7680x1>
DetectorModel Mythen-II
DetectorType MythenSLS
InstrumentName instrument
MaxImageSize <7680x1>
PixelSize (1.0, 1.0)
UserDetectorName MythenSLS
Detector type MYTHEN
Serial number 1719109785
Software version 1867412
Status IDLE
Dynamic range 32
Energy threshold 9071
Exposure time 1.0
Number of frames 0
Number of cycles 0
Number of gates 0
Master NO_MASTER
Synchronization NONE
Timing AUTO_TIMING
Delay after triger 0.0
Readout NORMAL_READOUT
Settings STANDARD
External signals ['GATE_OUT_ACTIVE_HIGH', 'TRIGGER_IN_RISING_EDGE', 'OFF',
'OFF']
相机采集
可以使用acquire
子命令进行采集。
常见的选项包括-nb-frames
、--exposure-time
、--latency-time
。您可以使用lima <camera> acquire --help
查看完整的选项列表。
以下是一个在Eiger相机上执行采集的示例
如何为您自己的相机编写插件
您有两种选择
1. 向Lima-toolbox添加插件扩展
将相机添加到本仓库的PR中。这始终是可能的,无论您为哪种相机编写插件。
假设您想为模拟器相机创建一个插件。
首先,在src/limatb/camera
中创建一个新的文件,命名为simulator.py
。Lima工具箱CLI使用click库来帮助创建强大的命令行界面。
要创建一个simulator
子命令,您可以使用Lima工具箱的camera
装饰器(一个click.group
辅助工具)并编写一个应该返回一个Lima.Interface
对象的函数
# src/limatb/camera/simulator.py
from limatb.cli import camera
from Lima.Simulator import Camera, Interface
@camera(name='simulator')
def simulator():
camera = Simulator.Camera()
interface = Interface(camera)
return interface
最后一件要做的事情是将新的命令注册到lima toolbox的setup.py中,如下所示
extras_require = {
"simulator": [] # add any extra python dependencies if necessary
}
setup(
...,
entry_points={
"lima.cli.camera": [
...
"Simulator = limatb.camera.simulator:simulator [simulator]"
]
}
)
这就完成了。下次您安装lima-toolbox时,应该会有一个带有默认的info
和acquire
子命令的simulator
相机可用,这些命令是“开箱即用”的。
恭喜!您现在可以准备好向本仓库提交包含您新相机的PR了。
继续阅读以了解如何实现相机选项、关于相机装饰器的详细信息以及如何实现您自己的相机特定子命令。
现有相机的示例可以在src/limatb/camera
目录中找到。
自定义选项
如果您需要向命令行添加任何选项以识别或配置您的相机,您可以使用click.option
来完成。以下是一个扩展前面的示例
import click
@camera(name='simulator')
@click.option(
'--fill-type',
click.Choice(['gauss', 'diffraction'],
case_sensitive=False),
default='gauss')
def simulator(fill_type):
camera = Simulator.Camera()
interface = Interface(camera)
fill_type = getattr(Lima.Simulator.FrameBuilder, fill_type.capitalize())
frame_getter = camera.getFrameGetter()
frame_getter.setFillType(fill_type)
return interface
camera
装饰器
@camera
装饰器辅助工具提供了一个增强的click.group
装饰器,默认情况下包含info
和acquire
子命令,并提供了将返回的接口插入到click上下文对象ctx.obj['interface']
中的便利性,您可以访问您决定实现的任何相机子命令。
以下是一个实现特定子命令的示例
@simulator.command("initialize")
def initialize(self):
# Initialization code here
...
扫描命令
Lima工具箱CLI实现了一个全局的scan
命令,其目的是发现系统中的所有相机。
要使您系统的特定scan
命令对全局扫描命令可见,您需要使用以下签名注册一个扫描函数
[async] def scan(timeout: float = None) -> beautifultable.BeautifulTable
并在setup.py中注册入口点
setup(
...,
entry_points={
"lima.cli.camera.scan": [
...
"Simulator = limatb.camera.simulator:scan [simulator]"
]
}
)
扫描功能可以取任何你想要的名称。如果你提供一个带有 async
关键字的协程,lima t
现在你可以在命令行输入 lima scan
,摄像头
2. 在外部项目中编写 Lima-toolbox 入口点
另一个选项,如果你的相机插件可以通过 setup.py
安装,可以应用上述相同的配方,唯一的区别在于在您的 Python 检测器包中实现代码,并修改您的 setup.py。
遵循这种理念的项目的例子是 SLS Mythen。
支持的相机
包含在 Lima-toolbox 中
已知的第三方相机
欢迎你添加自己的相机到这个列表。它们非常受欢迎!
项目详情
lima-toolbox-1.0.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 98d2a534f1721824f8942f17bfe177aabfeb5f7c16249225e719c9108b0b7c98 |
|
MD5 | 9c90b47e2d3f25a160fcbcf692286ad9 |
|
BLAKE2b-256 | 38afcbd0cdfa44d0b76f86fb86d71a13dfa064770697ad4a41fb0dddb2c89925 |