3D目标检测基础知识
位置
即xyz坐标
大小
lwh长宽高,即3D 框的尺寸 (x_size, y_size, z_size),按惯例定义为物体 3D 框在航向角 yaw 角度为 0 时沿着 x, y, z 轴三个方向的长度
姿态
三种表达方式:欧拉角、旋转矩阵、四元数
用角度变换关系(rotation)可以表示在参考坐标系下物体的姿态,除了角度变化之外,还有一种是参考系原点的相对位置关系,一般用平移矩阵(translation)来表示
关于四元数、旋转矩阵、平移矩阵、复合变换矩阵的定义及关系,convert_nuScenes.py 文件代码详解中的三、main 函数部分有详细介绍,便于连贯阅读,下面直接引用了上述内容
已知空间中的一个点
P
0
(
x
0
,
y
0
,
z
0
)
P_{0}(x_{0}, y_{0}, z_{0})
P0(x0,y0,z0), 然后将
P
0
P_{0}
P0沿着X轴、Y轴、Z轴平移
t
x
、
t
y
、
t
z
t_{x}、t_{y}、t_{z}
tx、ty、tz的距离,得到点
P
1
(
x
1
,
y
1
,
z
1
)
P_{1}(x_{1}, y_{1}, z_{1})
P1(x1,y1,z1),那么此过程可以用平移矩阵表示为
P
1
=
T
r
a
n
s
l
a
t
i
o
n
M
a
t
r
i
x
⋅
P
0
P1 = TranslationMatrix \cdot P0
P1=TranslationMatrix⋅P0, 即
P
0
P_{0}
P0左乘一个平移矩阵得到
P
1
P_{1}
P1
[
x
1
y
1
z
1
1
]
=
[
x
0
+
t
x
y
0
+
t
y
z
0
+
t
z
1
]
=
[
1
0
0
t
x
0
1
0
t
y
0
0
1
t
z
0
0
0
1
]
[
x
0
y
0
z
0
1
]
\left[\begin{array}{c} \mathrm{x}_{1} \\ \mathrm{y}_{1} \\ \mathrm{z}_{1} \\ 1 \end{array}\right]=\left[\begin{array}{c} \mathrm{x}_{0}+\mathrm{t}_{\mathrm{x}} \\ \mathrm{y}_{0}+\mathrm{t}_{\mathrm{y}} \\ \mathrm{z}_{0}+\mathrm{t}_{\mathrm{z}} \\ 1 \end{array}\right]=\left[\begin{array}{cccc} 1 & 0 & 0 & \mathrm{t}_{\mathrm{x}} \\ 0 & 1 & 0 & \mathrm{t}_{\mathrm{y}} \\ 0 & 0 & 1 & \mathrm{t}_{\mathrm{z}} \\ 0 & 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} \mathrm{x}_{0} \\ \mathrm{y}_{0} \\ \mathrm{z}_{0} \\ 1 \end{array}\right]
x1y1z11
=
x0+txy0+tyz0+tz1
=
100001000010txtytz1
x0y0z01
其中平移矩阵定义为
T
r
a
n
s
l
a
t
i
o
n
M
a
t
r
i
x
=
[
1
0
0
t
x
0
1
0
t
y
0
0
1
t
z
0
0
0
1
]
TranslationMatrix = \left[\begin{array}{cccc} 1 & 0 & 0 & \mathrm{t}_{\mathrm{x}} \\ 0 & 1 & 0 & \mathrm{t}_{\mathrm{y}} \\ 0 & 0 & 1 & \mathrm{t}_{\mathrm{z}} \\ 0 & 0 & 0 & 1 \end{array}\right]
TranslationMatrix=
100001000010txtytz1
四元素、旋转矩阵都是用来描述刚体的姿态信息,只不过表达形式不同,它们之间可以通过数学公式进行换算,而这里就需要把四元素转换成旋转矩阵,因为后面需要使用旋转矩阵进行相应的计算
已知四元数
Q
u
a
t
e
r
n
i
o
n
=
(
w
,
x
,
y
,
z
)
Quaternion = (w, x, y, z)
Quaternion=(w,x,y,z)
则可以转换为如下旋转矩阵
R
o
t
a
t
i
o
n
M
a
t
r
i
x
=
[
w
2
+
x
2
−
y
2
−
z
2
2
(
x
y
−
w
z
)
2
(
x
z
+
w
y
)
2
(
x
y
+
w
z
)
w
2
−
x
2
+
y
2
−
z
2
2
(
y
z
−
w
x
)
2
(
x
z
−
w
y
)
2
(
y
z
+
w
x
)
w
2
−
x
2
−
y
2
+
z
2
]
RotationMatrix = \left[\begin{array}{ccc} w^{2}+x^{2}-y^{2}-z^{2} & 2(x y-w z) & 2(x z+w y) \\ 2(x y+w z) & w^{2}-x^{2}+y^{2}-z^{2} & 2(y z-w x) \\ 2(x z-w y) & 2(y z+w x) & w^{2}-x^{2}-y^{2}+z^{2} \end{array}\right]
RotationMatrix=
w2+x2−y2−z22(xy+wz)2(xz−wy)2(xy−wz)w2−x2+y2−z22(yz+wx)2(xz+wy)2(yz−wx)w2−x2−y2+z2
已知空间中的一个点
P
0
(
x
0
,
y
0
,
z
0
)
P_{0}(x_{0}, y_{0}, z_{0})
P0(x0,y0,z0),然后将
P
0
P_{0}
P0绕着X轴、Y轴、Z轴旋转不同的角度时(假设旋转关系用上述四元组表示),得到点
P
1
(
x
1
,
y
1
,
z
1
)
P_{1}(x_{1}, y_{1}, z_{1})
P1(x1,y1,z1), 那么此过程可以用转化成用旋转矩阵表示为
P
1
=
[
R
o
t
a
t
i
o
n
M
a
t
r
i
x
0
0
1
]
⋅
P
0
P1 = \left[\begin{array}{cc} RotationMatrix & 0 \\ 0 & 1 \end{array}\right] \cdot P0
P1=[RotationMatrix001]⋅P0,即
P
0
P_{0}
P0左乘一个旋转矩阵得到
P
1
P_{1}
P1,即
P
1
=
[
x
1
y
1
z
1
1
]
=
[
w
2
+
x
2
−
y
2
−
z
2
2
(
x
y
−
w
z
)
2
(
x
z
+
w
y
)
0
2
(
x
y
+
w
z
)
w
2
−
x
2
+
y
2
−
z
2
2
(
y
z
−
w
x
)
0
2
(
x
z
−
w
y
)
2
(
y
z
+
w
x
)
w
2
−
x
2
−
y
2
+
z
2
0
0
0
0
1
]
[
x
0
y
0
z
0
1
]
P1 = \left[\begin{array}{c} \mathrm{x}_{1} \\ \mathrm{y}_{1} \\ \mathrm{z}_{1} \\ 1 \end{array}\right]=\left[\begin{array}{cccc} \mathrm{w}^{2}+\mathrm{x}^{2}-\mathrm{y}^{2}-\mathrm{z}^{2} & 2(\mathrm{xy}-\mathrm{wz}) & 2(\mathrm{xz}+\mathrm{wy}) & 0 \\ 2(\mathrm{xy}+\mathrm{wz}) & \mathrm{w}^{2}-\mathrm{x}^{2}+\mathrm{y}^{2}-\mathrm{z}^{2} & 2(\mathrm{yz}-\mathrm{wx}) & 0 \\ 2(\mathrm{xz}-\mathrm{wy}) & 2(\mathrm{yz}+\mathrm{wx}) & \mathrm{w}^{2}-\mathrm{x}^{2}-\mathrm{y}^{2}+\mathrm{z}^{2} & 0 \\ 0 & 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} \mathrm{x}_{0} \\ \mathrm{y}_{0} \\ \mathrm{z}_{0} \\ 1 \end{array}\right]
P1=
x1y1z11
=
w2+x2−y2−z22(xy+wz)2(xz−wy)02(xy−wz)w2−x2+y2−z22(yz+wx)02(xz+wy)2(yz−wx)w2−x2−y2+z200001
x0y0z01
已知空间中的一个点
P
0
(
x
0
,
y
0
,
z
0
)
P_{0}(x_{0}, y_{0}, z_{0})
P0(x0,y0,z0),然后将
P
0
P_{0}
P0绕着X轴、Y轴、Z轴旋转不同的角度时(假设旋转关系用上述四元组表示),得到点
P
1
(
x
1
,
y
1
,
z
1
)
P_{1}(x_{1}, y_{1}, z_{1})
P1(x1,y1,z1),再将点
P
1
P_{1}
P1分别沿着X轴、Y轴、Z轴平移
t
x
、
t
y
、
t
z
t_{x}、t_{y}、t_{z}
tx、ty、tz的距离,得到点
P
2
(
x
2
,
y
2
,
z
2
)
P_{2}(x_{2}, y_{2}, z_{2})
P2(x2,y2,z2),则变换过程为
P
2
=
[
x
2
y
2
z
2
1
]
=
[
1
0
0
t
x
0
1
0
t
y
0
0
1
t
z
0
0
0
1
]
[
w
2
+
x
2
−
y
2
−
z
2
2
(
x
y
−
w
z
)
2
(
x
z
+
w
y
)
0
2
(
x
y
+
w
z
)
w
2
−
x
2
+
y
2
−
z
2
2
(
y
z
−
w
x
)
0
2
(
x
z
−
w
y
)
2
(
y
z
+
w
x
)
w
2
−
x
2
−
y
2
+
z
2
0
0
0
0
1
]
[
x
0
y
0
z
0
1
]
P2 = \left[\begin{array}{c} \mathrm{x}_{2} \\ \mathrm{y}_{2} \\ \mathrm{z}_{2} \\ 1 \end{array}\right]=\left[\begin{array}{cccc} 1 & 0 & 0 & \mathrm{t}_{\mathrm{x}} \\ 0 & 1 & 0 & \mathrm{t}_{\mathrm{y}} \\ 0 & 0 & 1 & \mathrm{t}_{\mathrm{z}} \\ 0 & 0 & 0 & 1 \end{array}\right]\left[\begin{array}{cccc} \mathrm{w}^{2}+\mathrm{x}^{2}-\mathrm{y}^{2}-\mathrm{z}^{2} & 2(\mathrm{xy}-\mathrm{wz}) & 2(\mathrm{xz}+\mathrm{wy}) & 0 \\ 2(\mathrm{xy}+\mathrm{wz}) & \mathrm{w}^{2}-\mathrm{x}^{2}+\mathrm{y}^{2}-\mathrm{z}^{2} & 2(\mathrm{yz}-\mathrm{wx}) & 0 \\ 2(\mathrm{xz}-\mathrm{wy}) & 2(\mathrm{yz}+\mathrm{wx}) & \mathrm{w}^{2}-\mathrm{x}^{2}-\mathrm{y}^{2}+\mathrm{z}^{2} & 0 \\ 0 & 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} \mathrm{x}_{0} \\ \mathrm{y}_{0} \\ \mathrm{z}_{0} \\ 1 \end{array}\right]
P2=
x2y2z21
=
100001000010txtytz1
w2+x2−y2−z22(xy+wz)2(xz−wy)02(xy−wz)w2−x2+y2−z22(yz+wx)02(xz+wy)2(yz−wx)w2−x2−y2+z200001
x0y0z01
即
P
0
P_{0}
P0左乘一个旋转矩阵,再左乘一个平移矩阵,从而得到
P
2
P_{2}
P2,这个过程可以用复合变换矩阵表示为
T
r
a
n
s
f
o
r
m
M
a
t
r
i
x
=
T
r
a
n
s
l
a
t
i
o
n
M
a
t
r
i
x
⋅
R
o
t
a
t
i
o
n
M
a
t
r
i
x
=
[
w
2
+
x
2
−
y
2
−
z
2
2
(
x
y
−
w
z
)
2
(
x
z
+
w
y
)
t
x
2
(
x
y
+
w
z
)
w
2
−
x
2
+
y
2
−
z
2
2
(
y
z
−
w
x
)
t
y
2
(
x
z
−
w
y
)
2
(
y
z
+
w
x
)
w
2
−
x
2
−
y
2
+
z
2
t
z
0
0
0
1
]
TransformMatrix = TranslationMatrix \cdot RotationMatrix = \left[\begin{array}{cccc} \mathrm{w}^{2}+\mathrm{x}^{2}-\mathrm{y}^{2}-\mathrm{z}^{2} & 2(\mathrm{xy}-\mathrm{wz}) & 2(\mathrm{xz}+\mathrm{wy}) & \mathrm{t}_{\mathrm{x}} \\ 2(\mathrm{xy}+\mathrm{wz}) & \mathrm{w}^{2}-\mathrm{x}^{2}+\mathrm{y}^{2}-\mathrm{z}^{2} & 2(\mathrm{yz}-\mathrm{wx}) & \mathrm{t}_{\mathrm{y}} \\ 2(\mathrm{xz}-\mathrm{wy}) & 2(\mathrm{yz}+\mathrm{wx}) & \mathrm{w}^{2}-\mathrm{x}^{2}-\mathrm{y}^{2}+\mathrm{z}^{2} & \mathrm{t}_{\mathrm{z}} \\ 0 & 0 & 0 & 1 \end{array}\right]
TransformMatrix=TranslationMatrix⋅RotationMatrix=
w2+x2−y2−z22(xy+wz)2(xz−wy)02(xy−wz)w2−x2+y2−z22(yz+wx)02(xz+wy)2(yz−wx)w2−x2−y2+z20txtytz1
即先旋转,再平移
在自动驾驶的感知系统中,除了自车坐标系外,3D目标检测还涉及相机、激光雷达等传感器,每个传感器都有自己的坐标系。如下图
lidar坐标系
x轴向前,y轴向左,z轴向上。重力轴为z轴,参考方向为x轴正方向,航向角rz是lidar坐标系下目标的前进方向和x轴的夹角
camera坐标系
z轴向前,y轴向下,x轴向右。重力轴为y轴,参考方向为x轴正方向, 航向角ry是相机坐标下目标的前进方向和x轴的夹角
如下图,蓝色为ego vehicle,绿色为目标物体,相机坐标系的z轴向前.
方位角theta,定义为自车与目标物体连线偏离自车前进方向的角度
航向角rotation_y,即目标方向和相机X轴正方向的夹角(顺时针方向为正),描述的是目标在现实世界中的朝向。如图 ∠ B O C \angle BOC ∠BOC所示。rotaiton_y的取值范围 [ − π , π ] [-\pi, \pi] [−π,π],不随目标位置的变化而变化,
观测角alpha, 描述的是目标相对于相机视角的朝向,定义为以相机原点为中心,相机原点到物体中心的连线为半径,将目标旋绕重力轴旋转到目标前进方向与ego vechicle一样时所需的角度,如图 ∠ B O D \angle BOD ∠BOD所示。观测角alpha取值范围为 [ − π , π ] [-\pi, \pi] [−π,π],随目标位置变化而变化
Rotation_y和Alpha之间可以相互转换。因为
∠
A
O
C
=
9
0
∘
−
theta
\angle \mathrm{AOC}=90^{\circ}-\text { theta }
∠AOC=90∘− theta ,所以有
∠
A
O
B
=
∠
A
O
C
−
∠
B
O
C
=
9
0
∘
−
theta
−
rotaion_y
\angle \mathrm{AOB}=\angle \mathrm{AOC}-\angle \mathrm{BOC}=90^{\circ}-\text { theta }-\text { rotaion\_y }
∠AOB=∠AOC−∠BOC=90∘− theta − rotaion_y
又因为
∠
A
O
B
+
∠
B
O
D
=
9
0
∘
\angle \mathrm{AOB} + \angle \mathrm{BOD} = 90^{\circ}
∠AOB+∠BOD=90∘, 可得
alpha
=
∠
B
O
D
=
9
0
∘
−
∠
A
O
B
=
theta
+
rotation_y
\text { alpha }=\angle \mathrm{BOD}=90^{\circ}-\angle \mathrm{AOB}=\text { theta }+\text { rotation\_y }
alpha =∠BOD=90∘−∠AOB= theta + rotation_y
考虑到rotation_y和alpha都是逆时针方向为负,所以有
−
alpha
=
theta
−
rotation_y
-\text { alpha }=\text { theta }-\text { rotation\_y }
− alpha = theta − rotation_y
即
alpha
=
rotation_y
−
theta
\text { alpha }=\text { rotation\_y } - \text { theta }
alpha = rotation_y − theta
NuScenes数据中存在lidar点云和radar点云,其中lidar为稠密点云,具有三维坐标;而radar为稀疏点云,一般的FMCW毫米波雷达不存在高度信息(4D radar可以探测高度)。lidar点云数据的研究相对较多,这里不做过多介绍。
radar点云格式
radar的点云数据格式如下图所示,每一行为一个点,包含了点的坐标、速度、强度等信息。点云数据一般通过.pcd文件保存,包头等信息为明文,具体的点云数据为二进制数据
可视化效果
从不同的角度观察同一个pcd文件, 普通的毫米波雷达无法测量高度信息,因此右图中Z轴取值一样
验证高度数据
取值均为0
Nuscenes数据集分为全局坐标系、车身坐标系、camera坐标系、pixel坐标系、radar坐标系、lidar坐标系。除了全局坐标系,均为相对坐标系,标注真值基于全局坐标系。
算法拟合的数据大多是基于出传感器坐标系,标注的真值需要从全局坐标系转换到各自的传感器坐标系,所有转换必须先通过传感器外参转到车身坐标系,再转换到传感器坐标系
如下,将全局坐标系下的标注box转化到传感器坐标系
# Move box to ego vehicle coord system.
box.translate(-np.array(pose_record['translation']))
box.rotate(Quaternion(pose_record['rotation']).inverse)
# Move box to sensor coord system.
box.translate(-np.array(cs_record['translation']))
box.rotate(Quaternion(cs_record['rotation']).inverse)
通过两个坐标系下的坐标转换矩阵(平移矩阵+旋转矩阵)来转换,相机需要额外通过内参转换到pixel坐标系
def transform_matrix(translation: np.ndarray = np.array([0, 0, 0]),
rotation: Quaternion = Quaternion([1, 0, 0, 0]),
inverse: bool = False) -> np.ndarray:
"""
Convert pose to transformation matrix.
:param translation: <np.float32: 3>. Translation in x, y, z.
:param rotation: Rotation in quaternions (w ri rj rk).
:param inverse: Whether to compute inverse transform matrix.
:return: <np.float32: 4, 4>. Transformation matrix.
"""
tm = np.eye(4)
if inverse:
rot_inv = rotation.rotation_matrix.T
trans = np.transpose(-np.array(translation))
tm[:3, :3] = rot_inv
tm[:3, 3] = rot_inv.dot(trans)
else:
# rotation.rotation_matrix 表示将四元素 rotation 转换为旋转矩阵
# 并将旋转矩阵赋值给对角矩阵 tm 的前三行前三列
tm[:3, :3] = rotation.rotation_matrix
# 将矩阵 tm 的前三行第四列赋值为 translation
tm[:3, 3] = np.transpose(np.array(translation))
# 最后返回一个 4×4 的复合变换矩阵
return tm
以上返回的变换矩阵为复合变换矩阵, 包含位置(
translation)和旋转信息(rotation)两部分, 关于四元数、旋转矩阵、平移矩阵、复合变换矩阵的定义及关系,convert_nuScenes.py 文件代码详解中的三、main 函数部分有详细介绍
不同传感器采集频率不同,不是同步触发,一个传感器的数据需要投影到全局坐标系下,经过全局坐标系再投影到另一个传感器下达到时间对齐。借助于全局坐标系(绝对坐标系)进行运动补偿,从而完成了不同传感器之间的时间对齐。
最后的通过矩阵乘法将点云投影到当前帧的坐标系下,从而完成时间对齐
# Fuse four transformation matrices into one and perform transform.
trans_matrix = reduce(np.dot, [ref_from_car, car_from_global, global_from_car, car_from_current])
velocity_trans_matrix = reduce(np.dot, [ref_from_car_rot, car_from_global_rot, global_from_car_rot, car_from_current_rot])
current_pc.transform(trans_matrix)
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题
我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe