Skip to content

Commit 501eec9

Browse files
authored
Merge pull request #1 from appergb/develop
重大更新
2 parents a063c36 + 86293eb commit 501eec9

35 files changed

Lines changed: 9501 additions & 357 deletions

.github/workflows/ci.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ jobs:
5959
- name: Install linting tools
6060
run: |
6161
python -m pip install --upgrade pip
62-
pip install ruff black isort
62+
pip install ruff black isort mypy
6363
6464
- name: Check code formatting with Black
6565
run: black --check src/aylm tests
@@ -69,3 +69,6 @@ jobs:
6969

7070
- name: Lint with Ruff
7171
run: ruff check src/aylm tests
72+
73+
- name: Type check with mypy (informational)
74+
run: mypy src/aylm --ignore-missing-imports || echo "mypy found issues (non-blocking)"

.output.txt

Lines changed: 4488 additions & 0 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 608 additions & 188 deletions
Large diffs are not rendered by default.

configs/constitution_example.yaml

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# A-YLM 宪法配置示例
2+
# 用户可以根据自己的需求修改此配置
3+
4+
# 宪法原则列表
5+
principles:
6+
# 碰撞检测 - 最高优先级
7+
- name: no_collision
8+
severity: critical
9+
enabled: true
10+
params:
11+
check_trajectory: true
12+
prediction_horizon: 2.0 # 预测时间范围(秒)
13+
14+
# TTC 安全 - 高优先级
15+
- name: ttc_safety
16+
severity: high
17+
enabled: true
18+
params:
19+
warning_threshold: 3.0 # 警告阈值(秒)
20+
critical_threshold: 1.5 # 关键阈值(秒)
21+
22+
# 安全跟车距离
23+
- name: safe_following
24+
severity: high
25+
enabled: true
26+
params:
27+
time_gap: 2.0 # 时间间隔(秒)
28+
29+
# 车道合规
30+
- name: lane_compliance
31+
severity: medium
32+
enabled: true
33+
34+
# 速度限制
35+
- name: speed_limit
36+
severity: medium
37+
enabled: true
38+
params:
39+
max_speed: 120 # km/h
40+
41+
# 安全阈值
42+
thresholds:
43+
ttc_warning: 3.0 # TTC 警告阈值(秒)
44+
ttc_critical: 1.5 # TTC 关键阈值(秒)
45+
min_safe_distance: 2.0 # 最小安全距离(米)
46+
speed_distance_factor: 0.5 # 速度-距离系数
47+
48+
# 打分权重
49+
weights:
50+
collision: 1.0 # 碰撞权重
51+
ttc: 0.8 # TTC 权重
52+
boundary: 0.5 # 边界权重
53+
54+
# 训练信号配置
55+
training:
56+
generate_positive_signals: false # 是否生成正样本
57+
export_format: json # 导出格式: json, tfrecord, parquet

