如何计算每一帧中行人与车辆的距离?

How to calculate the distance between pedestrians and vehicles in each frame?

我有来自无人机的数据。第一个 table 是每帧行人的数据。行人数据有行人Id, frame, x_est, y_est, v_abs。 第二个 table 是车辆的数据。车辆的数据有车辆 ID、车架、x_est、y_est、vel_est。 例如,在第 1 帧中,我有 39 个行人和两辆车。我想创建一个包含以下信息的新 table:

  1. 第一列是每一帧中每个行人和每辆车之间的距离。 比如我有39个行人和2个车:

    d1 = sqrt((ped1_x - veh1_x)^2 + (ped1_y - veh1_y)^2)

    d2 = sqrt((ped1_x - veh2_x)^2 + (ped1_y - veh2_y)^2)

    d3 = sqrt((ped2_x - veh1_x)^2 + (ped2_y - veh1_y)^2)

    d4 = sqrt((ped2_x - veh2_x)^2 + (ped2_y - veh2_y)^2)

等等

  1. 第二列和第三列是行人和车辆的关联速度。 例如,如果我得到 d1,那么我必须包括 ped1 的速度和 veh1 的速度。 如果我得到 d2,那么我必须包括 ped1 的速度和 veh2 的速度等等。

我有116帧。我想在 python 或 Matlab 中编写代码来完成这些任务。我尝试 python 使用以下代码但没有成功,因为车辆数据有 182 行,行人数据有 3950 行:

if peds["frame"] == vehs["frame"]:
    distance = math.sqrt(((peds.x_est-vehs.x_est)**2)+((peds.y_est - vehs.y_est))**2)

我正在考虑添加一个 for 循环来遍历每一帧。 如何修改代码以循环遍历每一帧并计算这些对象之间的距离?

这是数据的一个例子。

行人数据: id 0 1个 2个 3个 4个 5个 6个 7 8个 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1个 1

x_est 15.31251243 14.62957291 14.81940554 16.261254 14.25065235 13.71913744 12.77037156 11.82149333 11.02452266 10.4550769 9.962500442 10.56845947 11.17672903 11.70758495 14.28816743 13.41605196 11.6316746 11.4797624 13.3395301 10.98651306 11.89763531 12.46714593 13.90898049 11.17611058 9.20275126 11.10086732 11.66968305 12.88437259 13.37708455 14.17485782 14.81943565 15.65388549 17.7046208 18.76703333 19.22188971 19.03219028 19.63930168 19.26095788 20.54963754 21.87812196

y_est 24.04146967 23.85122822 22.59973819 21.46111998 22.25845431 22.52372129 22.37086056 22.82695733 22.7892778 22.78941678 21.42243054 21.49884121 21.46045752 21.53683577 19.86642817 19.75351002 19.29791125 17.24875682 16.56578255 14.97104209 10.11358571 9.733765266 9.165258769 8.102246321 8.216836276 6.659910277 6.774266283 2.865368769 3.05553263 4.459266668 4.193704362 4.420605884 4.26981189 3.547987191 4.042100815 4.876447865 5.294238544 6.090777216 3.966160063 4.762697865

v_abs 2.459007157 2.654334571 3.315403455 3.389573803 3.378566929 3.045539512 3.23011785 2.925099475 2.584998721 2.901642056 2.811892448 2.151019342 1.96347414 1.500567927 3.540985451 2.709992115 3.267972565 3.395063149 2.721779676 4.012212099 0.880854234 0.813933137 0.704372621 0.912089788 0.549592663 3.007799428 1.978963898 3.44757396 3.15737162 3.529382782 3.5556166 3.409764593 1.170765247 1.580709745 1.085228781 0.922279132 0.802698916 1.875894301 0.804975425 1.205954878

车辆数据:

id 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901

1个 1个 2个 2个 3个 3个 4个 4个 5个 5个 6个 6个 7 7 8个 8个 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20

x_est 13.12181538 20.79676544 13.01830532 20.73447182 12.92056089 20.65301595 12.77984823 20.52422202 12.67147093 20.45207468 12.56504216 20.34050999 12.45704283 20.23392863 12.35122477 20.13000728 12.24825411 20.03070371 12.15111691 19.9359101 12.04685347 19.8497257 11.93870377 19.7593045 11.82507185 19.66695714 11.70785362 19.57813133 11.60090539 19.48509113 11.48174963 19.39305883 11.36790853 19.29876475 11.26066404 19.21938896 11.14538066 19.12658484 11.02149472 19.02832259

y_est 12.48631346 12.04945225 12.50757522 12.09243053 12.53150136 12.14119099 12.56295128 12.20178773 12.59034906 12.22451609 12.60945482 12.2800529 12.61885415 12.31947563 12.62842376 12.35799492 12.64016339 12.40403046 12.66696466 12.44343686 12.67398026 12.4828893 12.69217314 12.52761456 12.70404418 12.56747969 12.71201387 12.60893079 12.7352435 12.65130145 12.75948092 12.68935761 12.77039761 12.72362537 12.78182668 12.76864139 12.80477996 12.80719663 12.82141401 12.8529026

vel_est 2.607251494 2.480379041 2.607160714 2.479543211 2.60660445 2.478939563 2.60984436 2.482517229 2.610124888 2.479412431 2.610034708 2.481993315 2.609925021 2.483303075 2.609504867 2.484305008 2.608686875 2.485197239 2.607293512 2.485028991 2.606477634 2.483509058 2.60665034 2.483007857 2.607657856 2.482442343 2.609280114 2.481348408 2.609374438 2.481088229 2.612094232 2.480242567 2.613246915 2.479486909 2.612946522 2.476581726 2.614972124 2.475903808 2.618889831 2.47716006

