DCPA (最近会遇距离)和TCPA (最近会遇时间)是船舶避碰的关键判断指标
DCPA (最近会遇距离)
1.DCPA和TCPA的计算核心代码
class DCPATCPACalculator:
def __init__(self):
self.safe_dcpa = 1.0 # 安全DCPA阈值(海里)
self.safe_tcpa = 15 # 安全TCPA阈值(分钟)
def calculate(self, own_ship, target_ship):
"""计算DCPA和TCPA
own_ship: 本船信息(位置、航向、速度)
target_ship: 目标船信息(位置、航向、速度)
"""
# 相对运动计算
relative_speed_x = target_ship.speed * math.sin(target_ship.course) - \
own_ship.speed * math.sin(own_ship.course)
relative_speed_y = target_ship.speed * math.cos(target_ship.course) - \
own_ship.speed * math.cos(own_ship.course)
# 相对距离
dx = target_ship.x - own_ship.x
dy = target_ship.y - own_ship.y
# 相对速度
relative_speed = math.sqrt(relative_speed_x**2 + relative_speed_y**2)
if relative_speed < 0.000001: # 防止除零
return float('inf'), float('inf')
# 计算TCPA
tcpa = -(dx * relative_speed_x + dy * relative_speed_y) / \
(relative_speed_x**2 + relative_speed_y**2)
# 计算DCPA
dcpa = math.sqrt((dx + relative_speed_x * tcpa)**2 + \
(dy + relative_speed_y * tcpa)**2)
return dcpa, tcpa
2.风险等级判断
class CollisionRiskAssessment:
def __init__(self):
# 风险等级阈值设置(基于实际航海经验)
self.risk_levels = {
'DCPA': {
'danger': 0.5, # 0.5海里以内为危险
'warning': 1.0, # 1海里以内为警告
'attention': 2.0 # 2海里以内需注意
},
'TCPA': {
'immediate': 5, # 5分钟以内为紧急
'short': 10, # 10分钟以内为短期
'medium': 20 # 20分钟以内为中期
}
}
def assess_risk(self, dcpa, tcpa):
"""评估碰撞风险等级"""
if tcpa < 0: # 两船远离
return 'safe'
risk_level = 'safe'
# DCPA风险评估
if dcpa <= self.risk_levels['DCPA']['danger']:
if tcpa <= self.risk_levels['TCPA']['immediate']:
risk_level = 'extreme_danger'
elif tcpa <= self.risk_levels['TCPA']['short']:
risk_level = 'high_danger'
else:
risk_level = 'moderate_danger'
elif dcpa <= self.risk_levels['DCPA']['warning']:
if tcpa <= self.risk_levels['TCPA']['short']:
risk_level = 'warning'
else:
risk_level = 'attention'
return risk_level
3.避碰行动建议
class CollisionAvoidanceAdvice:
def __init__(self):
self.colregs = COLREGSRules() # 国际海上避碰规则
def get_avoidance_action(self, own_ship, target_ship, risk_level):
"""生成避碰行动建议"""
if risk_level == 'safe':
return None
# 判断会遇类型
encounter_type = self.colregs.determine_encounter_type(
own_ship, target_ship
)
# 基于COLREGS规则生成避碰建议
if encounter_type == 'head_on':
return {
'action': 'turn_starboard',
'rudder_angle': 15,
'new_course': own_ship.course - 15
}
elif encounter_type == 'crossing':
if self.colregs.is_give_way_vessel(own_ship, target_ship):
return {
'action': 'turn_starboard',
'rudder_angle': 20,
'new_course': own_ship.course - 20
}
elif encounter_type == 'overtaking':
return {
'action': 'maintain_course_and_speed',
'rudder_angle': 0,
'new_course': own_ship.course
}
关键判断要点:
DCPA判断标准:
危险:≤ 0.5海里
警告:≤ 1.0海里
注意:≤ 2.0海里
TCPA判断标准:
紧急:≤ 5分钟
短期:≤ 10分钟
中期:≤ 20分钟
风险等级综合考虑因素:
DCPA和TCPA数值
会遇类型(对遇、交叉、追越)
船舶类型和大小
航行区域特点
气象海况条件
特殊情况:
TCPA为负值表示两船相对远离
相对速度接近零时的处理
多船会遇时的综合判断
受限水域的特殊考虑