fuse.sh

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#!/bin/bash
2+
# 多帧点云融合脚本
3+
# 用法: ./fuse.sh [输入目录] [输出文件]
4+
5+
set -e
6+
7+
# 颜色定义
8+
GREEN='\033[0;32m'
9+
YELLOW='\033[1;33m'
10+
BLUE='\033[0;34m'
11+
NC='\033[0m'
12+
13+
# 默认路径
14+
DEFAULT_INPUT="outputs/video_output/voxelized"
15+
DEFAULT_OUTPUT="outputs/video_output/fused_map.ply"
16+
17+
# 解析参数
18+
INPUT_DIR="${1:-$DEFAULT_INPUT}"
19+
OUTPUT_FILE="${2:-$DEFAULT_OUTPUT}"
20+
21+
# 显示帮助
22+
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
23+
echo "多帧点云融合脚本"
24+
echo ""
25+
echo "用法: ./fuse.sh [输入目录] [输出文件] [选项]"
26+
echo ""
27+
echo "参数:"
28+
echo " 输入目录 包含 vox_*.ply 文件的目录 (默认: $DEFAULT_INPUT)"
29+
echo " 输出文件 融合后的点云文件路径 (默认: $DEFAULT_OUTPUT)"
30+
echo ""
31+
echo "选项:"
32+
echo " -h, --help 显示帮助"
33+
echo ""
34+
echo "示例:"
35+
echo " ./fuse.sh # 使用默认路径"
36+
echo " ./fuse.sh outputs/my_scan # 指定输入目录"
37+
echo " ./fuse.sh outputs/my_scan my_map.ply # 指定输入和输出"
38+
echo ""
39+
echo "高级用法 (直接调用 aylm):"
40+
echo " aylm fuse -i 输入目录 -o 输出文件 --icp-distance 0.1 --voxel-size 0.05"
41+
exit 0
42+
fi
43+
44+
# 检查输入目录
45+
if [[ ! -d "$INPUT_DIR" ]]; then
46+
echo -e "${YELLOW}错误: 输入目录不存在: $INPUT_DIR${NC}"
47+
exit 1
48+
fi
49+
50+
# 统计点云文件
51+
PLY_COUNT=$(find "$INPUT_DIR" -name "vox_*.ply" 2>/dev/null | wc -l | tr -d ' ')
52+
53+
if [[ "$PLY_COUNT" -eq 0 ]]; then
54+
echo -e "${YELLOW}错误: 未找到 vox_*.ply 文件${NC}"
55+
echo "目录: $INPUT_DIR"
56+
exit 1
57+
fi
58+
59+
# 显示信息
60+
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
61+
echo -e "${GREEN}多帧点云融合${NC}"
62+
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
63+
echo ""
64+
echo -e "输入目录: ${GREEN}$INPUT_DIR${NC}"
65+
echo -e "点云数量: ${GREEN}$PLY_COUNT${NC}"
66+
echo -e "输出文件: ${GREEN}$OUTPUT_FILE${NC}"
67+
echo ""
68+
69+
# 列出点云文件
70+
echo "点云文件:"
71+
find "$INPUT_DIR" -name "vox_*.ply" | sort | while read f; do
72+
SIZE=$(du -h "$f" | cut -f1)
73+
echo " $(basename "$f") ($SIZE)"
74+
done
75+
echo ""
76+
77+
# 激活虚拟环境
78+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
79+
if [[ -d "$SCRIPT_DIR/aylm_env" ]]; then
80+
source "$SCRIPT_DIR/aylm_env/bin/activate"
81+
fi
82+
83+
# 执行融合
84+
echo -e "${BLUE}开始融合...${NC}"
85+
echo ""
86+
87+
aylm fuse -i "$INPUT_DIR" -o "$OUTPUT_FILE" -v
88+
89+
# 检查结果
90+
if [[ -f "$OUTPUT_FILE" ]]; then
91+
echo ""
92+
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
93+
echo -e "${GREEN}融合完成!${NC}"
94+
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
95+
96+
OUTPUT_SIZE=$(du -h "$OUTPUT_FILE" | cut -f1)
97+
echo ""
98+
echo -e "输出文件: ${GREEN}$OUTPUT_FILE${NC} ($OUTPUT_SIZE)"
99+
100+
# 检查位姿文件
101+
POSES_FILE="${OUTPUT_FILE%.ply}.poses.json"
102+
if [[ -f "$POSES_FILE" ]]; then
103+
echo -e "位姿轨迹: ${GREEN}$POSES_FILE${NC}"
104+
fi
105+
106+
echo ""
107+
echo "查看结果:"
108+
echo " open $OUTPUT_FILE # macOS 默认应用打开"
109+
echo " meshlab $OUTPUT_FILE # 使用 MeshLab 查看"
110+
fi

