此类用于定义和处理给定场景中各种对象的辐射属性。 更多...
Public 成员函数 | |
| __init__ (self, any ue) | |
| 辐射类的构造函数。 | |
| sendUE4SetStencilValueByActorName (self, Actorname, StencilValue, is_name_regex=False, windowID=-1) | |
| 由Actor名向UE发送辐射设置模板值的命令 | |
| sendUE4SetStencilValueByMeshComponentName (self, Meshname, StencilValue, is_name_regex=False, windowID=-1) | |
| 由Actor的Mesh组件名向UE发送设置辐射模板值的命令 | |
| sendUE4SetStencilValueByCopterID (self, CopterID, StencilValue, windowID=-1) | |
| 由CopterID向UE发送设置辐射模板值的命令 | |
| radiance (self, absoluteTemperature, emissivity, dx=0.01, response=None) | |
| 物体辐射的计算 | |
| get_new_temp_emiss_from_radiance (self, tempEmissivity, response) | |
| 由辐射强度计算模板值 | |
Public 属性 | |
| ue = ue | |
| tempEmissivity | |
此类用于定义和处理给定场景中各种对象的辐射属性。
辐射类初始化时带有预定义的对象集,每个对象都有特定的温度(以开尔文为单位), 发射率(与理想黑体相比),以及一个标志表示名称是否引用角色Actor。
根据预设的二维列表,计算普朗克公式的积分,得到一个辐射值,并 归一到0~255范围内,发送给UE,然后UE将这个辐射值直接设置为 物体的模板值,然后由 CameraCapture 上写的材质规则去渲染纹理图片,然后用原来的图像传感器的接口返回到python。
| __init__ | ( | self, | |
| any | ue ) |
辐射类的构造函数。
| ue | 与辐射属性关联的Unreal Engine对象。 |
使用预定义的值(包括对象名称、温度、发射率和是否为角色Actor的标志)初始化tempEmissivity数组。
self.tempEmissivity = np.array(
[
["Floor", 276, 0.96, True],
["SK_Man_Arms", 309, 0.98, False],
["SK_Man_Head", 309, 0.98, False],
]
)
这里需要预先给定场景中1:所有物体的名字(或名字中的某一段)、2:温度(开尔文)、
3:发射率(与理想黑体)、4:是否是Actor的名字(如果是Actor的名字,那么它所有的Mesh的辐射值都会被设置,否则会设置一个Mesh)
每个地图都会不一样,所以需要预先给定。
摄氏度与开尔文的转换关系为:
K = C + 273.15
| get_new_temp_emiss_from_radiance | ( | self, | |
| tempEmissivity, | |||
| response ) |
由辐射强度计算模板值
| tempEmissivity | 包含物体温度和发射率的二维数组。数组的第一列是物体的ID,第二列是温度,第三列是发射率。 |
| response | 响应函数,用于调整辐射强度的计算。默认为None,即不调整。 |
这个值越大,物体越亮,反之越小越暗
详细实现
1. 获取物体的数量 numObjects。
2. 调用 radiance 函数计算每个物体的辐射强度:
- 提取 tempEmissivity 数组中的温度和发射率,并转换为浮点数。
- 使用提取的温度和发射率调用 radiance 函数,得到每个物体的辐射强度数组 L。
3. 对辐射强度数组 L 进行归一化处理,并将其缩放到0到255的范围内,转换为8位无符号整数类型。
4. 构建新的二维数组 tempEmissivityNew,包含物体的ID和归一化后的辐射强度ID值。
5. 返回新的二维数组 tempEmissivityNew。
| radiance | ( | self, | |
| absoluteTemperature, | |||
| emissivity, | |||
| dx = 0.01, | |||
| response = None ) |
物体辐射的计算
\begin{eqnarray*} L\left(T, \epsilon_{\text {avg }}, R_{\lambda}\right)=\epsilon_{\text {avg }} \int_{\lambda=8 \mu m}^{\lambda=14 \mu m} R_{\lambda}\left(\frac{2 h c^{2}}{\lambda^{5}} \frac{1}{\exp \left(\frac{h c}{k T \lambda}\right)-1}\right) d \lambda \end{eqnarray*}
| absoluteTemperature | 温度 |
| emissivity | 发射率 |
| dx | 用于积分的步长 |
| response | 响应函数(默认为None),实际是相机的接受率 |
用物体的温度和发射率(提前给定的),由普朗克公式的积分计算出物体的辐射强度。
普朗克函数可以计算一个黑体在某个温度下某个波长的光谱辐射度(W/m²/μm),然后光源发出的总功率密度(单位是W/m²)可以通过光谱辐照度在所有波长(或能量)上积分来计算
详细实现
1. 定义积分步长和边界
定义波长范围 wavelength 为8到14微米之间,以 dx 为步长。
2. 定义普朗克公式中的常数
定义常数 c1 和 c2:
- c1 = 1.19104e8,是一个与普朗克常数和光速相关的常数。
- c2 = 1.43879e4,是另一个与普朗克常数、光速和波尔兹曼常数相关的常数。
3. 定义相机接受率
根据是否提供了响应函数 response,计算辐射强度 radiance:
- 如果提供了 response,则计算时会考虑响应函数的影响。
- 否则默认response=1,直接根据普朗克公式和发射率计算辐射强度。
4. 计算积分
对辐射强度数组进行积分,计算总辐射强度:
- 如果 absoluteTemperature 是多维数组,则在每个维度上分别进行积分。
- 否则,对整个数组进行积分。
5. 返回总辐射强度。
| sendUE4SetStencilValueByActorName | ( | self, | |
| Actorname, | |||
| StencilValue, | |||
| is_name_regex = False, | |||
| windowID = -1 ) |
| sendUE4SetStencilValueByCopterID | ( | self, | |
| CopterID, | |||
| StencilValue, | |||
| windowID = -1 ) |
| sendUE4SetStencilValueByMeshComponentName | ( | self, | |
| Meshname, | |||
| StencilValue, | |||
| is_name_regex = False, | |||
| windowID = -1 ) |
| tempEmissivity |