提前致谢

用文字思考问题。对于每个行人条目,对于每个汽车条目,如果帧号匹配,则计算它们之间的距离,并添加一个新行。没什么。

ped_id =  "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39"

ped_frame = "1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"

ped_x_est = "15.31251243 14.62957291 14.81940554 16.261254 14.25065235 13.71913744 12.77037156 11.82149333 11.02452266 10.4550769 9.962500442 10.56845947 11.17672903 11.70758495 14.28816743 13.41605196 11.6316746 11.4797624 13.3395301 10.98651306 11.89763531 12.46714593 13.90898049 11.17611058 9.20275126 11.10086732 11.66968305 12.88437259 13.37708455 14.17485782 14.81943565 15.65388549 17.7046208 18.76703333 19.22188971 19.03219028 19.63930168 19.26095788 20.54963754 21.87812196"

ped_y_est = "24.04146967 23.85122822 22.59973819 21.46111998 22.25845431 22.52372129 22.37086056 22.82695733 22.7892778 22.78941678 21.42243054 21.49884121 21.46045752 21.53683577 19.86642817 19.75351002 19.29791125 17.24875682 16.56578255 14.97104209 10.11358571 9.733765266 9.165258769 8.102246321 8.216836276 6.659910277 6.774266283 2.865368769 3.05553263 4.459266668 4.193704362 4.420605884 4.26981189 3.547987191 4.042100815 4.876447865 5.294238544 6.090777216 3.966160063 4.762697865"

ped_v_abs = "2.459007157 2.654334571 3.315403455 3.389573803 3.378566929 3.045539512 3.23011785 2.925099475 2.584998721 2.901642056 2.811892448 2.151019342 1.96347414 1.500567927 3.540985451 2.709992115 3.267972565 3.395063149 2.721779676 4.012212099 0.880854234 0.813933137 0.704372621 0.912089788 0.549592663 3.007799428 1.978963898 3.44757396 3.15737162 3.529382782 3.5556166 3.409764593 1.170765247 1.580709745 1.085228781 0.922279132 0.802698916 1.875894301 0.804975425 1.205954878"

veh_id = "900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901 900 901"

veh_frame = "1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20"

veh_x_est = "13.12181538 20.79676544 13.01830532 20.73447182 12.92056089 20.65301595 12.77984823 20.52422202 12.67147093 20.45207468 12.56504216 20.34050999 12.45704283 20.23392863 12.35122477 20.13000728 12.24825411 20.03070371 12.15111691 19.9359101 12.04685347 19.8497257 11.93870377 19.7593045 11.82507185 19.66695714 11.70785362 19.57813133 11.60090539 19.48509113 11.48174963 19.39305883 11.36790853 19.29876475 11.26066404 19.21938896 11.14538066 19.12658484 11.02149472 19.02832259"

veh_y_est = "12.48631346 12.04945225 12.50757522 12.09243053 12.53150136 12.14119099 12.56295128 12.20178773 12.59034906 12.22451609 12.60945482 12.2800529 12.61885415 12.31947563 12.62842376 12.35799492 12.64016339 12.40403046 12.66696466 12.44343686 12.67398026 12.4828893 12.69217314 12.52761456 12.70404418 12.56747969 12.71201387 12.60893079 12.7352435 12.65130145 12.75948092 12.68935761 12.77039761 12.72362537 12.78182668 12.76864139 12.80477996 12.80719663 12.82141401 12.8529026"

veh_vel_est = "2.607251494 2.480379041 2.607160714 2.479543211 2.60660445 2.478939563 2.60984436 2.482517229 2.610124888 2.479412431 2.610034708 2.481993315 2.609925021 2.483303075 2.609504867 2.484305008 2.608686875 2.485197239 2.607293512 2.485028991 2.606477634 2.483509058 2.60665034 2.483007857 2.607657856 2.482442343 2.609280114 2.481348408 2.609374438 2.481088229 2.612094232 2.480242567 2.613246915 2.479486909 2.612946522 2.476581726 2.614972124 2.475903808 2.618889831 2.47716006"

import math
import pandas as pd

def convert(s,cvt):
    return [cvt(k) for k in s.split()]

peds = list(zip( 
    convert(ped_id,int),
    convert(ped_frame,int),
    convert(ped_x_est,float),
    convert(ped_y_est,float),
    convert(ped_v_abs,float)
))

cars = list(zip( 
    convert(veh_id,int),
    convert(veh_frame,int),
    convert(veh_x_est,float),
    convert(veh_y_est,float),
    convert(veh_vel_est,float)
))

newdata = []
for ped in peds:
    for car in cars:
        if ped[1] != car[1]:
            continue
        dist = math.sqrt((ped[2]-car[2])**2 + (ped[3]-car[3])**2)
        newdata.append( (ped[0], car[0], dist, ped[4], car[4]) )

df = pd.DataFrame( newdata, columns=("ped id", "car id", "distance", "ped vel", "car vel"))
print(df)

输出:

    ped id  car id   distance   ped vel   car vel
0        0     900  11.760986  2.459007  2.607251
1        0     901  13.186566  2.459007  2.480379
2        1     900  11.464494  2.654335  2.607251
3        1     901  13.316012  2.654335  2.480379
4        2     900  10.254910  3.315403  2.607251
..     ...     ...        ...       ...       ...
75      37     901   6.153415  1.875894  2.480379
76      38     900  11.303343  0.804975  2.607251
77      38     901   8.087069  0.804975  2.480379
78      39     900  11.675921  1.205955  2.607251
79      39     901   7.366554  1.205955  2.480379

[80 rows x 5 columns]