pyproject.toml

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
55
[project]
66
name = "aylm"
77
version = "2.0.0"
8-
description = "AYLM - Advanced YLM for 3D Gaussian Splatting"
8+
description = "A-YLM: Geometric Constitutional AI for Embodied Intelligence - Bidirectional fusion with E2E driving systems (FSD/ADS), providing 3D point cloud input and safety supervision. Self-supervised learning without human annotation. Edge-deployable real-time geometric validation."
99
readme = "README.md"
1010
license = {text = "MIT"}
1111
requires-python = ">=3.9"
@@ -20,6 +20,8 @@ classifiers = [
2020
"Programming Language :: Python :: 3.11",
2121
"Programming Language :: Python :: 3.12",
2222
"Topic :: Scientific/Engineering :: Artificial Intelligence",
23+
"Topic :: Scientific/Engineering :: Image Recognition",
24+
"Topic :: Scientific/Engineering :: Visualization",
2325
]
2426
dependencies = [
2527
"numpy",
@@ -41,9 +43,11 @@ semantic = [
4143
]
4244
dev = [
4345
"pytest",
46+
"pytest-cov",
4447
"black",
4548
"isort",
4649
"ruff",
50+
"mypy",
4751
]
4852
all = [
4953
"open3d>=0.18.0",
@@ -68,3 +72,47 @@ line_length = 88
6872
[tool.ruff]
6973
line-length = 88
7074
target-version = "py39"
75+
76+
[tool.ruff.lint]
77+
select = [
78+
"E", # pycodestyle errors
79+
"W", # pycodestyle warnings
80+
"F", # Pyflakes
81+
"I", # isort
82+
"B", # flake8-bugbear
83+
"C4", # flake8-comprehensions
84+
"UP", # pyupgrade
85+
"SIM", # flake8-simplify
86+
"TCH", # flake8-type-checking
87+
"RUF", # Ruff-specific rules
88+
]
89+
ignore = [
90+
"E501", # line too long (handled by black)
91+
"B008", # function call in default argument
92+
"B905", # zip without strict
93+
"RUF001", # ambiguous unicode in string (中文逗号等)
94+
"RUF002", # ambiguous unicode in docstring
95+
"RUF003", # ambiguous unicode in comment
96+
"RUF022", # __all__ not sorted (按功能分组更清晰)
97+
"TC002", # move import into TYPE_CHECKING (运行时需要)
98+
]
99+
100+
[tool.ruff.lint.isort]
101+
known-first-party = ["aylm"]
102+
103+
[tool.mypy]
104+
python_version = "3.11"
105+
warn_return_any = false
106+
warn_unused_configs = true
107+
disallow_untyped_defs = false
108+
check_untyped_defs = false
109+
ignore_missing_imports = true
110+
exclude = [
111+
"tests/",
112+
"ml-sharp/",
113+
"aylm_env/",
114+
]
115+
116+
[[tool.mypy.overrides]]
117+
module = "yaml"
118+
ignore_missing_imports = true

run.sh

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ ${YELLOW}点云切片选项:${NC}
6262
--no-slice 禁用点云切片
6363
--slice-radius 切片半径/米 (默认: 10.0)
6464
65+
${YELLOW}目标跟踪选项:${NC}
66+
--track 启用目标跟踪 (默认)
67+
--no-track 禁用目标跟踪
68+
6569
${YELLOW}示例:${NC}
6670
./run.sh --setup # 初始化
6771
./run.sh -i ./images # 处理图像
@@ -158,9 +162,10 @@ run_auto() {
158162
main() {
159163
local action="auto" input_dir="inputs/input_images" output_dir="" config_file=""
160164
local extra_args=() check_only=false use_gpu=false frame_interval="" fps="10" loop=false
161-
# 语义检测和切片参数(默认都启用)
162-
local semantic=true semantic_model="yolo11n-seg.pt" semantic_confidence="0.5"
165+
# 语义检测、切片和跟踪参数(默认都启用)
166+
local semantic=true semantic_model="yolo11n-seg.pt" semantic_confidence="0.25"
163167
local slice=true slice_radius="10.0"
168+
local track=true
164169

165170
while [[ $# -gt 0 ]]; do
166171
case "$1" in
@@ -185,6 +190,9 @@ main() {
185190
--slice) slice=true; shift ;;
186191
--no-slice) slice=false; shift ;;
187192
--slice-radius) slice_radius="$2"; shift 2 ;;
193+
# 跟踪参数
194+
--track) track=true; shift ;;
195+
--no-track) track=false; shift ;;
188196
*) extra_args+=("$1"); shift ;;
189197
esac
190198
done
@@ -213,6 +221,13 @@ main() {
213221
slice_args+=("--no-slice")
214222
fi
215223

224+
local track_args=()
225+
if [[ "$track" == true ]]; then
226+
track_args+=("--track")
227+
else
228+
track_args+=("--no-track")
229+
fi
230+
216231
case "$action" in
217232
setup) log_step "下载模型..."; python3 -m aylm.cli setup --download ;;
218233
voxelize) run_voxelize "${extra_args[@]}" ;;
@@ -223,6 +238,7 @@ main() {
223238
local video_args=("${extra_args[@]}")
224239
[[ -n "$config_file" ]] && video_args+=("-c" "$config_file")
225240
[[ "$use_gpu" == true ]] && video_args+=("--use-gpu")
241+
video_args+=("${semantic_args[@]}" "${slice_args[@]}" "${track_args[@]}")
226242
show_banner "视频处理"
227243
run_video_process "${video_args[@]}" ;;
228244
video-extract)
@@ -234,7 +250,7 @@ main() {
234250
local play_args=("-i" "$input_dir" "--fps" "$fps")
235251
[[ "$loop" == true ]] && play_args+=("--loop")
236252
run_video_play "${play_args[@]}" ;;
237-
auto) run_auto "$input_dir" "${extra_args[@]}" "${semantic_args[@]}" "${slice_args[@]}" ;;
253+
auto) run_auto "$input_dir" "${extra_args[@]}" "${semantic_args[@]}" "${slice_args[@]}" "${track_args[@]}" ;;
238254
esac
239255

240256
log_info "完成"

0 commit comments

Comments
 (0)