Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9bd22225f9 | |||
| 6f1fa101fa | |||
| 0b91dfffe6 |
+37
@@ -0,0 +1,37 @@
|
|||||||
|
# Local reference material
|
||||||
|
/00_reference/
|
||||||
|
|
||||||
|
# Python
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
.venv/
|
||||||
|
venv/
|
||||||
|
|
||||||
|
# Build outputs
|
||||||
|
build/
|
||||||
|
install/
|
||||||
|
devel/
|
||||||
|
log/
|
||||||
|
*.o
|
||||||
|
*.so
|
||||||
|
*.a
|
||||||
|
*.elf
|
||||||
|
*.hex
|
||||||
|
*.bin
|
||||||
|
*.axf
|
||||||
|
|
||||||
|
# Training outputs
|
||||||
|
logs/
|
||||||
|
checkpoints/
|
||||||
|
wandb/
|
||||||
|
|
||||||
|
# IDE and operating system files
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
.trae/
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Temporary and backup files
|
||||||
|
*.Bak
|
||||||
|
~$*
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# 项目文档
|
||||||
|
|
||||||
|
本目录用于保存 16DOF 轮足项目自身的技术文档和使用说明。
|
||||||
|
|
||||||
|
后续建议按主题组织:
|
||||||
|
|
||||||
|
```text
|
||||||
|
01_doc/
|
||||||
|
├─ architecture/ # 系统架构和数据流
|
||||||
|
├─ control/ # 控制与强化学习原理
|
||||||
|
├─ deployment/ # Sim2Sim 和 Sim2Real 部署
|
||||||
|
├─ hardware/ # 接线、标定和硬件兼容性
|
||||||
|
└─ user_guide/ # 安装、运行和调试说明
|
||||||
|
```
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# SolidWorks 源文件
|
||||||
|
|
||||||
|
`solidworks/` 保留原始装配层级和文件名。
|
||||||
|
|
||||||
|
建议使用 `solidworks/WEEKDOG.SLDASM` 作为整机入口。`26版sw单件/` 包含组成整机的单件和子装配体,不应随意改名或拆散。
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,40 @@
|
|||||||
|
# 16DOF 串联轮足机械
|
||||||
|
|
||||||
|
本目录保存山东华宇工学院 16DOF 串联轮足机器人的机械设计资料。
|
||||||
|
|
||||||
|
机器人由 12 个腿部关节和 4 个驱动轮组成,共 16 个执行器。源资料说明其使用 SolidWorks 26 版本完成设计、装配和 URDF 导出准备。
|
||||||
|
|
||||||
|
## 目录结构
|
||||||
|
|
||||||
|
```text
|
||||||
|
02_mechanical/
|
||||||
|
├─ CAD/
|
||||||
|
│ └─ solidworks/
|
||||||
|
│ ├─ WEEKDOG.SLDASM # 整机装配体入口
|
||||||
|
│ ├─ 轮子完整.SLDASM # 轮组装配体
|
||||||
|
│ ├─ 轮毂垫片.SLDPRT # 独立零件
|
||||||
|
│ └─ 26版sw单件/ # 单件与子装配体
|
||||||
|
├─ STEP/
|
||||||
|
│ ├─ WEEKDOG.STEP # 整机通用交换文件
|
||||||
|
│ └─ *.STEP # 身体、关节、腿部和轮组
|
||||||
|
└─ source_notes.txt # 原始资料说明
|
||||||
|
```
|
||||||
|
|
||||||
|
## 文件统计
|
||||||
|
|
||||||
|
- SolidWorks 装配体:4 个 `*.SLDASM`
|
||||||
|
- SolidWorks 零件:26 个 `*.SLDPRT`
|
||||||
|
- STEP 文件:10 个
|
||||||
|
|
||||||
|
## 使用方式
|
||||||
|
|
||||||
|
- 需要继续编辑设计时,从 `CAD/solidworks/WEEKDOG.SLDASM` 打开整机。
|
||||||
|
- 只需查看、测量或导入其他 CAD 软件时,使用 `STEP/WEEKDOG.STEP`。
|
||||||
|
- 子部件调试可以使用身体、髋关节、大腿、轮小腿和轮组 STEP。
|
||||||
|
- 为避免装配引用丢失,不要单独移动或重命名 `CAD/solidworks` 内部文件。
|
||||||
|
|
||||||
|
## 当前缺项
|
||||||
|
|
||||||
|
- 尚未提供关键零件二维 PDF 工程图。
|
||||||
|
- 尚未形成 BOM、装配步骤和干涉检查报告。
|
||||||
|
- 尚未核对 CAD 参数与训练使用的 URDF/MJCF 是否完全一致。
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
|||||||
|
# STEP 交换文件
|
||||||
|
|
||||||
|
本目录提供不依赖 SolidWorks 的通用机械交换文件。
|
||||||
|
|
||||||
|
- `WEEKDOG.STEP`:整机
|
||||||
|
- `DOG身体.STEP`:机器人身体
|
||||||
|
- `髋关节END.STEP`:髋关节
|
||||||
|
- `大腿.STEP`:大腿组件
|
||||||
|
- `轮小腿.STEP`:轮足小腿组件
|
||||||
|
- `轮子完整.STEP`:完整轮组
|
||||||
|
- 其余文件:轮子、轮毂垫片和连接零件
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,660 @@
|
|||||||
|
ISO-10303-21;
|
||||||
|
HEADER;
|
||||||
|
FILE_DESCRIPTION (( 'STEP AP214' ),
|
||||||
|
'1' );
|
||||||
|
FILE_NAME ('ÂÖì±µæÆ¬.STEP',
|
||||||
|
'2026-04-27T05:39:26',
|
||||||
|
( '' ),
|
||||||
|
( '' ),
|
||||||
|
'SwSTEP 2.0',
|
||||||
|
'SolidWorks 2026',
|
||||||
|
'' );
|
||||||
|
FILE_SCHEMA (( 'AUTOMOTIVE_DESIGN' ));
|
||||||
|
ENDSEC;
|
||||||
|
|
||||||
|
DATA;
|
||||||
|
#1 = ADVANCED_FACE ( 'NONE', ( #454 ), #386, .F. ) ;
|
||||||
|
#2 = PRODUCT_DEFINITION_CONTEXT ( 'detailed design', #631, 'design' ) ;
|
||||||
|
#3 = CYLINDRICAL_SURFACE ( 'NONE', #580, 7.000000000000000000 ) ;
|
||||||
|
#4 = CARTESIAN_POINT ( 'NONE', ( -8.242304845413723768, -7.487354696433185630, 8.000000000000000000 ) ) ;
|
||||||
|
#5 = FACE_BOUND ( 'NONE', #375, .T. ) ;
|
||||||
|
#6 = CARTESIAN_POINT ( 'NONE', ( 19.00000000000000000, -1.487354696433177415, 8.000000000000000000 ) ) ;
|
||||||
|
#7 = EDGE_CURVE ( 'NONE', #419, #33, #450, .T. ) ;
|
||||||
|
#8 = CARTESIAN_POINT ( 'NONE', ( 1.469576158976869898E-15, -13.48735469643318119, 8.000000000000000000 ) ) ;
|
||||||
|
#9 = EDGE_CURVE ( 'NONE', #83, #573, #139, .T. ) ;
|
||||||
|
#10 = AXIS2_PLACEMENT_3D ( 'NONE', #50, #65, #101 ) ;
|
||||||
|
#11 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#12 = VERTEX_POINT ( 'NONE', #91 ) ;
|
||||||
|
#13 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#14 = ORIENTED_EDGE ( 'NONE', *, *, #582, .F. ) ;
|
||||||
|
#15 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#16 = CARTESIAN_POINT ( 'NONE', ( -10.39230484541302957, 4.512645303566650057, 8.000000000000000000 ) ) ;
|
||||||
|
#17 = VERTEX_POINT ( 'NONE', #548 ) ;
|
||||||
|
#18 = AXIS2_PLACEMENT_3D ( 'NONE', #216, #64, #11 ) ;
|
||||||
|
#19 = CYLINDRICAL_SURFACE ( 'NONE', #263, 2.149999999999539391 ) ;
|
||||||
|
#20 = LINE ( 'NONE', #116, #596 ) ;
|
||||||
|
#21 = ORIENTED_EDGE ( 'NONE', *, *, #473, .T. ) ;
|
||||||
|
#22 = VERTEX_POINT ( 'NONE', #58 ) ;
|
||||||
|
#23 = AXIS2_PLACEMENT_3D ( 'NONE', #570, #275, #180 ) ;
|
||||||
|
#24 = CARTESIAN_POINT ( 'NONE', ( 10.39230484541344879, 4.512645303567090593, 8.000000000000000000 ) ) ;
|
||||||
|
#25 = CIRCLE ( 'NONE', #186, 2.150000000000000355 ) ;
|
||||||
|
#26 = ORIENTED_EDGE ( 'NONE', *, *, #169, .T. ) ;
|
||||||
|
#27 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#28 = CARTESIAN_POINT ( 'NONE', ( 2.150000000000000355, 10.51264530356682236, 0.000000000000000000 ) ) ;
|
||||||
|
#29 = VERTEX_POINT ( 'NONE', #488 ) ;
|
||||||
|
#30 = CARTESIAN_POINT ( 'NONE', ( -12.54230484541302992, 4.512645303566650057, 8.000000000000000000 ) ) ;
|
||||||
|
#31 = VECTOR ( 'NONE', #168, 1000.000000000000000 ) ;
|
||||||
|
#32 = ORIENTED_EDGE ( 'NONE', *, *, #241, .F. ) ;
|
||||||
|
#33 = VERTEX_POINT ( 'NONE', #244 ) ;
|
||||||
|
#34 = VECTOR ( 'NONE', #522, 1000.000000000000000 ) ;
|
||||||
|
#35 = CARTESIAN_POINT ( 'NONE', ( -2.150000000000000355, 10.51264530356682236, 8.000000000000000000 ) ) ;
|
||||||
|
#36 = ORIENTED_EDGE ( 'NONE', *, *, #190, .F. ) ;
|
||||||
|
#37 = SURFACE_SIDE_STYLE ('',( #482 ) ) ;
|
||||||
|
#38 = EDGE_CURVE ( 'NONE', #573, #33, #556, .T. ) ;
|
||||||
|
#39 = CARTESIAN_POINT ( 'NONE', ( -8.242304845413029213, 4.512645303566650057, 8.000000000000000000 ) ) ;
|
||||||
|
#40 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#41 = VECTOR ( 'NONE', #251, 1000.000000000000000 ) ;
|
||||||
|
#42 = VECTOR ( 'NONE', #144, 1000.000000000000000 ) ;
|
||||||
|
#43 = CARTESIAN_POINT ( 'NONE', ( -10.39230484541326405, -7.487354696433185630, 0.000000000000000000 ) ) ;
|
||||||
|
#44 = VERTEX_POINT ( 'NONE', #304 ) ;
|
||||||
|
#45 = LINE ( 'NONE', #594, #73 ) ;
|
||||||
|
#46 = ADVANCED_FACE ( 'NONE', ( #253 ), #588, .F. ) ;
|
||||||
|
#47 = VECTOR ( 'NONE', #87, 1000.000000000000000 ) ;
|
||||||
|
#48 = SHAPE_DEFINITION_REPRESENTATION ( #95, #280 ) ;
|
||||||
|
#49 = APPLICATION_CONTEXT ( 'automotive_design' ) ;
|
||||||
|
#50 = CARTESIAN_POINT ( 'NONE', ( 1.469576158976869898E-15, -13.48735469643318119, 8.000000000000000000 ) ) ;
|
||||||
|
#51 = ADVANCED_FACE ( 'NONE', ( #192 ), #530, .F. ) ;
|
||||||
|
#52 = CARTESIAN_POINT ( 'NONE', ( -2.149999999999433697, -13.48735469643318119, 0.000000000000000000 ) ) ;
|
||||||
|
#53 = VERTEX_POINT ( 'NONE', #293 ) ;
|
||||||
|
#54 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#55 = EDGE_CURVE ( 'NONE', #53, #17, #643, .T. ) ;
|
||||||
|
#56 = EDGE_CURVE ( 'NONE', #418, #620, #364, .T. ) ;
|
||||||
|
#57 = CARTESIAN_POINT ( 'NONE', ( 2.149999999999436362, -13.48735469643318119, 0.000000000000000000 ) ) ;
|
||||||
|
#58 = CARTESIAN_POINT ( 'NONE', ( 12.54230484541344914, 4.512645303567090593, 0.000000000000000000 ) ) ;
|
||||||
|
#59 = CIRCLE ( 'NONE', #425, 2.149999999999435030 ) ;
|
||||||
|
#60 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#61 = FACE_BOUND ( 'NONE', #360, .T. ) ;
|
||||||
|
#62 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#63 = EDGE_LOOP ( 'NONE', ( #142, #640, #372, #268 ) ) ;
|
||||||
|
#64 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#65 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#66 = ORIENTED_EDGE ( 'NONE', *, *, #563, .F. ) ;
|
||||||
|
#67 = ORIENTED_EDGE ( 'NONE', *, *, #55, .T. ) ;
|
||||||
|
#68 = EDGE_CURVE ( 'NONE', #614, #418, #322, .T. ) ;
|
||||||
|
#69 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#70 = ORIENTED_EDGE ( 'NONE', *, *, #221, .T. ) ;
|
||||||
|
#71 = CIRCLE ( 'NONE', #401, 2.150000000000000799 ) ;
|
||||||
|
#72 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#73 = VECTOR ( 'NONE', #436, 1000.000000000000000 ) ;
|
||||||
|
#74 = CARTESIAN_POINT ( 'NONE', ( -8.242304845413029213, 4.512645303566650057, 8.000000000000000000 ) ) ;
|
||||||
|
#75 = ORIENTED_EDGE ( 'NONE', *, *, #7, .T. ) ;
|
||||||
|
#76 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#77 = LINE ( 'NONE', #30, #247 ) ;
|
||||||
|
#78 = ORIENTED_EDGE ( 'NONE', *, *, #7, .F. ) ;
|
||||||
|
#79 = CIRCLE ( 'NONE', #327, 19.00000000000000000 ) ;
|
||||||
|
#80 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 8.000000000000000000 ) ) ;
|
||||||
|
#81 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 8.000000000000000000 ) ) ;
|
||||||
|
#82 = AXIS2_PLACEMENT_3D ( 'NONE', #525, #122, #471 ) ;
|
||||||
|
#83 = VERTEX_POINT ( 'NONE', #284 ) ;
|
||||||
|
#84 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#85 = ADVANCED_FACE ( 'NONE', ( #134 ), #433, .F. ) ;
|
||||||
|
#86 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#87 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#88 = VERTEX_POINT ( 'NONE', #28 ) ;
|
||||||
|
#89 = AXIS2_PLACEMENT_3D ( 'NONE', #521, #564, #416 ) ;
|
||||||
|
#90 = CYLINDRICAL_SURFACE ( 'NONE', #319, 19.00000000000000000 ) ;
|
||||||
|
#91 = CARTESIAN_POINT ( 'NONE', ( 12.54230484541344914, 4.512645303567090593, 8.000000000000000000 ) ) ;
|
||||||
|
#92 = ORIENTED_EDGE ( 'NONE', *, *, #515, .F. ) ;
|
||||||
|
#93 = AXIS2_PLACEMENT_3D ( 'NONE', #405, #248, #447 ) ;
|
||||||
|
#94 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 10.51264530356682236, 0.000000000000000000 ) ) ;
|
||||||
|
#95 = PRODUCT_DEFINITION_SHAPE ( 'NONE', 'NONE', #223 ) ;
|
||||||
|
#96 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#97 = ADVANCED_FACE ( 'NONE', ( #385 ), #477, .F. ) ;
|
||||||
|
#98 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#99 = AXIS2_PLACEMENT_3D ( 'NONE', #602, #107, #403 ) ;
|
||||||
|
#100 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 8.000000000000000000 ) ) ;
|
||||||
|
#101 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#102 = EDGE_CURVE ( 'NONE', #17, #44, #618, .T. ) ;
|
||||||
|
#103 = AXIS2_PLACEMENT_3D ( 'NONE', #246, #86, #391 ) ;
|
||||||
|
#104 = PLANE ( 'NONE', #99 ) ;
|
||||||
|
#105 = EDGE_CURVE ( 'NONE', #371, #620, #77, .T. ) ;
|
||||||
|
#106 = CARTESIAN_POINT ( 'NONE', ( -7.000000000000000000, -1.487354696433179857, 8.000000000000000000 ) ) ;
|
||||||
|
#107 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#108 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#109 = LINE ( 'NONE', #106, #151 ) ;
|
||||||
|
#110 = ORIENTED_EDGE ( 'NONE', *, *, #635, .F. ) ;
|
||||||
|
#111 = CYLINDRICAL_SURFACE ( 'NONE', #344, 19.00000000000000000 ) ;
|
||||||
|
#112 = FACE_OUTER_BOUND ( 'NONE', #63, .T. ) ;
|
||||||
|
#113 = ORIENTED_EDGE ( 'NONE', *, *, #445, .F. ) ;
|
||||||
|
#114 = AXIS2_PLACEMENT_3D ( 'NONE', #422, #434, #128 ) ;
|
||||||
|
#115 = LINE ( 'NONE', #310, #205 ) ;
|
||||||
|
#116 = CARTESIAN_POINT ( 'NONE', ( -2.150000000000000355, 10.51264530356682236, 8.000000000000000000 ) ) ;
|
||||||
|
#117 = EDGE_LOOP ( 'NONE', ( #167, #611 ) ) ;
|
||||||
|
#118 = EDGE_CURVE ( 'NONE', #22, #432, #299, .T. ) ;
|
||||||
|
#119 = FACE_OUTER_BOUND ( 'NONE', #626, .T. ) ;
|
||||||
|
#120 = VERTEX_POINT ( 'NONE', #633 ) ;
|
||||||
|
#121 = ORIENTED_EDGE ( 'NONE', *, *, #474, .T. ) ;
|
||||||
|
#122 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#123 = ORIENTED_EDGE ( 'NONE', *, *, #343, .T. ) ;
|
||||||
|
#124 = ADVANCED_FACE ( 'NONE', ( #377 ), #380, .F. ) ;
|
||||||
|
#125 = VECTOR ( 'NONE', #298, 1000.000000000000000 ) ;
|
||||||
|
#126 = CARTESIAN_POINT ( 'NONE', ( 1.469576158976869898E-15, -13.48735469643318119, 8.000000000000000000 ) ) ;
|
||||||
|
#127 = AXIS2_PLACEMENT_3D ( 'NONE', #547, #394, #533 ) ;
|
||||||
|
#128 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#129 = ORIENTED_EDGE ( 'NONE', *, *, #397, .T. ) ;
|
||||||
|
#130 = EDGE_LOOP ( 'NONE', ( #129, #415 ) ) ;
|
||||||
|
#131 = CARTESIAN_POINT ( 'NONE', ( 8.242304845413610082, -7.487354696433178525, 0.000000000000000000 ) ) ;
|
||||||
|
#132 = FACE_BOUND ( 'NONE', #442, .T. ) ;
|
||||||
|
#133 = CIRCLE ( 'NONE', #381, 7.000000000000000000 ) ;
|
||||||
|
#134 = FACE_OUTER_BOUND ( 'NONE', #478, .T. ) ;
|
||||||
|
#135 = AXIS2_PLACEMENT_3D ( 'NONE', #472, #581, #527 ) ;
|
||||||
|
#136 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#137 = VERTEX_POINT ( 'NONE', #35 ) ;
|
||||||
|
#138 = CARTESIAN_POINT ( 'NONE', ( 12.54230484541292512, -7.487354696433178525, 8.000000000000000000 ) ) ;
|
||||||
|
#139 = LINE ( 'NONE', #486, #413 ) ;
|
||||||
|
#140 = AXIS2_PLACEMENT_3D ( 'NONE', #24, #72, #27 ) ;
|
||||||
|
#141 = CARTESIAN_POINT ( 'NONE', ( -12.54230484541302992, 4.512645303566650057, 0.000000000000000000 ) ) ;
|
||||||
|
#142 = ORIENTED_EDGE ( 'NONE', *, *, #610, .F. ) ;
|
||||||
|
#143 = UNCERTAINTY_MEASURE_WITH_UNIT (LENGTH_MEASURE( 1.000000000000000082E-05 ), #537, 'distance_accuracy_value', 'NONE');
|
||||||
|
#144 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#145 = ORIENTED_EDGE ( 'NONE', *, *, #296, .F. ) ;
|
||||||
|
#146 = PRODUCT_CONTEXT ( 'NONE', #49, 'mechanical' ) ;
|
||||||
|
#147 = ADVANCED_FACE ( 'NONE', ( #237, #132, #326, #628, #279, #183, #234, #431 ), #330, .T. ) ;
|
||||||
|
#148 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#149 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#150 = CARTESIAN_POINT ( 'NONE', ( -12.54230484541280255, -7.487354696433185630, 8.000000000000000000 ) ) ;
|
||||||
|
#151 = VECTOR ( 'NONE', #497, 1000.000000000000000 ) ;
|
||||||
|
#152 = VECTOR ( 'NONE', #638, 1000.000000000000000 ) ;
|
||||||
|
#153 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#154 = EDGE_LOOP ( 'NONE', ( #209, #255, #475, #276 ) ) ;
|
||||||
|
#155 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#156 = MANIFOLD_SOLID_BREP ( '\X2\51f853f0\X0\-\X2\62c94f38\X0\1', #196 ) ;
|
||||||
|
#157 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#158 = CARTESIAN_POINT ( 'NONE', ( 2.149999999999436362, -13.48735469643318119, 8.000000000000000000 ) ) ;
|
||||||
|
#159 = CIRCLE ( 'NONE', #440, 2.149999999999657518 ) ;
|
||||||
|
#160 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#161 = LINE ( 'NONE', #456, #125 ) ;
|
||||||
|
#162 = ADVANCED_FACE ( 'NONE', ( #559 ), #622, .F. ) ;
|
||||||
|
#163 = EDGE_LOOP ( 'NONE', ( #469, #566, #378, #338 ) ) ;
|
||||||
|
#164 = AXIS2_PLACEMENT_3D ( 'NONE', #404, #499, #639 ) ;
|
||||||
|
#165 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#166 = ORIENTED_EDGE ( 'NONE', *, *, #351, .T. ) ;
|
||||||
|
#167 = ORIENTED_EDGE ( 'NONE', *, *, #169, .F. ) ;
|
||||||
|
#168 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#169 = EDGE_CURVE ( 'NONE', #29, #12, #194, .T. ) ;
|
||||||
|
#170 = ORIENTED_EDGE ( 'NONE', *, *, #531, .F. ) ;
|
||||||
|
#171 = EDGE_LOOP ( 'NONE', ( #218, #291, #368, #513 ) ) ;
|
||||||
|
#172 = ORIENTED_EDGE ( 'NONE', *, *, #38, .F. ) ;
|
||||||
|
#173 = CARTESIAN_POINT ( 'NONE', ( -10.39230484541302957, 4.512645303566650057, 8.000000000000000000 ) ) ;
|
||||||
|
#174 = AXIS2_PLACEMENT_3D ( 'NONE', #514, #225, #369 ) ;
|
||||||
|
#175 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#176 = ORIENTED_EDGE ( 'NONE', *, *, #328, .T. ) ;
|
||||||
|
#177 = CIRCLE ( 'NONE', #290, 7.000000000000000000 ) ;
|
||||||
|
#178 = ORIENTED_EDGE ( 'NONE', *, *, #448, .F. ) ;
|
||||||
|
#179 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#180 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#181 = ORIENTED_EDGE ( 'NONE', *, *, #397, .F. ) ;
|
||||||
|
#182 = ORIENTED_EDGE ( 'NONE', *, *, #448, .T. ) ;
|
||||||
|
#183 = FACE_BOUND ( 'NONE', #117, .T. ) ;
|
||||||
|
#184 = AXIS2_PLACEMENT_3D ( 'NONE', #595, #398, #546 ) ;
|
||||||
|
#185 = EDGE_CURVE ( 'NONE', #429, #259, #361, .T. ) ;
|
||||||
|
#186 = AXIS2_PLACEMENT_3D ( 'NONE', #94, #345, #239 ) ;
|
||||||
|
#187 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#188 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#189 = ORIENTED_EDGE ( 'NONE', *, *, #335, .F. ) ;
|
||||||
|
#190 = EDGE_CURVE ( 'NONE', #466, #465, #59, .T. ) ;
|
||||||
|
#191 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#192 = FACE_OUTER_BOUND ( 'NONE', #154, .T. ) ;
|
||||||
|
#193 = ORIENTED_EDGE ( 'NONE', *, *, #560, .T. ) ;
|
||||||
|
#194 = CIRCLE ( 'NONE', #140, 2.150000000000000799 ) ;
|
||||||
|
#195 = VERTEX_POINT ( 'NONE', #222 ) ;
|
||||||
|
#196 = CLOSED_SHELL ( 'NONE', ( #285, #470, #85, #46, #97, #1, #584, #577, #147, #483, #505, #124, #162, #383, #512, #212, #51, #355 ) ) ;
|
||||||
|
#197 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#198 = PRODUCT_RELATED_PRODUCT_CATEGORY ( 'part', '', ( #601 ) ) ;
|
||||||
|
#199 = FACE_OUTER_BOUND ( 'NONE', #315, .T. ) ;
|
||||||
|
#200 = CARTESIAN_POINT ( 'NONE', ( -10.39230484541302957, 4.512645303566650057, 0.000000000000000000 ) ) ;
|
||||||
|
#201 = FACE_OUTER_BOUND ( 'NONE', #365, .T. ) ;
|
||||||
|
#202 = ORIENTED_EDGE ( 'NONE', *, *, #68, .F. ) ;
|
||||||
|
#203 = CARTESIAN_POINT ( 'NONE', ( -8.242304845413723768, -7.487354696433185630, 0.000000000000000000 ) ) ;
|
||||||
|
#204 = CIRCLE ( 'NONE', #10, 2.149999999999435030 ) ;
|
||||||
|
#205 = VECTOR ( 'NONE', #506, 1000.000000000000000 ) ;
|
||||||
|
#206 = FACE_BOUND ( 'NONE', #625, .T. ) ;
|
||||||
|
#207 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#208 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#209 = ORIENTED_EDGE ( 'NONE', *, *, #393, .F. ) ;
|
||||||
|
#210 = PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE ( 'ä»', '', #601, .NOT_KNOWN. ) ;
|
||||||
|
#211 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 10.51264530356682236, 8.000000000000000000 ) ) ;
|
||||||
|
#212 = ADVANCED_FACE ( 'NONE', ( #119 ), #510, .F. ) ;
|
||||||
|
#213 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#214 = AXIS2_PLACEMENT_3D ( 'NONE', #592, #552, #302 ) ;
|
||||||
|
#215 = ORIENTED_EDGE ( 'NONE', *, *, #105, .T. ) ;
|
||||||
|
#216 = CARTESIAN_POINT ( 'NONE', ( 10.39230484541326760, -7.487354696433178525, 8.000000000000000000 ) ) ;
|
||||||
|
#217 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#218 = ORIENTED_EDGE ( 'NONE', *, *, #306, .T. ) ;
|
||||||
|
#219 = ORIENTED_EDGE ( 'NONE', *, *, #424, .T. ) ;
|
||||||
|
#220 = VECTOR ( 'NONE', #153, 1000.000000000000000 ) ;
|
||||||
|
#221 = EDGE_CURVE ( 'NONE', #314, #465, #609, .T. ) ;
|
||||||
|
#222 = CARTESIAN_POINT ( 'NONE', ( 12.54230484541292512, -7.487354696433178525, 0.000000000000000000 ) ) ;
|
||||||
|
#223 = PRODUCT_DEFINITION ( 'æœ', '', #210, #2 ) ;
|
||||||
|
#224 = ORIENTED_EDGE ( 'NONE', *, *, #583, .T. ) ;
|
||||||
|
#225 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#226 = SURFACE_STYLE_USAGE ( .BOTH. , #37 ) ;
|
||||||
|
#227 = ORIENTED_EDGE ( 'NONE', *, *, #632, .T. ) ;
|
||||||
|
#228 = ORIENTED_EDGE ( 'NONE', *, *, #334, .T. ) ;
|
||||||
|
#229 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#230 = AXIS2_PLACEMENT_3D ( 'NONE', #617, #476, #568 ) ;
|
||||||
|
#231 = CARTESIAN_POINT ( 'NONE', ( 10.39230484541344879, 4.512645303567090593, 8.000000000000000000 ) ) ;
|
||||||
|
#232 = ORIENTED_EDGE ( 'NONE', *, *, #306, .F. ) ;
|
||||||
|
#233 = EDGE_LOOP ( 'NONE', ( #504, #75, #219, #370 ) ) ;
|
||||||
|
#234 = FACE_BOUND ( 'NONE', #238, .T. ) ;
|
||||||
|
#235 = ORIENTED_EDGE ( 'NONE', *, *, #445, .T. ) ;
|
||||||
|
#236 = EDGE_CURVE ( 'NONE', #12, #29, #553, .T. ) ;
|
||||||
|
#237 = FACE_BOUND ( 'NONE', #518, .T. ) ;
|
||||||
|
#238 = EDGE_LOOP ( 'NONE', ( #113, #621 ) ) ;
|
||||||
|
#239 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#240 = CIRCLE ( 'NONE', #318, 2.150000000000000799 ) ;
|
||||||
|
#241 = EDGE_CURVE ( 'NONE', #264, #195, #441, .T. ) ;
|
||||||
|
#242 = CIRCLE ( 'NONE', #350, 7.000000000000000000 ) ;
|
||||||
|
#243 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#244 = CARTESIAN_POINT ( 'NONE', ( 19.00000000000000000, -1.487354696433177415, 0.000000000000000000 ) ) ;
|
||||||
|
#245 = AXIS2_PLACEMENT_3D ( 'NONE', #211, #496, #160 ) ;
|
||||||
|
#246 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 10.51264530356682236, 8.000000000000000000 ) ) ;
|
||||||
|
#247 = VECTOR ( 'NONE', #480, 1000.000000000000000 ) ;
|
||||||
|
#248 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#249 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#250 = EDGE_LOOP ( 'NONE', ( #333, #558 ) ) ;
|
||||||
|
#251 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#252 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 0.000000000000000000 ) ) ;
|
||||||
|
#253 = FACE_OUTER_BOUND ( 'NONE', #629, .T. ) ;
|
||||||
|
#254 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#255 = ORIENTED_EDGE ( 'NONE', *, *, #529, .T. ) ;
|
||||||
|
#256 = AXIS2_PLACEMENT_3D ( 'NONE', #80, #316, #217 ) ;
|
||||||
|
#257 = FACE_BOUND ( 'NONE', #354, .T. ) ;
|
||||||
|
#258 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#259 = VERTEX_POINT ( 'NONE', #467 ) ;
|
||||||
|
#260 = AXIS2_PLACEMENT_3D ( 'NONE', #438, #197, #191 ) ;
|
||||||
|
#261 = FACE_OUTER_BOUND ( 'NONE', #562, .T. ) ;
|
||||||
|
#262 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#263 = AXIS2_PLACEMENT_3D ( 'NONE', #453, #157, #362 ) ;
|
||||||
|
#264 = VERTEX_POINT ( 'NONE', #131 ) ;
|
||||||
|
#265 = EDGE_CURVE ( 'NONE', #419, #83, #376, .T. ) ;
|
||||||
|
#266 = EDGE_LOOP ( 'NONE', ( #523, #636, #181, #324 ) ) ;
|
||||||
|
#267 = CARTESIAN_POINT ( 'NONE', ( -2.149999999999433697, -13.48735469643318119, 8.000000000000000000 ) ) ;
|
||||||
|
#268 = ORIENTED_EDGE ( 'NONE', *, *, #118, .F. ) ;
|
||||||
|
#269 = AXIS2_PLACEMENT_3D ( 'NONE', #407, #605, #555 ) ;
|
||||||
|
#270 = FACE_OUTER_BOUND ( 'NONE', #171, .T. ) ;
|
||||||
|
#271 = PRESENTATION_STYLE_ASSIGNMENT (( #226 ) ) ;
|
||||||
|
#272 = ORIENTED_EDGE ( 'NONE', *, *, #335, .T. ) ;
|
||||||
|
#273 = ORIENTED_EDGE ( 'NONE', *, *, #185, .T. ) ;
|
||||||
|
#274 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#275 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#276 = ORIENTED_EDGE ( 'NONE', *, *, #185, .F. ) ;
|
||||||
|
#277 = ORIENTED_EDGE ( 'NONE', *, *, #593, .T. ) ;
|
||||||
|
#278 = AXIS2_PLACEMENT_3D ( 'NONE', #126, #321, #69 ) ;
|
||||||
|
#279 = FACE_BOUND ( 'NONE', #250, .T. ) ;
|
||||||
|
#280 = ADVANCED_BREP_SHAPE_REPRESENTATION ( '\X2\8f6e6bc257ab7247\X0\', ( #156, #260 ), #539 ) ;
|
||||||
|
#281 = EDGE_CURVE ( 'NONE', #432, #22, #623, .T. ) ;
|
||||||
|
#282 = ORIENTED_EDGE ( 'NONE', *, *, #473, .F. ) ;
|
||||||
|
#283 = FILL_AREA_STYLE ('',( #578 ) ) ;
|
||||||
|
#284 = CARTESIAN_POINT ( 'NONE', ( -19.00000000000000000, -1.487354696433179857, 8.000000000000000000 ) ) ;
|
||||||
|
#285 = ADVANCED_FACE ( 'NONE', ( #270 ), #420, .F. ) ;
|
||||||
|
#286 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#287 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 10.51264530356682236, 8.000000000000000000 ) ) ;
|
||||||
|
#288 = EDGE_LOOP ( 'NONE', ( #590, #277, #123, #189 ) ) ;
|
||||||
|
#289 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#290 = AXIS2_PLACEMENT_3D ( 'NONE', #402, #544, #557 ) ;
|
||||||
|
#291 = ORIENTED_EDGE ( 'NONE', *, *, #68, .T. ) ;
|
||||||
|
#292 = ORIENTED_EDGE ( 'NONE', *, *, #56, .T. ) ;
|
||||||
|
#293 = CARTESIAN_POINT ( 'NONE', ( -7.000000000000000000, -1.487354696433179857, 8.000000000000000000 ) ) ;
|
||||||
|
#294 = AXIS2_PLACEMENT_3D ( 'NONE', #503, #62, #258 ) ;
|
||||||
|
#295 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#296 = EDGE_CURVE ( 'NONE', #465, #466, #516, .T. ) ;
|
||||||
|
#297 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#298 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#299 = CIRCLE ( 'NONE', #23, 2.150000000000000799 ) ;
|
||||||
|
#300 = CIRCLE ( 'NONE', #269, 2.149999999999539391 ) ;
|
||||||
|
#301 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 8.000000000000000000 ) ) ;
|
||||||
|
#302 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#303 = FACE_OUTER_BOUND ( 'NONE', #406, .T. ) ;
|
||||||
|
#304 = CARTESIAN_POINT ( 'NONE', ( 7.000000000000000000, -1.487354696433178969, 0.000000000000000000 ) ) ;
|
||||||
|
#305 = CARTESIAN_POINT ( 'NONE', ( 2.150000000000000355, 10.51264530356682236, 8.000000000000000000 ) ) ;
|
||||||
|
#306 = EDGE_CURVE ( 'NONE', #371, #614, #240, .T. ) ;
|
||||||
|
#307 = AXIS2_PLACEMENT_3D ( 'NONE', #81, #187, #572 ) ;
|
||||||
|
#308 = FACE_BOUND ( 'NONE', #367, .T. ) ;
|
||||||
|
#309 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#310 = CARTESIAN_POINT ( 'NONE', ( 8.242304845413448433, 4.512645303567090593, 8.000000000000000000 ) ) ;
|
||||||
|
#311 = CARTESIAN_POINT ( 'NONE', ( -7.000000000000000000, -1.487354696433179857, 0.000000000000000000 ) ) ;
|
||||||
|
#312 = EDGE_LOOP ( 'NONE', ( #232, #400 ) ) ;
|
||||||
|
#313 =( NAMED_UNIT ( * ) SI_UNIT ( $, .STERADIAN. ) SOLID_ANGLE_UNIT ( ) );
|
||||||
|
#314 = VERTEX_POINT ( 'NONE', #356 ) ;
|
||||||
|
#315 = EDGE_LOOP ( 'NONE', ( #67, #535, #524, #479 ) ) ;
|
||||||
|
#316 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#317 = ORIENTED_EDGE ( 'NONE', *, *, #296, .T. ) ;
|
||||||
|
#318 = AXIS2_PLACEMENT_3D ( 'NONE', #606, #309, #13 ) ;
|
||||||
|
#319 = AXIS2_PLACEMENT_3D ( 'NONE', #100, #396, #446 ) ;
|
||||||
|
#320 = VERTEX_POINT ( 'NONE', #311 ) ;
|
||||||
|
#321 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#322 = LINE ( 'NONE', #74, #493 ) ;
|
||||||
|
#323 = ORIENTED_EDGE ( 'NONE', *, *, #221, .F. ) ;
|
||||||
|
#324 = ORIENTED_EDGE ( 'NONE', *, *, #328, .F. ) ;
|
||||||
|
#325 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#326 = FACE_BOUND ( 'NONE', #607, .T. ) ;
|
||||||
|
#327 = AXIS2_PLACEMENT_3D ( 'NONE', #349, #54, #254 ) ;
|
||||||
|
#328 = EDGE_CURVE ( 'NONE', #137, #120, #20, .T. ) ;
|
||||||
|
#329 = EDGE_LOOP ( 'NONE', ( #202, #567, #215, #340 ) ) ;
|
||||||
|
#330 = PLANE ( 'NONE', #619 ) ;
|
||||||
|
#331 = AXIS2_PLACEMENT_3D ( 'NONE', #287, #207, #439 ) ;
|
||||||
|
#332 =( LENGTH_UNIT ( ) NAMED_UNIT ( * ) SI_UNIT ( .MILLI., .METRE. ) );
|
||||||
|
#333 = ORIENTED_EDGE ( 'NONE', *, *, #55, .F. ) ;
|
||||||
|
#334 = EDGE_CURVE ( 'NONE', #616, #264, #495, .T. ) ;
|
||||||
|
#335 = EDGE_CURVE ( 'NONE', #44, #320, #177, .T. ) ;
|
||||||
|
#336 = CARTESIAN_POINT ( 'NONE', ( 1.469576158976869898E-15, -13.48735469643318119, 8.000000000000000000 ) ) ;
|
||||||
|
#337 = ORIENTED_EDGE ( 'NONE', *, *, #583, .F. ) ;
|
||||||
|
#338 = ORIENTED_EDGE ( 'NONE', *, *, #412, .F. ) ;
|
||||||
|
#339 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 0.000000000000000000 ) ) ;
|
||||||
|
#340 = ORIENTED_EDGE ( 'NONE', *, *, #56, .F. ) ;
|
||||||
|
#341 = LINE ( 'NONE', #585, #42 ) ;
|
||||||
|
#342 = EDGE_LOOP ( 'NONE', ( #317, #615 ) ) ;
|
||||||
|
#343 = EDGE_CURVE ( 'NONE', #53, #320, #109, .T. ) ;
|
||||||
|
#344 = AXIS2_PLACEMENT_3D ( 'NONE', #301, #502, #399 ) ;
|
||||||
|
#345 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#346 = FACE_OUTER_BOUND ( 'NONE', #329, .T. ) ;
|
||||||
|
#347 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 8.000000000000000000 ) ) ;
|
||||||
|
#348 = AXIS2_PLACEMENT_3D ( 'NONE', #427, #165, #366 ) ;
|
||||||
|
#349 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 0.000000000000000000 ) ) ;
|
||||||
|
#350 = AXIS2_PLACEMENT_3D ( 'NONE', #347, #295, #98 ) ;
|
||||||
|
#351 = EDGE_CURVE ( 'NONE', #417, #314, #204, .T. ) ;
|
||||||
|
#352 = CARTESIAN_POINT ( 'NONE', ( 12.54230484541292512, -7.487354696433178525, 8.000000000000000000 ) ) ;
|
||||||
|
#353 = EDGE_CURVE ( 'NONE', #620, #418, #71, .T. ) ;
|
||||||
|
#354 = EDGE_LOOP ( 'NONE', ( #561, #182 ) ) ;
|
||||||
|
#355 = ADVANCED_FACE ( 'NONE', ( #346 ), #600, .F. ) ;
|
||||||
|
#356 = CARTESIAN_POINT ( 'NONE', ( -2.149999999999433697, -13.48735469643318119, 8.000000000000000000 ) ) ;
|
||||||
|
#357 = FACE_OUTER_BOUND ( 'NONE', #163, .T. ) ;
|
||||||
|
#358 = CIRCLE ( 'NONE', #245, 2.150000000000000355 ) ;
|
||||||
|
#359 = CARTESIAN_POINT ( 'NONE', ( 19.00000000000000000, -1.487354696433177415, 8.000000000000000000 ) ) ;
|
||||||
|
#360 = EDGE_LOOP ( 'NONE', ( #637, #426 ) ) ;
|
||||||
|
#361 = CIRCLE ( 'NONE', #174, 2.149999999999539391 ) ;
|
||||||
|
#362 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#363 = CARTESIAN_POINT ( 'NONE', ( 10.39230484541326760, -7.487354696433178525, 8.000000000000000000 ) ) ;
|
||||||
|
#364 = CIRCLE ( 'NONE', #114, 2.150000000000000799 ) ;
|
||||||
|
#365 = EDGE_LOOP ( 'NONE', ( #78, #460, #519, #574 ) ) ;
|
||||||
|
#366 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#367 = EDGE_LOOP ( 'NONE', ( #121, #272 ) ) ;
|
||||||
|
#368 = ORIENTED_EDGE ( 'NONE', *, *, #353, .F. ) ;
|
||||||
|
#369 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#370 = ORIENTED_EDGE ( 'NONE', *, *, #9, .F. ) ;
|
||||||
|
#371 = VERTEX_POINT ( 'NONE', #500 ) ;
|
||||||
|
#372 = ORIENTED_EDGE ( 'NONE', *, *, #531, .T. ) ;
|
||||||
|
#373 = CARTESIAN_POINT ( 'NONE', ( 1.469576158976869898E-15, -13.48735469643318119, 0.000000000000000000 ) ) ;
|
||||||
|
#374 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#375 = EDGE_LOOP ( 'NONE', ( #508, #273 ) ) ;
|
||||||
|
#376 = CIRCLE ( 'NONE', #256, 19.00000000000000000 ) ;
|
||||||
|
#377 = FACE_OUTER_BOUND ( 'NONE', #288, .T. ) ;
|
||||||
|
#378 = ORIENTED_EDGE ( 'NONE', *, *, #627, .F. ) ;
|
||||||
|
#379 = ORIENTED_EDGE ( 'NONE', *, *, #424, .F. ) ;
|
||||||
|
#380 = CYLINDRICAL_SURFACE ( 'NONE', #307, 7.000000000000000000 ) ;
|
||||||
|
#381 = AXIS2_PLACEMENT_3D ( 'NONE', #252, #551, #249 ) ;
|
||||||
|
#382 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 8.000000000000000000 ) ) ;
|
||||||
|
#383 = ADVANCED_FACE ( 'NONE', ( #112 ), #507, .F. ) ;
|
||||||
|
#384 = CIRCLE ( 'NONE', #103, 2.150000000000000355 ) ;
|
||||||
|
#385 = FACE_OUTER_BOUND ( 'NONE', #509, .T. ) ;
|
||||||
|
#386 = CYLINDRICAL_SURFACE ( 'NONE', #331, 2.150000000000000355 ) ;
|
||||||
|
#387 = VERTEX_POINT ( 'NONE', #4 ) ;
|
||||||
|
#388 = APPLICATION_PROTOCOL_DEFINITION ( 'draft international standard', 'automotive_design', 1998, #631 ) ;
|
||||||
|
#389 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION ( '', ( #641 ), #452 ) ;
|
||||||
|
#390 = CARTESIAN_POINT ( 'NONE', ( -10.39230484541326405, -7.487354696433185630, 8.000000000000000000 ) ) ;
|
||||||
|
#391 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#392 = AXIS2_PLACEMENT_3D ( 'NONE', #231, #374, #428 ) ;
|
||||||
|
#393 = EDGE_CURVE ( 'NONE', #387, #429, #161, .T. ) ;
|
||||||
|
#394 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#395 = CARTESIAN_POINT ( 'NONE', ( -8.242304845413029213, 4.512645303566650057, 0.000000000000000000 ) ) ;
|
||||||
|
#396 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#397 = EDGE_CURVE ( 'NONE', #120, #88, #569, .T. ) ;
|
||||||
|
#398 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#399 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#400 = ORIENTED_EDGE ( 'NONE', *, *, #421, .F. ) ;
|
||||||
|
#401 = AXIS2_PLACEMENT_3D ( 'NONE', #200, #148, #262 ) ;
|
||||||
|
#402 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 0.000000000000000000 ) ) ;
|
||||||
|
#403 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, -0.000000000000000000 ) ) ;
|
||||||
|
#404 = CARTESIAN_POINT ( 'NONE', ( 10.39230484541326760, -7.487354696433178525, 8.000000000000000000 ) ) ;
|
||||||
|
#405 = CARTESIAN_POINT ( 'NONE', ( 10.39230484541344879, 4.512645303567090593, 8.000000000000000000 ) ) ;
|
||||||
|
#406 = EDGE_LOOP ( 'NONE', ( #550, #21, #228, #178 ) ) ;
|
||||||
|
#407 = CARTESIAN_POINT ( 'NONE', ( -10.39230484541326405, -7.487354696433185630, 8.000000000000000000 ) ) ;
|
||||||
|
#408 = CIRCLE ( 'NONE', #18, 2.149999999999657518 ) ;
|
||||||
|
#409 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#410 = CYLINDRICAL_SURFACE ( 'NONE', #526, 2.149999999999657518 ) ;
|
||||||
|
#411 = CARTESIAN_POINT ( 'NONE', ( 10.39230484541344879, 4.512645303567090593, 0.000000000000000000 ) ) ;
|
||||||
|
#412 = EDGE_CURVE ( 'NONE', #430, #259, #603, .T. ) ;
|
||||||
|
#413 = VECTOR ( 'NONE', #243, 1000.000000000000000 ) ;
|
||||||
|
#414 = VERTEX_POINT ( 'NONE', #305 ) ;
|
||||||
|
#415 = ORIENTED_EDGE ( 'NONE', *, *, #563, .T. ) ;
|
||||||
|
#416 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#417 = VERTEX_POINT ( 'NONE', #158 ) ;
|
||||||
|
#418 = VERTEX_POINT ( 'NONE', #395 ) ;
|
||||||
|
#419 = VERTEX_POINT ( 'NONE', #359 ) ;
|
||||||
|
#420 = CYLINDRICAL_SURFACE ( 'NONE', #634, 2.150000000000000799 ) ;
|
||||||
|
#421 = EDGE_CURVE ( 'NONE', #614, #371, #604, .T. ) ;
|
||||||
|
#422 = CARTESIAN_POINT ( 'NONE', ( -10.39230484541302957, 4.512645303566650057, 0.000000000000000000 ) ) ;
|
||||||
|
#423 = ORIENTED_EDGE ( 'NONE', *, *, #610, .T. ) ;
|
||||||
|
#424 = EDGE_CURVE ( 'NONE', #33, #573, #79, .T. ) ;
|
||||||
|
#425 = AXIS2_PLACEMENT_3D ( 'NONE', #373, #325, #613 ) ;
|
||||||
|
#426 = ORIENTED_EDGE ( 'NONE', *, *, #118, .T. ) ;
|
||||||
|
#427 = CARTESIAN_POINT ( 'NONE', ( 1.469576158976869898E-15, -13.48735469643318119, 0.000000000000000000 ) ) ;
|
||||||
|
#428 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#429 = VERTEX_POINT ( 'NONE', #203 ) ;
|
||||||
|
#430 = VERTEX_POINT ( 'NONE', #451 ) ;
|
||||||
|
#431 = FACE_BOUND ( 'NONE', #312, .T. ) ;
|
||||||
|
#432 = VERTEX_POINT ( 'NONE', #549 ) ;
|
||||||
|
#433 = CYLINDRICAL_SURFACE ( 'NONE', #579, 2.149999999999435030 ) ;
|
||||||
|
#434 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#435 = CIRCLE ( 'NONE', #494, 2.149999999999539391 ) ;
|
||||||
|
#436 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#437 = ORIENTED_EDGE ( 'NONE', *, *, #463, .F. ) ;
|
||||||
|
#438 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#439 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#440 = AXIS2_PLACEMENT_3D ( 'NONE', #363, #586, #84 ) ;
|
||||||
|
#441 = CIRCLE ( 'NONE', #89, 2.149999999999657518 ) ;
|
||||||
|
#442 = EDGE_LOOP ( 'NONE', ( #437, #282 ) ) ;
|
||||||
|
#443 = LINE ( 'NONE', #138, #152 ) ;
|
||||||
|
#444 = AXIS2_PLACEMENT_3D ( 'NONE', #390, #538, #96 ) ;
|
||||||
|
#445 = EDGE_CURVE ( 'NONE', #314, #417, #575, .T. ) ;
|
||||||
|
#446 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#447 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#448 = EDGE_CURVE ( 'NONE', #195, #264, #462, .T. ) ;
|
||||||
|
#449 = FACE_BOUND ( 'NONE', #342, .T. ) ;
|
||||||
|
#450 = LINE ( 'NONE', #6, #47 ) ;
|
||||||
|
#451 = CARTESIAN_POINT ( 'NONE', ( -12.54230484541280255, -7.487354696433185630, 8.000000000000000000 ) ) ;
|
||||||
|
#452 =( GEOMETRIC_REPRESENTATION_CONTEXT ( 3 ) GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT ( ( #540 ) ) GLOBAL_UNIT_ASSIGNED_CONTEXT ( ( #332, #484, #313 ) ) REPRESENTATION_CONTEXT ( 'NONE', 'WORKASPACE' ) );
|
||||||
|
#453 = CARTESIAN_POINT ( 'NONE', ( -10.39230484541326405, -7.487354696433185630, 8.000000000000000000 ) ) ;
|
||||||
|
#454 = FACE_OUTER_BOUND ( 'NONE', #266, .T. ) ;
|
||||||
|
#455 = AXIS2_PLACEMENT_3D ( 'NONE', #16, #213, #208 ) ;
|
||||||
|
#456 = CARTESIAN_POINT ( 'NONE', ( -8.242304845413723768, -7.487354696433185630, 8.000000000000000000 ) ) ;
|
||||||
|
#457 = ORIENTED_EDGE ( 'NONE', *, *, #334, .F. ) ;
|
||||||
|
#458 = CARTESIAN_POINT ( 'NONE', ( 10.39230484541326760, -7.487354696433178525, 8.000000000000000000 ) ) ;
|
||||||
|
#459 = CARTESIAN_POINT ( 'NONE', ( 8.242304845413610082, -7.487354696433178525, 8.000000000000000000 ) ) ;
|
||||||
|
#460 = ORIENTED_EDGE ( 'NONE', *, *, #560, .F. ) ;
|
||||||
|
#461 = CARTESIAN_POINT ( 'NONE', ( 2.150000000000000355, 10.51264530356682236, 8.000000000000000000 ) ) ;
|
||||||
|
#462 = CIRCLE ( 'NONE', #294, 2.149999999999657518 ) ;
|
||||||
|
#463 = EDGE_CURVE ( 'NONE', #616, #554, #159, .T. ) ;
|
||||||
|
#464 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#465 = VERTEX_POINT ( 'NONE', #52 ) ;
|
||||||
|
#466 = VERTEX_POINT ( 'NONE', #57 ) ;
|
||||||
|
#467 = CARTESIAN_POINT ( 'NONE', ( -12.54230484541280255, -7.487354696433185630, 0.000000000000000000 ) ) ;
|
||||||
|
#468 = CIRCLE ( 'NONE', #127, 19.00000000000000000 ) ;
|
||||||
|
#469 = ORIENTED_EDGE ( 'NONE', *, *, #635, .T. ) ;
|
||||||
|
#470 = ADVANCED_FACE ( 'NONE', ( #357 ), #19, .F. ) ;
|
||||||
|
#471 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#472 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 8.000000000000000000 ) ) ;
|
||||||
|
#473 = EDGE_CURVE ( 'NONE', #554, #616, #408, .T. ) ;
|
||||||
|
#474 = EDGE_CURVE ( 'NONE', #320, #44, #133, .T. ) ;
|
||||||
|
#475 = ORIENTED_EDGE ( 'NONE', *, *, #412, .T. ) ;
|
||||||
|
#476 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#477 = CYLINDRICAL_SURFACE ( 'NONE', #392, 2.150000000000000799 ) ;
|
||||||
|
#478 = EDGE_LOOP ( 'NONE', ( #235, #224, #145, #323 ) ) ;
|
||||||
|
#479 = ORIENTED_EDGE ( 'NONE', *, *, #343, .F. ) ;
|
||||||
|
#480 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#481 = ORIENTED_EDGE ( 'NONE', *, *, #265, .T. ) ;
|
||||||
|
#482 = SURFACE_STYLE_FILL_AREA ( #283 ) ;
|
||||||
|
#483 = ADVANCED_FACE ( 'NONE', ( #261, #308, #545, #61, #257, #449, #5, #206 ), #104, .F. ) ;
|
||||||
|
#484 =( NAMED_UNIT ( * ) PLANE_ANGLE_UNIT ( ) SI_UNIT ( $, .RADIAN. ) );
|
||||||
|
#485 = CARTESIAN_POINT ( 'NONE', ( -10.39230484541326405, -7.487354696433185630, 8.000000000000000000 ) ) ;
|
||||||
|
#486 = CARTESIAN_POINT ( 'NONE', ( -19.00000000000000000, -1.487354696433179857, 8.000000000000000000 ) ) ;
|
||||||
|
#487 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#488 = CARTESIAN_POINT ( 'NONE', ( 8.242304845413448433, 4.512645303567090593, 8.000000000000000000 ) ) ;
|
||||||
|
#489 = CARTESIAN_POINT ( 'NONE', ( 8.242304845413610082, -7.487354696433178525, 8.000000000000000000 ) ) ;
|
||||||
|
#490 = ORIENTED_EDGE ( 'NONE', *, *, #281, .F. ) ;
|
||||||
|
#491 = VECTOR ( 'NONE', #464, 1000.000000000000000 ) ;
|
||||||
|
#492 =( NAMED_UNIT ( * ) PLANE_ANGLE_UNIT ( ) SI_UNIT ( $, .RADIAN. ) );
|
||||||
|
#493 = VECTOR ( 'NONE', #576, 1000.000000000000000 ) ;
|
||||||
|
#494 = AXIS2_PLACEMENT_3D ( 'NONE', #43, #286, #487 ) ;
|
||||||
|
#495 = LINE ( 'NONE', #459, #41 ) ;
|
||||||
|
#496 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#497 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#498 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#499 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#500 = CARTESIAN_POINT ( 'NONE', ( -12.54230484541302992, 4.512645303566650057, 8.000000000000000000 ) ) ;
|
||||||
|
#501 = PRESENTATION_LAYER_ASSIGNMENT ( '', '', ( #641 ) ) ;
|
||||||
|
#502 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#503 = CARTESIAN_POINT ( 'NONE', ( 10.39230484541326760, -7.487354696433178525, 0.000000000000000000 ) ) ;
|
||||||
|
#504 = ORIENTED_EDGE ( 'NONE', *, *, #265, .F. ) ;
|
||||||
|
#505 = ADVANCED_FACE ( 'NONE', ( #201 ), #111, .T. ) ;
|
||||||
|
#506 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#507 = CYLINDRICAL_SURFACE ( 'NONE', #93, 2.150000000000000799 ) ;
|
||||||
|
#508 = ORIENTED_EDGE ( 'NONE', *, *, #627, .T. ) ;
|
||||||
|
#509 = EDGE_LOOP ( 'NONE', ( #26, #423, #490, #170 ) ) ;
|
||||||
|
#510 = CYLINDRICAL_SURFACE ( 'NONE', #278, 2.149999999999435030 ) ;
|
||||||
|
#511 = ORIENTED_EDGE ( 'NONE', *, *, #582, .T. ) ;
|
||||||
|
#512 = ADVANCED_FACE ( 'NONE', ( #303 ), #410, .F. ) ;
|
||||||
|
#513 = ORIENTED_EDGE ( 'NONE', *, *, #105, .F. ) ;
|
||||||
|
#514 = CARTESIAN_POINT ( 'NONE', ( -10.39230484541326405, -7.487354696433185630, 0.000000000000000000 ) ) ;
|
||||||
|
#515 = EDGE_CURVE ( 'NONE', #137, #414, #358, .T. ) ;
|
||||||
|
#516 = CIRCLE ( 'NONE', #348, 2.149999999999435030 ) ;
|
||||||
|
#517 = CIRCLE ( 'NONE', #599, 2.149999999999539391 ) ;
|
||||||
|
#518 = EDGE_LOOP ( 'NONE', ( #110, #565 ) ) ;
|
||||||
|
#519 = ORIENTED_EDGE ( 'NONE', *, *, #9, .T. ) ;
|
||||||
|
#520 = ORIENTED_EDGE ( 'NONE', *, *, #353, .T. ) ;
|
||||||
|
#521 = CARTESIAN_POINT ( 'NONE', ( 10.39230484541326760, -7.487354696433178525, 0.000000000000000000 ) ) ;
|
||||||
|
#522 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#523 = ORIENTED_EDGE ( 'NONE', *, *, #515, .T. ) ;
|
||||||
|
#524 = ORIENTED_EDGE ( 'NONE', *, *, #474, .F. ) ;
|
||||||
|
#525 = CARTESIAN_POINT ( 'NONE', ( 10.39230484541344879, 4.512645303567090593, 8.000000000000000000 ) ) ;
|
||||||
|
#526 = AXIS2_PLACEMENT_3D ( 'NONE', #458, #498, #15 ) ;
|
||||||
|
#527 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#528 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#529 = EDGE_CURVE ( 'NONE', #387, #430, #300, .T. ) ;
|
||||||
|
#530 = CYLINDRICAL_SURFACE ( 'NONE', #444, 2.149999999999539391 ) ;
|
||||||
|
#531 = EDGE_CURVE ( 'NONE', #29, #432, #115, .T. ) ;
|
||||||
|
#532 = COLOUR_RGB ( '',0.7921568627450980005, 0.8196078431372548767, 0.9333333333333333481 ) ;
|
||||||
|
#533 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#534 = EDGE_CURVE ( 'NONE', #414, #88, #597, .T. ) ;
|
||||||
|
#535 = ORIENTED_EDGE ( 'NONE', *, *, #102, .T. ) ;
|
||||||
|
#536 = AXIS2_PLACEMENT_3D ( 'NONE', #411, #179, #76 ) ;
|
||||||
|
#537 =( LENGTH_UNIT ( ) NAMED_UNIT ( * ) SI_UNIT ( .MILLI., .METRE. ) );
|
||||||
|
#538 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#539 =( GEOMETRIC_REPRESENTATION_CONTEXT ( 3 ) GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT ( ( #143 ) ) GLOBAL_UNIT_ASSIGNED_CONTEXT ( ( #537, #492, #642 ) ) REPRESENTATION_CONTEXT ( 'NONE', 'WORKASPACE' ) );
|
||||||
|
#540 = UNCERTAINTY_MEASURE_WITH_UNIT (LENGTH_MEASURE( 1.000000000000000082E-05 ), #332, 'distance_accuracy_value', 'NONE');
|
||||||
|
#541 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 8.000000000000000000 ) ) ;
|
||||||
|
#542 = AXIS2_PLACEMENT_3D ( 'NONE', #8, #155, #60 ) ;
|
||||||
|
#543 = CARTESIAN_POINT ( 'NONE', ( -19.00000000000000000, -1.487354696433179857, 0.000000000000000000 ) ) ;
|
||||||
|
#544 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#545 = FACE_BOUND ( 'NONE', #130, .T. ) ;
|
||||||
|
#546 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#547 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 8.000000000000000000 ) ) ;
|
||||||
|
#548 = CARTESIAN_POINT ( 'NONE', ( 7.000000000000000000, -1.487354696433178969, 8.000000000000000000 ) ) ;
|
||||||
|
#549 = CARTESIAN_POINT ( 'NONE', ( 8.242304845413448433, 4.512645303567090593, 0.000000000000000000 ) ) ;
|
||||||
|
#550 = ORIENTED_EDGE ( 'NONE', *, *, #632, .F. ) ;
|
||||||
|
#551 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#552 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#553 = CIRCLE ( 'NONE', #82, 2.150000000000000799 ) ;
|
||||||
|
#554 = VERTEX_POINT ( 'NONE', #352 ) ;
|
||||||
|
#555 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#556 = CIRCLE ( 'NONE', #608, 19.00000000000000000 ) ;
|
||||||
|
#557 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#558 = ORIENTED_EDGE ( 'NONE', *, *, #593, .F. ) ;
|
||||||
|
#559 = FACE_OUTER_BOUND ( 'NONE', #587, .T. ) ;
|
||||||
|
#560 = EDGE_CURVE ( 'NONE', #83, #419, #468, .T. ) ;
|
||||||
|
#561 = ORIENTED_EDGE ( 'NONE', *, *, #241, .T. ) ;
|
||||||
|
#562 = EDGE_LOOP ( 'NONE', ( #172, #379 ) ) ;
|
||||||
|
#563 = EDGE_CURVE ( 'NONE', #88, #120, #25, .T. ) ;
|
||||||
|
#564 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#565 = ORIENTED_EDGE ( 'NONE', *, *, #529, .F. ) ;
|
||||||
|
#566 = ORIENTED_EDGE ( 'NONE', *, *, #393, .T. ) ;
|
||||||
|
#567 = ORIENTED_EDGE ( 'NONE', *, *, #421, .T. ) ;
|
||||||
|
#568 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#569 = CIRCLE ( 'NONE', #184, 2.150000000000000355 ) ;
|
||||||
|
#570 = CARTESIAN_POINT ( 'NONE', ( 10.39230484541344879, 4.512645303567090593, 0.000000000000000000 ) ) ;
|
||||||
|
#571 = EDGE_LOOP ( 'NONE', ( #193, #481 ) ) ;
|
||||||
|
#572 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#573 = VERTEX_POINT ( 'NONE', #543 ) ;
|
||||||
|
#574 = ORIENTED_EDGE ( 'NONE', *, *, #38, .T. ) ;
|
||||||
|
#575 = CIRCLE ( 'NONE', #542, 2.149999999999435030 ) ;
|
||||||
|
#576 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#577 = ADVANCED_FACE ( 'NONE', ( #589 ), #90, .T. ) ;
|
||||||
|
#578 = FILL_AREA_STYLE_COLOUR ( '', #532 ) ;
|
||||||
|
#579 = AXIS2_PLACEMENT_3D ( 'NONE', #336, #175, #136 ) ;
|
||||||
|
#580 = AXIS2_PLACEMENT_3D ( 'NONE', #541, #289, #149 ) ;
|
||||||
|
#581 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#582 = EDGE_CURVE ( 'NONE', #414, #137, #384, .T. ) ;
|
||||||
|
#583 = EDGE_CURVE ( 'NONE', #417, #466, #341, .T. ) ;
|
||||||
|
#584 = ADVANCED_FACE ( 'NONE', ( #199 ), #3, .F. ) ;
|
||||||
|
#585 = CARTESIAN_POINT ( 'NONE', ( 2.149999999999436362, -13.48735469643318119, 8.000000000000000000 ) ) ;
|
||||||
|
#586 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#587 = EDGE_LOOP ( 'NONE', ( #598, #511, #176, #66 ) ) ;
|
||||||
|
#588 = CYLINDRICAL_SURFACE ( 'NONE', #164, 2.149999999999657518 ) ;
|
||||||
|
#589 = FACE_OUTER_BOUND ( 'NONE', #233, .T. ) ;
|
||||||
|
#590 = ORIENTED_EDGE ( 'NONE', *, *, #102, .F. ) ;
|
||||||
|
#591 = APPLICATION_PROTOCOL_DEFINITION ( 'draft international standard', 'automotive_design', 1998, #49 ) ;
|
||||||
|
#592 = CARTESIAN_POINT ( 'NONE', ( -10.39230484541302957, 4.512645303566650057, 8.000000000000000000 ) ) ;
|
||||||
|
#593 = EDGE_CURVE ( 'NONE', #17, #53, #242, .T. ) ;
|
||||||
|
#594 = CARTESIAN_POINT ( 'NONE', ( 12.54230484541344914, 4.512645303567090593, 8.000000000000000000 ) ) ;
|
||||||
|
#595 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 10.51264530356682236, 0.000000000000000000 ) ) ;
|
||||||
|
#596 = VECTOR ( 'NONE', #409, 1000.000000000000000 ) ;
|
||||||
|
#597 = LINE ( 'NONE', #461, #220 ) ;
|
||||||
|
#598 = ORIENTED_EDGE ( 'NONE', *, *, #534, .F. ) ;
|
||||||
|
#599 = AXIS2_PLACEMENT_3D ( 'NONE', #485, #188, #297 ) ;
|
||||||
|
#600 = CYLINDRICAL_SURFACE ( 'NONE', #455, 2.150000000000000799 ) ;
|
||||||
|
#601 = PRODUCT ( '\X2\8f6e6bc257ab7247\X0\', '\X2\8f6e6bc257ab7247\X0\', '', ( #146 ) ) ;
|
||||||
|
#602 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, -1.487354696433179857, 0.000000000000000000 ) ) ;
|
||||||
|
#603 = LINE ( 'NONE', #150, #491 ) ;
|
||||||
|
#604 = CIRCLE ( 'NONE', #214, 2.150000000000000799 ) ;
|
||||||
|
#605 = DIRECTION ( 'NONE', ( 0.000000000000000000, 0.000000000000000000, 1.000000000000000000 ) ) ;
|
||||||
|
#606 = CARTESIAN_POINT ( 'NONE', ( -10.39230484541302957, 4.512645303566650057, 8.000000000000000000 ) ) ;
|
||||||
|
#607 = EDGE_LOOP ( 'NONE', ( #92, #14 ) ) ;
|
||||||
|
#608 = AXIS2_PLACEMENT_3D ( 'NONE', #339, #40, #108 ) ;
|
||||||
|
#609 = LINE ( 'NONE', #267, #31 ) ;
|
||||||
|
#610 = EDGE_CURVE ( 'NONE', #12, #22, #45, .T. ) ;
|
||||||
|
#611 = ORIENTED_EDGE ( 'NONE', *, *, #236, .F. ) ;
|
||||||
|
#612 = ORIENTED_EDGE ( 'NONE', *, *, #463, .T. ) ;
|
||||||
|
#613 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#614 = VERTEX_POINT ( 'NONE', #39 ) ;
|
||||||
|
#615 = ORIENTED_EDGE ( 'NONE', *, *, #190, .T. ) ;
|
||||||
|
#616 = VERTEX_POINT ( 'NONE', #489 ) ;
|
||||||
|
#617 = CARTESIAN_POINT ( 'NONE', ( 0.000000000000000000, 10.51264530356682236, 8.000000000000000000 ) ) ;
|
||||||
|
#618 = LINE ( 'NONE', #624, #34 ) ;
|
||||||
|
#619 = AXIS2_PLACEMENT_3D ( 'NONE', #382, #528, #630 ) ;
|
||||||
|
#620 = VERTEX_POINT ( 'NONE', #141 ) ;
|
||||||
|
#621 = ORIENTED_EDGE ( 'NONE', *, *, #351, .F. ) ;
|
||||||
|
#622 = CYLINDRICAL_SURFACE ( 'NONE', #230, 2.150000000000000355 ) ;
|
||||||
|
#623 = CIRCLE ( 'NONE', #536, 2.150000000000000799 ) ;
|
||||||
|
#624 = CARTESIAN_POINT ( 'NONE', ( 7.000000000000000000, -1.487354696433178969, 8.000000000000000000 ) ) ;
|
||||||
|
#625 = EDGE_LOOP ( 'NONE', ( #520, #292 ) ) ;
|
||||||
|
#626 = EDGE_LOOP ( 'NONE', ( #337, #166, #70, #36 ) ) ;
|
||||||
|
#627 = EDGE_CURVE ( 'NONE', #259, #429, #435, .T. ) ;
|
||||||
|
#628 = FACE_OUTER_BOUND ( 'NONE', #571, .T. ) ;
|
||||||
|
#629 = EDGE_LOOP ( 'NONE', ( #612, #227, #32, #457 ) ) ;
|
||||||
|
#630 = DIRECTION ( 'NONE', ( 1.000000000000000000, 0.000000000000000000, -0.000000000000000000 ) ) ;
|
||||||
|
#631 = APPLICATION_CONTEXT ( 'automotive_design' ) ;
|
||||||
|
#632 = EDGE_CURVE ( 'NONE', #554, #195, #443, .T. ) ;
|
||||||
|
#633 = CARTESIAN_POINT ( 'NONE', ( -2.150000000000000355, 10.51264530356682236, 0.000000000000000000 ) ) ;
|
||||||
|
#634 = AXIS2_PLACEMENT_3D ( 'NONE', #173, #274, #229 ) ;
|
||||||
|
#635 = EDGE_CURVE ( 'NONE', #430, #387, #517, .T. ) ;
|
||||||
|
#636 = ORIENTED_EDGE ( 'NONE', *, *, #534, .T. ) ;
|
||||||
|
#637 = ORIENTED_EDGE ( 'NONE', *, *, #281, .T. ) ;
|
||||||
|
#638 = DIRECTION ( 'NONE', ( -0.000000000000000000, -0.000000000000000000, -1.000000000000000000 ) ) ;
|
||||||
|
#639 = DIRECTION ( 'NONE', ( -1.000000000000000000, 0.000000000000000000, 0.000000000000000000 ) ) ;
|
||||||
|
#640 = ORIENTED_EDGE ( 'NONE', *, *, #236, .T. ) ;
|
||||||
|
#641 = STYLED_ITEM ( 'NONE', ( #271 ), #156 ) ;
|
||||||
|
#642 =( NAMED_UNIT ( * ) SI_UNIT ( $, .STERADIAN. ) SOLID_ANGLE_UNIT ( ) );
|
||||||
|
#643 = CIRCLE ( 'NONE', #135, 7.000000000000000000 ) ;
|
||||||
|
ENDSEC;
|
||||||
|
END-ISO-10303-21;
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
|||||||
|
机械设计采用26版本sw设计,装配,以及urdf导出,为减少sw装配出现问题,采用单件装配小件各个关节装配体,转step关节文件,step各关节装配总装配体方案
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# 硬件
|
||||||
|
|
||||||
|
本目录用于保存 16DOF 轮足机器人的自研电路、接线图、BOM、传感器与计算平台说明。
|
||||||
|
|
||||||
|
第三方硬件资料不作为自研成果提交。
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# 嵌入式固件
|
||||||
|
|
||||||
|
本目录用于保存运行在 MCU 或其他嵌入式控制器上的固件源码和构建工程。
|
||||||
|
|
||||||
|
编译生成的 `.hex`、`.bin`、`.elf`、`.axf` 等文件不进入源码目录,可在需要时作为 Release 附件发布。
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# 软件
|
||||||
|
|
||||||
|
本目录用于整理 16DOF 轮足机器人的上层软件。
|
||||||
|
|
||||||
|
```text
|
||||||
|
05_software/
|
||||||
|
├─ train/ # 强化学习训练任务和配置
|
||||||
|
├─ sim/ # Sim2Sim 和独立仿真
|
||||||
|
├─ real/ # Sim2Real 与 ROS 2 真机部署
|
||||||
|
└─ tools/ # 导航、地图、诊断和转换工具
|
||||||
|
```
|
||||||
|
|
||||||
|
历史版本通过 Git Tag 保存,同一模块不使用 `old`、`final`、`v2` 等目录复制完整代码。
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# 媒体与测试结果
|
||||||
|
|
||||||
|
本目录用于保存 16DOF 轮足机器人的原创图片、演示视频索引、测试图表和比赛结果。
|
||||||
|
|
||||||
|
大体积视频和完整日志建议作为 Release 附件发布,仓库内保留压缩预览、图表和链接。
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# RC_WheelLeg
|
||||||
|
|
||||||
|
RC_WheelLeg 是山东华宇工学院 16DOF 串联轮足机器人项目。
|
||||||
|
|
||||||
|
当前 `16dof` 分支用于整理 16DOF 机械、强化学习训练、Sim2Sim、Sim2Real、ROS 2 部署和比赛版本。机械源文件与 STEP 交换文件已经完成首轮整理,其他模块将在确认权威来源后逐步导入。
|
||||||
|
|
||||||
|
## 平台概览
|
||||||
|
|
||||||
|
- 四条轮腿
|
||||||
|
- 每条腿 3 个腿部关节
|
||||||
|
- 4 个驱动轮
|
||||||
|
- 总计 16 个执行器
|
||||||
|
- 控制路线:强化学习训练、仿真验证和真机部署
|
||||||
|
|
||||||
|
## 目录结构
|
||||||
|
|
||||||
|
```text
|
||||||
|
RC_WheelLeg/
|
||||||
|
├─ 01_doc/ # 项目技术文档和使用说明
|
||||||
|
├─ 02_mechanical/ # CAD、STEP、URDF 和 MJCF
|
||||||
|
├─ 03_hardware/ # 自研电路、接线和硬件说明
|
||||||
|
├─ 04_firmware/ # MCU 或嵌入式控制器固件
|
||||||
|
├─ 05_software/ # 训练、仿真、部署和工具
|
||||||
|
├─ 06_assets/ # 图片、视频和测试结果
|
||||||
|
├─ .gitignore
|
||||||
|
└─ README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## 当前状态
|
||||||
|
|
||||||
|
- [x] 整理 SolidWorks 机械源文件
|
||||||
|
- [x] 整理整机与关节 STEP 文件
|
||||||
|
- [ ] 核对比赛机械与仿真模型参数
|
||||||
|
- [ ] 整理 URDF/MJCF 机器人描述
|
||||||
|
- [ ] 整理强化学习、Sim2Sim 和 Sim2Real
|
||||||
|
|
||||||
|
机械资料入口见 [`02_mechanical/README.md`](02_mechanical/README.md)。
|
||||||
|
|
||||||
|
## 版本管理
|
||||||
|
|
||||||
|
- `8dof` 分支和 `v0.1.0` Tag 保存第一代 8DOF 实机版本。
|
||||||
|
- `16dof` 分支承载第二代轮足平台的完整演进。
|
||||||
|
- 线性演进阶段使用 Commit、Tag 和 Release 保存,不复制 `old`、`final` 或 `v2` 目录。
|
||||||
|
- 只有需要长期并行维护的不兼容路线才建立独立分支。
|
||||||
@@ -1,143 +0,0 @@
|
|||||||
# catkin_ws
|
|
||||||
|
|
||||||
## 简介说明
|
|
||||||
16dof采用留形科技的odin1空间记忆模组作为视觉方案
|
|
||||||
采用的odin1固件版本为0.12.0
|
|
||||||
本目录按 ROS 2 工作空间组织,工作空间根目录为当前目录,源码目录为 `src/`。
|
|
||||||
固件下载链接:https://vvcazjv268.feishu.cn/file/AAsOba7nSoGj22xclcKcoadE
|
|
||||||
Odin1驱动0.11.0获取链接:https://github.com/manifoldsdk/odin_ros_driver.git
|
|
||||||
本目录仅仅附带
|
|
||||||
```text
|
|
||||||
catkin_ws/
|
|
||||||
├── src/ 空
|
|
||||||
├── runros.sh
|
|
||||||
├── readme.md 本文档
|
|
||||||
└── odin1的使用手册.md
|
|
||||||
```
|
|
||||||
所附带链接为留形科技官方下载链接
|
|
||||||
并默认已配置 官方 ROS 2 功能包:
|
|
||||||
|
|
||||||
- `src/odin_ros_driver`
|
|
||||||
以及参照官方教程完成系统规则写入
|
|
||||||
附带官方github链接:https://github.com/manifoldsdk/odin_ros_driver
|
|
||||||
|
|
||||||
- 注意 odin1需配套对应 **odin1固件版本**, **驱动版本** 以及 **mindcloud软件版本**,详情请查阅官方说明
|
|
||||||
|
|
||||||
## 目录结构
|
|
||||||
|
|
||||||
```text
|
|
||||||
catkin_ws/
|
|
||||||
├── src/
|
|
||||||
│ └── odin_ros_driver/
|
|
||||||
├── build/
|
|
||||||
├── install/
|
|
||||||
├── runros.sh
|
|
||||||
├── readme.md
|
|
||||||
└── log/
|
|
||||||
```
|
|
||||||
|
|
||||||
说明:
|
|
||||||
|
|
||||||
- `src/` 用于存放 ROS 2 功能包源码。
|
|
||||||
- `build/`、`install/`、`log/` 为 `colcon build` 后生成的工作空间产物。
|
|
||||||
|
|
||||||
## 扫图相关(需先完成control_command.yaml配置)
|
|
||||||
|
|
||||||
fire:~/catkin_ws/src/odin_ros_driver/config/control_command.yaml
|
|
||||||
```yaml
|
|
||||||
#存颜色
|
|
||||||
recorddata: 1 # 0: off; 1: on
|
|
||||||
#存地图
|
|
||||||
custom_map_mode: 1 # 0: Odometry mode 1: SLAM mode 2: Relocalization mode
|
|
||||||
```
|
|
||||||
|
|
||||||
### 运行odin
|
|
||||||
```bash
|
|
||||||
# 启动官方历程
|
|
||||||
./runros.sh
|
|
||||||
#新建终端 保存地图
|
|
||||||
cd ~/catkin_ws/src/odin_ros_driver/
|
|
||||||
./set_param.sh save_map 1
|
|
||||||
```
|
|
||||||
将生成的文件导入留形官方后处理软件mindcloud
|
|
||||||
下载地址:https://version.manifoldtech.cn/download/mcs
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 使用方法
|
|
||||||
|
|
||||||
1. 进入工作空间根目录:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd ~/catkin_ws
|
|
||||||
```
|
|
||||||
## 提供一个一键构建脚本runros.sh
|
|
||||||
```bash
|
|
||||||
#请先赋予可执行权限,此脚本可代替ros2空间构建命令
|
|
||||||
./runros.sh
|
|
||||||
```
|
|
||||||
2. 先加载 ROS 2 环境:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
source /opt/ros/<你的发行版>/setup.bash
|
|
||||||
```
|
|
||||||
|
|
||||||
3. 构建工作空间:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
colcon build
|
|
||||||
```
|
|
||||||
|
|
||||||
4. 加载工作空间环境:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
source /home/lcf/catkin_ws/install/setup.bash
|
|
||||||
```
|
|
||||||
|
|
||||||
5. 查看工作空间中的包:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
colcon list
|
|
||||||
```
|
|
||||||
|
|
||||||
6. 在当前终端加载环境:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
source ~/catkin_ws/runros.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
7. 一键启动默认 ROS 2 驱动:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
~/catkin_ws/runros.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
默认等价于:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
source ~/catkin_ws/install/setup.bash
|
|
||||||
ros2 launch odin_ros_driver odin1_ros2.launch.py
|
|
||||||
```
|
|
||||||
|
|
||||||
8. 如需只打开一个已加载环境的干净交互 bash:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
~/catkin_ws/runros.sh --shell
|
|
||||||
```
|
|
||||||
|
|
||||||
9. 直接通过脚本执行 `ros2` 或 `rviz2` 命令:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
~/catkin_ws/runros.sh ros2 topic list
|
|
||||||
~/catkin_ws/runros.sh rviz2 -d /home/lcf/catkin_ws/src/odin_ros_driver/config/odin_ros2.rviz
|
|
||||||
```
|
|
||||||
|
|
||||||
## 说明
|
|
||||||
|
|
||||||
- 当前根目录已经是 ROS 2 工作空间根目录,无需额外执行 `ros2 workspace create` 之类命令。
|
|
||||||
- 若构建失败,请先确认系统已安装 ROS 2、`colcon` 以及包依赖。
|
|
||||||
- `runros.sh` 会自动查找 `/opt/ros` 下可用的 ROS 2 发行版,并在存在 `install/setup.bash` 时自动叠加当前工作空间环境。
|
|
||||||
- `runros.sh` 会将 ROS 2 运行日志写入工作空间下的 `log/ros2/`,避免依赖用户主目录中的默认 `~/.ros/log`。
|
|
||||||
- 直接执行 `runros.sh` 且不带参数时,会默认执行 `ros2 launch odin_ros_driver odin1_ros2.launch.py`,用于一键启动驱动。
|
|
||||||
- 如需只进入 shell,请显式使用 `runros.sh --shell`;该模式会进入一个不读取用户 `~/.bashrc`/`~/.profile` 的干净交互 bash,避免用户 shell 初始化脚本覆盖或污染当前 ROS 环境。
|
|
||||||
- 直接执行 `runros.sh` 且带参数时,会在完成环境加载后直接执行该命令,适合一键启动 `ros2` 或 `rviz2`。
|
|
||||||
@@ -1,609 +0,0 @@
|
|||||||
# Odin1 的使用手册
|
|
||||||
|
|
||||||
## 1. 文档来源与适用范围
|
|
||||||
|
|
||||||
本文根据 Odin1 官方仓库内容整理,官方仓库克隆位置为:
|
|
||||||
|
|
||||||
- `/home/lcf/catkin_ws/ziliao/odin_ros_driver`
|
|
||||||
|
|
||||||
本手册重点面向你当前这台机器上的 **ROS2 使用方式**,并结合你当前工作空间实际路径整理为可直接操作的版本:
|
|
||||||
|
|
||||||
- 工作空间根目录:`/home/lcf/catkin_ws`
|
|
||||||
- 实际运行包目录:`/home/lcf/catkin_ws/src/odin_ros_driver`
|
|
||||||
- 官方参考仓库目录:`/home/lcf/catkin_ws/ziliao/odin_ros_driver`
|
|
||||||
|
|
||||||
## 2. Odin1 是什么
|
|
||||||
|
|
||||||
Odin1 官方 ROS 驱动 `odin_ros_driver` 是一个同时支持 ROS1 和 ROS2 的驱动包,核心用途包括:
|
|
||||||
|
|
||||||
- 连接 Odin1 设备并发布点云、IMU、RGB、里程计、TF 等数据
|
|
||||||
- 提供里程计模式、SLAM 建图模式、重定位模式
|
|
||||||
- 支持 RViz 可视化
|
|
||||||
- 支持在线调节 AE/AWB
|
|
||||||
- 支持地图保存与重定位
|
|
||||||
|
|
||||||
官方说明里明确推荐:
|
|
||||||
|
|
||||||
- ROS2 推荐使用 `Humble`
|
|
||||||
- Ubuntu 推荐使用 `22.04`
|
|
||||||
- 设备固件版本要求 `v0.11.11`
|
|
||||||
|
|
||||||
## 3. 官方仓库里与 ROS2 最相关的文件
|
|
||||||
|
|
||||||
- `README.md`
|
|
||||||
- 官方主说明,包含安装、运行、建图、常见问题
|
|
||||||
- `RELOCALIZATION_GUIDE.md`
|
|
||||||
- 重定位专门说明
|
|
||||||
- `config/control_command.yaml`
|
|
||||||
- 运行参数总配置,建图和重定位主要看这个文件
|
|
||||||
- `launch_ROS2/odin1_ros2.launch.py`
|
|
||||||
- ROS2 启动入口
|
|
||||||
- `script/build_ros2.sh`
|
|
||||||
- 官方 ROS2 构建脚本
|
|
||||||
- `set_param.sh`
|
|
||||||
- 用于在运行时发送参数命令,保存地图时会用到
|
|
||||||
|
|
||||||
## 4. ROS2 启动流程总结
|
|
||||||
|
|
||||||
官方 README 的 ROS2 逻辑本质上是两步:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
source /home/lcf/catkin_ws/install/setup.bash
|
|
||||||
ros2 launch odin_ros_driver odin1_ros2.launch.py
|
|
||||||
```
|
|
||||||
|
|
||||||
你当前环境里已经额外有一个一键脚本:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
/home/lcf/catkin_ws/runros.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
这条命令现在默认就等价于上面两条命令,所以日常使用时建议优先用它。
|
|
||||||
|
|
||||||
## 5. ROS2 启动时实际会拉起什么
|
|
||||||
|
|
||||||
根据官方 `launch_ROS2/odin1_ros2.launch.py`,启动时会拉起以下节点:
|
|
||||||
|
|
||||||
- `host_sdk_sample`
|
|
||||||
- 主驱动节点,负责设备连接、数据流和核心逻辑
|
|
||||||
- `pcd2depth_ros2_node`
|
|
||||||
- 深度图相关节点
|
|
||||||
- `cloud_reprojection_ros2_node`
|
|
||||||
- 点云投影相关节点
|
|
||||||
- `image_overlay_node`
|
|
||||||
- 图像叠加相关节点
|
|
||||||
- `rviz2`
|
|
||||||
- 默认会同时启动 RViz2,并加载 `config/odin_ros2.rviz`
|
|
||||||
|
|
||||||
所以官方 ROS2 launch 不是只起一个驱动进程,而是“驱动 + 辅助处理节点 + RViz2”的完整演示链路。
|
|
||||||
|
|
||||||
## 6. 先决条件
|
|
||||||
|
|
||||||
### 6.1 系统与依赖
|
|
||||||
|
|
||||||
官方建议:
|
|
||||||
|
|
||||||
- Ubuntu 22.04
|
|
||||||
- ROS2 Humble
|
|
||||||
- OpenCV 只保留一个版本
|
|
||||||
- 已安装 `yaml-cpp`、`libusb`、`Eigen3`、OpenSSL 等依赖
|
|
||||||
|
|
||||||
### 6.2 Udev 规则
|
|
||||||
|
|
||||||
官方要求添加 udev 规则,否则可能遇到 USB 访问权限问题:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo vim /etc/udev/rules.d/99-odin-usb.rules
|
|
||||||
```
|
|
||||||
|
|
||||||
写入:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
SUBSYSTEM=="usb", ATTR{idVendor}=="2207", ATTR{idProduct}=="0019", MODE="0666", GROUP="plugdev"
|
|
||||||
```
|
|
||||||
|
|
||||||
然后执行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo udevadm control --reload
|
|
||||||
sudo udevadm trigger
|
|
||||||
```
|
|
||||||
|
|
||||||
### 6.3 可能遇到的 USB 权限问题
|
|
||||||
|
|
||||||
如果启动时报:
|
|
||||||
|
|
||||||
- `LIBUSB_ERROR_ACCESS`
|
|
||||||
- `LIBUSB_ERROR_BUSY`
|
|
||||||
|
|
||||||
优先检查:
|
|
||||||
|
|
||||||
1. 是否已经添加 udev 规则
|
|
||||||
2. 当前用户是否在 `plugdev` 组
|
|
||||||
3. 是否有旧的 `host_sdk_sample` 进程还在占用设备
|
|
||||||
|
|
||||||
可用命令:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ps aux | grep host_sdk_sample
|
|
||||||
killall host_sdk_sample
|
|
||||||
```
|
|
||||||
|
|
||||||
## 7. 你当前环境下的推荐使用方式
|
|
||||||
|
|
||||||
### 7.1 一键启动
|
|
||||||
|
|
||||||
```bash
|
|
||||||
/home/lcf/catkin_ws/runros.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
该命令会自动:
|
|
||||||
|
|
||||||
1. 加载 `/opt/ros/humble/setup.bash`
|
|
||||||
2. 加载 `/home/lcf/catkin_ws/install/setup.bash`
|
|
||||||
3. 执行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ros2 launch odin_ros_driver odin1_ros2.launch.py
|
|
||||||
```
|
|
||||||
|
|
||||||
### 7.2 只加载环境
|
|
||||||
|
|
||||||
```bash
|
|
||||||
source /home/lcf/catkin_ws/runros.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
### 7.3 只开一个干净 shell
|
|
||||||
|
|
||||||
```bash
|
|
||||||
/home/lcf/catkin_ws/runros.sh --shell
|
|
||||||
```
|
|
||||||
|
|
||||||
## 8. Odin1 的三种工作模式
|
|
||||||
|
|
||||||
官方通过 `config/control_command.yaml` 中的 `custom_map_mode` 控制工作模式:
|
|
||||||
|
|
||||||
- `0`:里程计模式
|
|
||||||
- `1`:SLAM 建图模式
|
|
||||||
- `2`:重定位模式
|
|
||||||
|
|
||||||
### 8.1 里程计模式
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
custom_map_mode: 0
|
|
||||||
```
|
|
||||||
|
|
||||||
特点:
|
|
||||||
|
|
||||||
- `map` 和 `odom` 视为同一位姿
|
|
||||||
- 不进行回环建图
|
|
||||||
- 适合只看实时位姿和点云
|
|
||||||
|
|
||||||
如果里程计漂移,官方建议在运行过程中执行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /home/lcf/catkin_ws/src/odin_ros_driver
|
|
||||||
./set_param.sh algo_reset 1
|
|
||||||
```
|
|
||||||
|
|
||||||
### 8.2 SLAM 建图模式
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
custom_map_mode: 1
|
|
||||||
```
|
|
||||||
|
|
||||||
特点:
|
|
||||||
|
|
||||||
- 在里程计模式基础上增加回环检测和地图保存能力
|
|
||||||
- 启动后自动开始建图并缓存地图数据
|
|
||||||
- 地图不会自动保存,必须手动触发保存
|
|
||||||
|
|
||||||
### 8.3 重定位模式
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
custom_map_mode: 2
|
|
||||||
```
|
|
||||||
|
|
||||||
特点:
|
|
||||||
|
|
||||||
- 基于已有地图重新定位
|
|
||||||
- 必须指定地图文件路径
|
|
||||||
- 成功后会发布 `map -> odom` 的 TF
|
|
||||||
|
|
||||||
## 9. ROS2 下怎么建图
|
|
||||||
|
|
||||||
这是你最关心的部分,按下面流程做。
|
|
||||||
|
|
||||||
### 9.1 第一步:修改配置为建图模式
|
|
||||||
|
|
||||||
编辑实际运行中的配置文件:
|
|
||||||
|
|
||||||
- `/home/lcf/catkin_ws/src/odin_ros_driver/config/control_command.yaml`
|
|
||||||
|
|
||||||
至少确认这些字段:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
register_keys:
|
|
||||||
custom_map_mode: 1
|
|
||||||
relocalization_map_abs_path: ""
|
|
||||||
```
|
|
||||||
|
|
||||||
建议同时关注:
|
|
||||||
|
|
||||||
- `strict_usb3.0_check`
|
|
||||||
- 默认 `0`,允许非严格 USB3.0;但官方强调建图最好使用 USB3.0
|
|
||||||
- `senddtof`
|
|
||||||
- 点云开关
|
|
||||||
- `sendodom`
|
|
||||||
- 里程计开关
|
|
||||||
- `sendcloudslam`
|
|
||||||
- SLAM 点云开关
|
|
||||||
- `sendcloudrender`
|
|
||||||
- 渲染点云开关
|
|
||||||
- `showpath`
|
|
||||||
- 是否显示路径
|
|
||||||
|
|
||||||
如果你想更明显地看路径,可考虑:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
showpath: 1
|
|
||||||
```
|
|
||||||
|
|
||||||
### 9.2 第二步:启动驱动
|
|
||||||
|
|
||||||
推荐直接执行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
/home/lcf/catkin_ws/runros.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
或者手动执行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
source /home/lcf/catkin_ws/install/setup.bash
|
|
||||||
ros2 launch odin_ros_driver odin1_ros2.launch.py
|
|
||||||
```
|
|
||||||
|
|
||||||
### 9.3 第三步:移动设备开始建图
|
|
||||||
|
|
||||||
驱动启动后,Odin1 会自动开始建图并缓存地图数据。
|
|
||||||
|
|
||||||
建议操作方式:
|
|
||||||
|
|
||||||
- 使用 USB3.0 连接
|
|
||||||
- 启动后缓慢移动设备
|
|
||||||
- 尽量覆盖你希望建图的区域
|
|
||||||
- 尽量回到已走过区域,帮助回环闭合
|
|
||||||
- 场景中应有足够几何/纹理特征
|
|
||||||
|
|
||||||
### 9.4 第四步:保存地图
|
|
||||||
|
|
||||||
建图完成后,进入包目录:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /home/lcf/catkin_ws/src/odin_ros_driver
|
|
||||||
```
|
|
||||||
|
|
||||||
执行官方命令:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./set_param.sh save_map 1
|
|
||||||
```
|
|
||||||
|
|
||||||
`set_param.sh` 的本质是向 `/tmp/odin_command.txt` 写入:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
set save_map 1
|
|
||||||
```
|
|
||||||
|
|
||||||
主驱动会读取这个命令并调用 SDK 保存地图。
|
|
||||||
|
|
||||||
### 9.5 第五步:找到保存出来的地图文件
|
|
||||||
|
|
||||||
配置文件里写明:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
mapping_result_dest_dir: ""
|
|
||||||
mapping_result_file_name: ""
|
|
||||||
```
|
|
||||||
|
|
||||||
如果这两个都为空,则官方默认保存到:
|
|
||||||
|
|
||||||
- `{ws}/src/odin_ros_driver/map/{driver_start_time}/`
|
|
||||||
|
|
||||||
结合你当前工作空间,默认可按下面路径去找:
|
|
||||||
|
|
||||||
- `/home/lcf/catkin_ws/src/odin_ros_driver/map/`
|
|
||||||
|
|
||||||
实际生成的地图文件通常是 `.bin` 文件。
|
|
||||||
|
|
||||||
### 9.6 第六步:重复保存
|
|
||||||
|
|
||||||
官方说明允许重复执行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./set_param.sh save_map 1
|
|
||||||
```
|
|
||||||
|
|
||||||
但两次保存之间建议至少间隔 **5 秒**。
|
|
||||||
|
|
||||||
## 10. 重定位怎么用
|
|
||||||
|
|
||||||
官方重定位文档单独给了更详细说明,这里按实用方式整理。
|
|
||||||
|
|
||||||
### 10.1 自动重定位
|
|
||||||
|
|
||||||
修改配置:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
register_keys:
|
|
||||||
custom_map_mode: 2
|
|
||||||
relocalization_map_abs_path: "/home/lcf/catkin_ws/src/odin_ros_driver/map/你的地图目录/xxx.bin"
|
|
||||||
custom_init_pos: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
|
|
||||||
```
|
|
||||||
|
|
||||||
推荐条件:
|
|
||||||
|
|
||||||
- 起始位置距离原始建图轨迹 1 米以内
|
|
||||||
- 起始朝向与建图时偏差不超过 ±10°
|
|
||||||
- 场景特征明显
|
|
||||||
|
|
||||||
启动后行为:
|
|
||||||
|
|
||||||
1. 尝试将当前观测和已有地图匹配
|
|
||||||
2. 成功后发布 `map -> odom` TF
|
|
||||||
3. 失败时进入后备模式并继续尝试
|
|
||||||
|
|
||||||
### 10.2 指定初始位姿重定位
|
|
||||||
|
|
||||||
如果你知道大概起点位置,可设置:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
register_keys:
|
|
||||||
custom_map_mode: 2
|
|
||||||
relocalization_map_abs_path: "/绝对路径/xxx.bin"
|
|
||||||
custom_init_pos: [x, y, z, qx, qy, qz, qw]
|
|
||||||
```
|
|
||||||
|
|
||||||
含义是:
|
|
||||||
|
|
||||||
- `x y z`:地图坐标系中的位置
|
|
||||||
- `qx qy qz qw`:四元数姿态
|
|
||||||
|
|
||||||
例如绕 Z 轴 90°:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
custom_init_pos: [5.2, -3.1, 0.0, 0.0, 0.0, 0.707, 0.707]
|
|
||||||
```
|
|
||||||
|
|
||||||
### 10.3 与官方文档的一个小冲突
|
|
||||||
|
|
||||||
官方主 README 的参数表里写过:
|
|
||||||
|
|
||||||
- `custom_init_pos`:currently unused
|
|
||||||
|
|
||||||
但官方单独的 `RELOCALIZATION_GUIDE.md` 已经把它作为重定位功能来详细说明,并给了示例,因此更应以重定位指南为准。
|
|
||||||
|
|
||||||
如果你实际测试发现 `custom_init_pos` 不生效,优先检查:
|
|
||||||
|
|
||||||
1. `custom_map_mode` 是否为 `2`
|
|
||||||
2. `custom_init_pos` 是否正好 7 个值
|
|
||||||
3. 四元数是否归一化
|
|
||||||
4. 地图文件路径是否为绝对路径
|
|
||||||
|
|
||||||
## 11. 建图与重定位的推荐操作套路
|
|
||||||
|
|
||||||
### 11.1 首次建图
|
|
||||||
|
|
||||||
1. 把 `custom_map_mode` 设为 `1`
|
|
||||||
2. 启动:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
/home/lcf/catkin_ws/runros.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
3. 缓慢移动 Odin1,采完整个区域
|
|
||||||
4. 返回包目录保存地图:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /home/lcf/catkin_ws/src/odin_ros_driver
|
|
||||||
./set_param.sh save_map 1
|
|
||||||
```
|
|
||||||
|
|
||||||
5. 到 `map/` 目录下找到 `.bin` 地图文件
|
|
||||||
|
|
||||||
### 11.2 下次基于已有地图定位
|
|
||||||
|
|
||||||
1. 把 `custom_map_mode` 改为 `2`
|
|
||||||
2. 把 `relocalization_map_abs_path` 指到上一步生成的 `.bin`
|
|
||||||
3. 若知道起点,补 `custom_init_pos`
|
|
||||||
4. 再执行:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
/home/lcf/catkin_ws/runros.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
## 12. 常用参数解释
|
|
||||||
|
|
||||||
以下参数来自官方 `control_command.yaml`,是 ROS2 下最常用的一批。
|
|
||||||
|
|
||||||
### 12.1 时间与同步
|
|
||||||
|
|
||||||
- `use_host_ros_time`
|
|
||||||
- `0`:使用设备时间,官方推荐
|
|
||||||
- `1`:收到数据时用主机 ROS 时间
|
|
||||||
- `2`:对齐到主机时间轴
|
|
||||||
|
|
||||||
建议:
|
|
||||||
|
|
||||||
- 一般先保持 `0`
|
|
||||||
|
|
||||||
### 12.2 传感器输出
|
|
||||||
|
|
||||||
- `sendimu`
|
|
||||||
- 是否发布 IMU
|
|
||||||
- `sendodom`
|
|
||||||
- 是否发布里程计
|
|
||||||
- `senddtof`
|
|
||||||
- 是否发布原始点云
|
|
||||||
- `sendcloudslam`
|
|
||||||
- 是否发布 SLAM 点云
|
|
||||||
- `sendcloudrender`
|
|
||||||
- 是否发布渲染后的点云
|
|
||||||
- `sendrgb`
|
|
||||||
- 是否发布 RGB 图像
|
|
||||||
- `sendrgbcompressed`
|
|
||||||
- 是否发布压缩 RGB 图像
|
|
||||||
|
|
||||||
### 12.3 点云质量相关
|
|
||||||
|
|
||||||
- `cloud_raw_confidence_threshold`
|
|
||||||
- 原始点云置信度阈值,官方示例是 `35`
|
|
||||||
- `dtof_fps`
|
|
||||||
- 官方注释给出 `100`、`145`、`290` 等档位
|
|
||||||
|
|
||||||
### 12.4 其他
|
|
||||||
|
|
||||||
- `recorddata`
|
|
||||||
- 是否录制官方私有格式数据,空间占用很大
|
|
||||||
- `devstatuslog`
|
|
||||||
- 是否记录设备状态日志
|
|
||||||
- `showpath`
|
|
||||||
- 是否显示路径
|
|
||||||
- `showcamerapose`
|
|
||||||
- 是否显示相机位姿
|
|
||||||
|
|
||||||
## 13. ROS2 下常用话题
|
|
||||||
|
|
||||||
官方 README 给出的常用话题包括:
|
|
||||||
|
|
||||||
- `/odin1/imu`
|
|
||||||
- `/odin1/image`
|
|
||||||
- `/odin1/image_undistort`
|
|
||||||
- `/odin1/image/compressed`
|
|
||||||
- `/odin1/cloud_raw`
|
|
||||||
- `/odin1/cloud_render`
|
|
||||||
- `/odin1/cloud_slam`
|
|
||||||
- `/odin1/odometry`
|
|
||||||
- `/odin1/odometry_high`
|
|
||||||
- `/odin1/path`
|
|
||||||
- `/tf`
|
|
||||||
- `/odin1/reprojected_image`
|
|
||||||
|
|
||||||
重定位成功后,`/tf` 中会出现 `map -> odom` 关系。
|
|
||||||
|
|
||||||
## 14. 在线调参能力
|
|
||||||
|
|
||||||
官方驱动提供四个 ROS2 服务,可在驱动运行时调整自动曝光和自动白平衡:
|
|
||||||
|
|
||||||
- `/odin1/get_ae`
|
|
||||||
- `/odin1/get_awb`
|
|
||||||
- `/odin1/set_ae`
|
|
||||||
- `/odin1/set_awb`
|
|
||||||
|
|
||||||
示例:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
source /home/lcf/catkin_ws/install/setup.bash
|
|
||||||
ros2 service call /odin1/get_ae odin_ros_driver/srv/GetAe
|
|
||||||
ros2 service call /odin1/get_awb odin_ros_driver/srv/GetAwb
|
|
||||||
ros2 service call /odin1/set_ae odin_ros_driver/srv/SetAe "{mode: 0}"
|
|
||||||
ros2 service call /odin1/set_awb odin_ros_driver/srv/SetAwb "{mode: 0}"
|
|
||||||
```
|
|
||||||
|
|
||||||
## 15. 常见问题总结
|
|
||||||
|
|
||||||
### 15.1 启动后设备很快断开
|
|
||||||
|
|
||||||
官方认为 ROS2 在复杂网络环境下容易因为广播导致阻塞,从而出现设备断开。
|
|
||||||
|
|
||||||
如果不需要跨设备通信,可先尝试:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
export ROS_LOCALHOST_ONLY=1
|
|
||||||
```
|
|
||||||
|
|
||||||
### 15.2 RViz 卡死或长时间无响应
|
|
||||||
|
|
||||||
官方建议先给 Odin1 重新上电。
|
|
||||||
|
|
||||||
### 15.3 重启设备后 RViz 出现 `TF_OLD_DATA`
|
|
||||||
|
|
||||||
官方说明这是时间戳冲突导致的,点击 RViz 底部 reset 按钮可清掉旧状态。
|
|
||||||
|
|
||||||
### 15.4 图像相关节点一启动就崩
|
|
||||||
|
|
||||||
官方提示这通常与系统里安装了多个 OpenCV 版本有关。
|
|
||||||
|
|
||||||
### 15.5 `Missing camera node 'cam_0'`
|
|
||||||
|
|
||||||
官方建议重新插拔 USB。
|
|
||||||
|
|
||||||
### 15.6 录 bag 时 IMU 或高频里程计丢帧
|
|
||||||
|
|
||||||
官方仓库提供了:
|
|
||||||
|
|
||||||
- `script/rosbag2_qos.yaml`
|
|
||||||
|
|
||||||
录制时建议:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ros2 bag record -a \
|
|
||||||
--qos-profile-overrides-path src/odin_ros_driver/script/rosbag2_qos.yaml \
|
|
||||||
-o my_bag
|
|
||||||
```
|
|
||||||
|
|
||||||
## 16. 你当前环境下的最简建图命令
|
|
||||||
|
|
||||||
### 16.1 建图前
|
|
||||||
|
|
||||||
编辑:
|
|
||||||
|
|
||||||
- `/home/lcf/catkin_ws/src/odin_ros_driver/config/control_command.yaml`
|
|
||||||
|
|
||||||
设置:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
custom_map_mode: 1
|
|
||||||
```
|
|
||||||
|
|
||||||
### 16.2 启动建图
|
|
||||||
|
|
||||||
```bash
|
|
||||||
/home/lcf/catkin_ws/runros.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
### 16.3 保存地图
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /home/lcf/catkin_ws/src/odin_ros_driver
|
|
||||||
./set_param.sh save_map 1
|
|
||||||
```
|
|
||||||
|
|
||||||
### 16.4 做重定位
|
|
||||||
|
|
||||||
编辑:
|
|
||||||
|
|
||||||
- `/home/lcf/catkin_ws/src/odin_ros_driver/config/control_command.yaml`
|
|
||||||
|
|
||||||
设置:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
custom_map_mode: 2
|
|
||||||
relocalization_map_abs_path: "/home/lcf/catkin_ws/src/odin_ros_driver/map/你的目录/你的地图.bin"
|
|
||||||
```
|
|
||||||
|
|
||||||
然后再次启动:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
/home/lcf/catkin_ws/runros.sh
|
|
||||||
```
|
|
||||||
|
|
||||||
## 17. 我对官方文档的实用化结论
|
|
||||||
|
|
||||||
如果只用一句话总结官方仓库的 ROS2 使用方式:
|
|
||||||
|
|
||||||
- **建图**:把 `custom_map_mode` 设为 `1`,启动驱动,移动设备采图,最后执行 `./set_param.sh save_map 1`
|
|
||||||
- **重定位**:把 `custom_map_mode` 设为 `2`,设置 `relocalization_map_abs_path` 指向 `.bin` 地图,再重新启动驱动
|
|
||||||
- **启动**:在你当前环境里,最省事的方式就是直接运行 `/home/lcf/catkin_ws/runros.sh`
|
|
||||||
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
2026-06-19 15:19:22 CST
|
|
||||||
- 初始化 `/home/lcf/catkin_ws2` 为 ROS 2 工作空间根目录。
|
|
||||||
- 确认根目录已存在 `src/`,其中包含 ROS 2 包 `src/odin_ros_driver`。
|
|
||||||
- 新增工作空间根目录 `README.md`,补充目录结构、构建命令与环境加载说明。
|
|
||||||
- 新增工作空间根目录 `.gitignore`,忽略 `build/`、`install/`、`log/` 目录。
|
|
||||||
- 检查本机环境,确认已安装 `colcon`,且存在 ROS 2 发行版 `/opt/ros/humble`。
|
|
||||||
- 使用 `source /opt/ros/humble/setup.bash && colcon list` 校验工作空间,已成功识别 `odin_ros_driver`。
|
|
||||||
2026-06-19 15:19:22 CST
|
|
||||||
- 新增工作空间根目录脚本 `runros.sh`,支持一键加载 ROS 2 基础环境与当前工作空间环境。
|
|
||||||
- `runros.sh` 同时支持 `source ./runros.sh` 和直接执行 `./runros.sh` 两种使用方式。
|
|
||||||
- 更新根目录 `README.md`,补充 `runros.sh` 的使用说明与行为说明。
|
|
||||||
2026-06-19 15:35:12 CST
|
|
||||||
- 为 `runros.sh` 增加调试日志落盘,记录脚本调用方式、ROS 环境加载结果、工作空间覆盖层加载结果与 shell 交接链路。
|
|
||||||
- 修复 `runros.sh` 直接执行时拉起交互 shell 会读取用户 `~/.bashrc` 的问题,改为启动不读取用户 rc 文件的干净交互 bash。
|
|
||||||
- 扩展 `runros.sh`,支持直接执行传入命令,例如 `ros2`、`rviz2`,以便一键在已加载环境中启动目标程序。
|
|
||||||
- 修正用户 `~/.bashrc` 中会自我追加 `source` 语句的错误配置,并将重复加载工作空间环境的逻辑收敛为一次且带存在性判断。
|
|
||||||
- 更新根目录 `README.md`,修正工作空间路径为 `/home/lcf/catkin_ws`,并补充直接执行 `ros2`/`rviz2` 的示例。
|
|
||||||
2026-06-19 15:52:00 CST
|
|
||||||
- 调整 `runros.sh` 默认行为:直接执行脚本时不再进入交互 shell,而是默认执行 `ros2 launch odin_ros_driver odin1_ros2.launch.py`,满足一键启动需求。
|
|
||||||
- 为 `runros.sh` 新增 `--shell` 和 `--help` 入口,分别用于显式打开干净交互 shell 与查看脚本使用说明。
|
|
||||||
- 更新根目录 `README.md`,补充 `runros.sh` 默认一键启动、`--shell` 模式及其与 `source install/setup.bash + ros2 launch` 的对应关系。
|
|
||||||
- 为 `runros.sh` 新增工作空间内 `ROS_LOG_DIR` 设置,将 ROS 2 运行日志固定写入 `/home/lcf/catkin_ws/log/ros2`,避免依赖用户主目录默认日志目录导致的一键启动失败。
|
|
||||||
2026-06-19 16:15:56 CST
|
|
||||||
- 阅读 `/home/lcf/catkin_ws/ziliao/odin_ros_driver` 中的 Odin1 官方仓库资料,重点整理 ROS2 相关的 README、重定位指南、启动文件、配置文件和运行时命令接口。
|
|
||||||
- 新增根目录说明文档 `/home/lcf/catkin_ws/odin1的使用手册.md`,总结 Odin1 在当前工作空间下的 ROS2 启动、建图、保存地图、重定位、常用参数、话题与常见问题。
|
|
||||||
@@ -1,359 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
WORKSPACE_ROOT="${SCRIPT_DIR}"
|
|
||||||
DEBUG_LOG_FILE="${WORKSPACE_ROOT}/trae-debug-log-runros-shell-loop.ndjson"
|
|
||||||
ROS_LOG_ROOT="${WORKSPACE_ROOT}/log/ros2"
|
|
||||||
DEFAULT_LAUNCH_PACKAGE="odin_ros_driver"
|
|
||||||
DEFAULT_LAUNCH_FILE="odin1_ros2.launch.py"
|
|
||||||
|
|
||||||
# Function: print_info
|
|
||||||
# Input:
|
|
||||||
# - $1: message text.
|
|
||||||
# Output:
|
|
||||||
# - Prints an informational message to stdout.
|
|
||||||
# Description:
|
|
||||||
# - Standardizes normal runtime messages for this script.
|
|
||||||
# References:
|
|
||||||
# - None.
|
|
||||||
print_info() {
|
|
||||||
echo "[INFO] $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function: print_warn
|
|
||||||
# Input:
|
|
||||||
# - $1: warning text.
|
|
||||||
# Output:
|
|
||||||
# - Prints a warning message to stdout.
|
|
||||||
# Description:
|
|
||||||
# - Standardizes warning messages for this script.
|
|
||||||
# References:
|
|
||||||
# - None.
|
|
||||||
print_warn() {
|
|
||||||
echo "[WARN] $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function: print_error
|
|
||||||
# Input:
|
|
||||||
# - $1: error text.
|
|
||||||
# Output:
|
|
||||||
# - Prints an error message to stderr.
|
|
||||||
# Description:
|
|
||||||
# - Standardizes error messages for this script.
|
|
||||||
# References:
|
|
||||||
# - None.
|
|
||||||
print_error() {
|
|
||||||
echo "[ERROR] $1" >&2
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function: write_debug_log
|
|
||||||
# Input:
|
|
||||||
# - $1: event name.
|
|
||||||
# - $2: event detail text.
|
|
||||||
# Output:
|
|
||||||
# - Appends one NDJSON debug record to the local debug log file.
|
|
||||||
# Description:
|
|
||||||
# - Records runtime evidence for script invocation mode, environment loading,
|
|
||||||
# and interactive shell handoff without changing business behavior.
|
|
||||||
# References:
|
|
||||||
# - Uses variables `DEBUG_LOG_FILE`, `WORKSPACE_ROOT`, and `ROS_DISTRO`
|
|
||||||
# defined in this file.
|
|
||||||
# - Called by `load_ros2_environment()`, `load_workspace_environment()`,
|
|
||||||
# `start_interactive_shell()`, and `main()` in this file.
|
|
||||||
write_debug_log() {
|
|
||||||
local event_name="$1"
|
|
||||||
local event_detail="$2"
|
|
||||||
local invoke_mode="executed"
|
|
||||||
|
|
||||||
if is_script_sourced; then
|
|
||||||
invoke_mode="sourced"
|
|
||||||
fi
|
|
||||||
|
|
||||||
printf '{"ts":"%s","event":"%s","detail":"%s","pid":"%s","ppid":"%s","mode":"%s","shell":"%s","workspace":"%s","ros_distro":"%s"}\n' \
|
|
||||||
"$(date '+%Y-%m-%dT%H:%M:%S%z')" \
|
|
||||||
"${event_name}" \
|
|
||||||
"${event_detail}" \
|
|
||||||
"$$" \
|
|
||||||
"$PPID" \
|
|
||||||
"${invoke_mode}" \
|
|
||||||
"${SHELL:-/bin/bash}" \
|
|
||||||
"${WORKSPACE_ROOT}" \
|
|
||||||
"${ROS_DISTRO:-unset}" >> "${DEBUG_LOG_FILE}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function: is_script_sourced
|
|
||||||
# Input:
|
|
||||||
# - None.
|
|
||||||
# Output:
|
|
||||||
# - Returns 0 when the script is sourced.
|
|
||||||
# - Returns 1 when the script is executed directly.
|
|
||||||
# Description:
|
|
||||||
# - Detects whether the current script is loaded into the caller shell or
|
|
||||||
# started as a standalone process.
|
|
||||||
# References:
|
|
||||||
# - Uses bash built-in variables `${BASH_SOURCE[0]}` and `${0}`.
|
|
||||||
is_script_sourced() {
|
|
||||||
[[ "${BASH_SOURCE[0]}" != "${0}" ]]
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function: find_ros2_setup
|
|
||||||
# Input:
|
|
||||||
# - None.
|
|
||||||
# Output:
|
|
||||||
# - Prints the absolute path of the detected ROS 2 `setup.bash`.
|
|
||||||
# - Returns 1 if no ROS 2 installation is found.
|
|
||||||
# Description:
|
|
||||||
# - Prefers the current `ROS_DISTRO` when available, otherwise probes common
|
|
||||||
# ROS 2 distributions from newer to older.
|
|
||||||
# References:
|
|
||||||
# - Uses environment variable `ROS_DISTRO`.
|
|
||||||
# - Searches under `/opt/ros/<distro>/setup.bash`.
|
|
||||||
find_ros2_setup() {
|
|
||||||
local ros2_setup=""
|
|
||||||
local distros=("jazzy" "iron" "humble" "galactic" "foxy" "rolling")
|
|
||||||
local distro=""
|
|
||||||
|
|
||||||
if [ -n "${ROS_DISTRO}" ] && [ -f "/opt/ros/${ROS_DISTRO}/setup.bash" ]; then
|
|
||||||
echo "/opt/ros/${ROS_DISTRO}/setup.bash"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
for distro in "${distros[@]}"; do
|
|
||||||
if [ -f "/opt/ros/${distro}/setup.bash" ]; then
|
|
||||||
ros2_setup="/opt/ros/${distro}/setup.bash"
|
|
||||||
echo "${ros2_setup}"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function: load_ros2_environment
|
|
||||||
# Input:
|
|
||||||
# - None.
|
|
||||||
# Output:
|
|
||||||
# - Returns 0 when the ROS 2 environment is sourced successfully.
|
|
||||||
# - Returns 1 when no valid ROS 2 environment is found.
|
|
||||||
# Description:
|
|
||||||
# - Locates and loads the base ROS 2 environment required by the workspace.
|
|
||||||
# References:
|
|
||||||
# - Calls `find_ros2_setup()` in this file.
|
|
||||||
# - Sources `/opt/ros/<distro>/setup.bash`.
|
|
||||||
load_ros2_environment() {
|
|
||||||
local ros2_setup=""
|
|
||||||
|
|
||||||
ros2_setup="$(find_ros2_setup)" || {
|
|
||||||
write_debug_log "load_ros2_environment_failed" "no_ros2_setup_found"
|
|
||||||
print_error "No ROS 2 installation was found under /opt/ros."
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# shellcheck disable=SC1090
|
|
||||||
source "${ros2_setup}"
|
|
||||||
write_debug_log "load_ros2_environment" "${ros2_setup}"
|
|
||||||
print_info "Loaded ROS 2 environment: ${ros2_setup}"
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function: load_workspace_environment
|
|
||||||
# Input:
|
|
||||||
# - None.
|
|
||||||
# Output:
|
|
||||||
# - Returns 0 after attempting to load the workspace environment.
|
|
||||||
# Description:
|
|
||||||
# - Loads the current workspace overlay when `install/setup.bash` exists.
|
|
||||||
# When the workspace has not been built yet, it keeps only the base ROS 2
|
|
||||||
# environment and prints the recommended next step.
|
|
||||||
# References:
|
|
||||||
# - Uses variable `WORKSPACE_ROOT` defined in this file.
|
|
||||||
# - Sources `${WORKSPACE_ROOT}/install/setup.bash`.
|
|
||||||
load_workspace_environment() {
|
|
||||||
local workspace_setup="${WORKSPACE_ROOT}/install/setup.bash"
|
|
||||||
|
|
||||||
cd "${WORKSPACE_ROOT}" || return 1
|
|
||||||
|
|
||||||
if [ -f "${workspace_setup}" ]; then
|
|
||||||
# shellcheck disable=SC1090
|
|
||||||
source "${workspace_setup}"
|
|
||||||
write_debug_log "load_workspace_environment" "${workspace_setup}"
|
|
||||||
print_info "Loaded workspace environment: ${workspace_setup}"
|
|
||||||
else
|
|
||||||
write_debug_log "load_workspace_environment_missing" "${workspace_setup}"
|
|
||||||
print_warn "Workspace overlay not found: ${workspace_setup}"
|
|
||||||
print_warn "Run 'colcon build' first if you need package overlays."
|
|
||||||
fi
|
|
||||||
|
|
||||||
export ROS_WORKSPACE="${WORKSPACE_ROOT}"
|
|
||||||
print_info "Workspace root: ${WORKSPACE_ROOT}"
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function: ensure_ros_log_directory
|
|
||||||
# Input:
|
|
||||||
# - None.
|
|
||||||
# Output:
|
|
||||||
# - Returns 0 when the ROS 2 log directory is ready for use.
|
|
||||||
# - Returns 1 when the log directory cannot be created.
|
|
||||||
# Description:
|
|
||||||
# - Ensures ROS 2 launch logs are written into the workspace-local log
|
|
||||||
# directory instead of relying on the user's home directory.
|
|
||||||
# References:
|
|
||||||
# - Uses variables `ROS_LOG_ROOT` and `WORKSPACE_ROOT` defined in this file.
|
|
||||||
# - Called by `main()` in this file.
|
|
||||||
ensure_ros_log_directory() {
|
|
||||||
mkdir -p "${ROS_LOG_ROOT}" || {
|
|
||||||
write_debug_log "ensure_ros_log_directory_failed" "${ROS_LOG_ROOT}"
|
|
||||||
print_error "Failed to create ROS log directory: ${ROS_LOG_ROOT}"
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
export ROS_LOG_DIR="${ROS_LOG_ROOT}"
|
|
||||||
write_debug_log "ensure_ros_log_directory" "${ROS_LOG_DIR}"
|
|
||||||
print_info "ROS log directory: ${ROS_LOG_DIR}"
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function: run_command_with_environment
|
|
||||||
# Input:
|
|
||||||
# - $@: command and arguments to execute.
|
|
||||||
# Output:
|
|
||||||
# - Replaces the current process with the provided command.
|
|
||||||
# Description:
|
|
||||||
# - Executes a user-specified command after the ROS 2 and workspace
|
|
||||||
# environment have been loaded successfully.
|
|
||||||
# References:
|
|
||||||
# - Called by `main()` in this file.
|
|
||||||
run_command_with_environment() {
|
|
||||||
write_debug_log "run_command_with_environment" "$*"
|
|
||||||
print_info "Running command with ROS 2 environment loaded: $*"
|
|
||||||
exec "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function: launch_default_ros2_stack
|
|
||||||
# Input:
|
|
||||||
# - None.
|
|
||||||
# Output:
|
|
||||||
# - Replaces the current process with the default ROS 2 launch command.
|
|
||||||
# Description:
|
|
||||||
# - Starts the default `odin_ros_driver` ROS 2 launch file after the
|
|
||||||
# workspace environment has been loaded successfully.
|
|
||||||
# References:
|
|
||||||
# - Uses variables `DEFAULT_LAUNCH_PACKAGE` and `DEFAULT_LAUNCH_FILE`
|
|
||||||
# defined in this file.
|
|
||||||
# - Calls `run_command_with_environment()` in this file.
|
|
||||||
launch_default_ros2_stack() {
|
|
||||||
write_debug_log "launch_default_ros2_stack" "${DEFAULT_LAUNCH_PACKAGE} ${DEFAULT_LAUNCH_FILE}"
|
|
||||||
print_info "Starting default ROS 2 launch: ${DEFAULT_LAUNCH_PACKAGE} ${DEFAULT_LAUNCH_FILE}"
|
|
||||||
run_command_with_environment ros2 launch "${DEFAULT_LAUNCH_PACKAGE}" "${DEFAULT_LAUNCH_FILE}"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function: start_interactive_shell
|
|
||||||
# Input:
|
|
||||||
# - None.
|
|
||||||
# Output:
|
|
||||||
# - Replaces the current process with a clean interactive bash shell.
|
|
||||||
# Description:
|
|
||||||
# - Keeps the loaded ROS 2 and workspace environment in a new interactive
|
|
||||||
# shell when the script is executed directly, while avoiding user shell
|
|
||||||
# rc files that may recursively modify configuration.
|
|
||||||
# References:
|
|
||||||
# - Uses `/bin/bash --noprofile --norc -i`.
|
|
||||||
start_interactive_shell() {
|
|
||||||
write_debug_log "start_interactive_shell" "exec_clean_interactive_bash"
|
|
||||||
print_info "Starting a clean interactive bash shell with ROS 2 environment loaded."
|
|
||||||
exec /bin/bash --noprofile --norc -i
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function: print_usage
|
|
||||||
# Input:
|
|
||||||
# - None.
|
|
||||||
# Output:
|
|
||||||
# - Prints the script usage text to stdout.
|
|
||||||
# Description:
|
|
||||||
# - Documents the default one-click launch behavior, the custom command mode,
|
|
||||||
# and the explicit shell mode for this script.
|
|
||||||
# References:
|
|
||||||
# - Uses variables `DEFAULT_LAUNCH_PACKAGE` and `DEFAULT_LAUNCH_FILE`
|
|
||||||
# defined in this file.
|
|
||||||
print_usage() {
|
|
||||||
cat <<EOF
|
|
||||||
Usage:
|
|
||||||
source ${WORKSPACE_ROOT}/runros.sh
|
|
||||||
${WORKSPACE_ROOT}/runros.sh
|
|
||||||
${WORKSPACE_ROOT}/runros.sh --shell
|
|
||||||
${WORKSPACE_ROOT}/runros.sh <command> [args...]
|
|
||||||
|
|
||||||
Behavior:
|
|
||||||
- source runros.sh
|
|
||||||
Load ROS 2 and workspace environment into the current shell.
|
|
||||||
- runros.sh
|
|
||||||
Launch: ros2 launch ${DEFAULT_LAUNCH_PACKAGE} ${DEFAULT_LAUNCH_FILE}
|
|
||||||
- runros.sh --shell
|
|
||||||
Open a clean interactive bash shell with the environment loaded.
|
|
||||||
- runros.sh <command> [args...]
|
|
||||||
Run the provided command with the environment loaded.
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
# Function: main
|
|
||||||
# Input:
|
|
||||||
# - None.
|
|
||||||
# Output:
|
|
||||||
# - Returns 0 on success.
|
|
||||||
# - Returns 1 when required environment loading fails.
|
|
||||||
# Description:
|
|
||||||
# - Coordinates ROS 2 base environment loading, workspace overlay loading,
|
|
||||||
# and chooses behavior for sourced vs executed usage.
|
|
||||||
# References:
|
|
||||||
# - Calls `is_script_sourced()` in this file.
|
|
||||||
# - Calls `load_ros2_environment()` in this file.
|
|
||||||
# - Calls `load_workspace_environment()` in this file.
|
|
||||||
# - Calls `ensure_ros_log_directory()` in this file.
|
|
||||||
# - Calls `launch_default_ros2_stack()` in this file.
|
|
||||||
# - Calls `run_command_with_environment()` in this file.
|
|
||||||
# - Calls `start_interactive_shell()` in this file.
|
|
||||||
# - Calls `print_usage()` in this file.
|
|
||||||
main() {
|
|
||||||
write_debug_log "main_enter" "argv:$*"
|
|
||||||
|
|
||||||
if ! is_script_sourced; then
|
|
||||||
case "$1" in
|
|
||||||
-h|--help)
|
|
||||||
print_usage
|
|
||||||
return 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
load_ros2_environment || return 1
|
|
||||||
load_workspace_environment || return 1
|
|
||||||
ensure_ros_log_directory || return 1
|
|
||||||
|
|
||||||
if is_script_sourced; then
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
write_debug_log "main_warn" "arguments_ignored_when_sourced"
|
|
||||||
print_warn "Arguments are ignored when the script is sourced."
|
|
||||||
fi
|
|
||||||
write_debug_log "main_exit" "current_shell_ready"
|
|
||||||
print_info "Environment is ready in the current shell."
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$#" -eq 0 ]; then
|
|
||||||
write_debug_log "main_handoff" "default_launch_requested"
|
|
||||||
launch_default_ros2_stack
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$1" = "--shell" ]; then
|
|
||||||
write_debug_log "main_handoff" "interactive_shell_requested"
|
|
||||||
start_interactive_shell
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$#" -gt 0 ]; then
|
|
||||||
write_debug_log "main_handoff" "command_execution_requested"
|
|
||||||
run_command_with_environment "$@"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
recorddata/
|
|
||||||
/config/calib.yaml
|
|
||||||
/log
|
|
||||||
/map
|
|
||||||
@@ -1,642 +0,0 @@
|
|||||||
# Relocalization Guide / 重定位使用指南
|
|
||||||
|
|
||||||
This guide explains how to use the relocalization feature in Odin ROS Driver, including automatic relocalization and init position relocalization modes.
|
|
||||||
|
|
||||||
本指南介绍如何使用 Odin ROS Driver 的重定位功能,包括自动重定位和指定初始位置重定位两种模式。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Table of Contents / 目录
|
|
||||||
|
|
||||||
1. [Overview / 概述](#overview--概述)
|
|
||||||
2. [Prerequisites / 前提条件](#prerequisites--前提条件)
|
|
||||||
3. [Mode 1: Auto Relocalization / 自动重定位](#mode-1-auto-relocalization--自动重定位)
|
|
||||||
4. [Mode 2: Init Position Relocalization / 指定初始位置重定位](#mode-2-init-position-relocalization--指定初始位置重定位)
|
|
||||||
5. [init_pos Format / init_pos 格式说明](#init_pos-format--init_pos-格式说明)
|
|
||||||
6. [Configuration Examples / 配置示例](#configuration-examples--配置示例)
|
|
||||||
7. [Programmatic API / 编程接口](#programmatic-api--编程接口)
|
|
||||||
8. [Troubleshooting / 故障排除](#troubleshooting--故障排除)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Overview / 概述
|
|
||||||
|
|
||||||
### English
|
|
||||||
|
|
||||||
Relocalization mode (`custom_map_mode: 2`) allows Odin to localize itself within a pre-built map. There are two approaches:
|
|
||||||
|
|
||||||
| Mode | Description | Use Case |
|
|
||||||
|------|-------------|----------|
|
|
||||||
| **Auto Relocalization** | Algorithm automatically searches for position in the map | Starting position is unknown or within recommended range |
|
|
||||||
| **Init Position Relocalization** | User provides an initial pose estimate via `init_pos` | Starting position is known, faster convergence needed |
|
|
||||||
|
|
||||||
### 中文
|
|
||||||
|
|
||||||
重定位模式(`custom_map_mode: 2`)允许 Odin 在预先构建的地图中进行自我定位。有两种方式:
|
|
||||||
|
|
||||||
| 模式 | 描述 | 适用场景 |
|
|
||||||
|------|------|----------|
|
|
||||||
| **自动重定位** | 算法自动在地图中搜索位置 | 起始位置未知,或在推荐范围内 |
|
|
||||||
| **指定初始位置重定位** | 用户通过 `init_pos` 提供初始位姿估计 | 起始位置已知,需要更快收敛 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Prerequisites / 前提条件
|
|
||||||
|
|
||||||
### English
|
|
||||||
|
|
||||||
1. **Pre-built map file**: A `.bin` map file created in SLAM mode (`custom_map_mode: 1`)
|
|
||||||
2. **Map file path**: Know the absolute path to your map file
|
|
||||||
3. **Starting position**: For init position mode, know the approximate starting pose in map coordinates
|
|
||||||
|
|
||||||
### 中文
|
|
||||||
|
|
||||||
1. **预构建的地图文件**:在 SLAM 模式(`custom_map_mode: 1`)下创建的 `.bin` 地图文件
|
|
||||||
2. **地图文件路径**:知道地图文件的绝对路径
|
|
||||||
3. **起始位置**:对于指定初始位置模式,需要知道在地图坐标系中的大致起始位姿
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Mode 1: Auto Relocalization / 自动重定位
|
|
||||||
|
|
||||||
### English
|
|
||||||
|
|
||||||
In auto relocalization mode, the algorithm automatically searches for the device's position within the map based on current sensor observations.
|
|
||||||
|
|
||||||
**Configuration** (`config/control_command.yaml`):
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
register_keys:
|
|
||||||
custom_map_mode: 2
|
|
||||||
relocalization_map_abs_path: "/path/to/your/map.bin"
|
|
||||||
# custom_init_pos is NOT set or uses default [0,0,0,0,0,0,1]
|
|
||||||
```
|
|
||||||
|
|
||||||
**Recommended Starting Conditions**:
|
|
||||||
- Within **1 meter** of a position on the original SLAM trajectory
|
|
||||||
- Within **±10 degrees** of the original orientation
|
|
||||||
- In a visually distinctive area of the map
|
|
||||||
|
|
||||||
**Behavior**:
|
|
||||||
1. On startup, Odin attempts to match current observations with the map
|
|
||||||
2. If successful, TF between `map` and `odom` frames is published
|
|
||||||
3. If unsuccessful, system operates in fallback SLAM mode (map saving disabled)
|
|
||||||
4. Relocalization attempts continue in background until successful
|
|
||||||
|
|
||||||
**Tips**:
|
|
||||||
- Gently shaking or moving the device after startup can improve relocalization accuracy
|
|
||||||
- Highly distinctive scenes may allow successful matching beyond the 1m/10° range
|
|
||||||
|
|
||||||
### 中文
|
|
||||||
|
|
||||||
在自动重定位模式下,算法根据当前传感器观测自动在地图中搜索设备位置。
|
|
||||||
|
|
||||||
**配置** (`config/control_command.yaml`):
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
register_keys:
|
|
||||||
custom_map_mode: 2
|
|
||||||
relocalization_map_abs_path: "/path/to/your/map.bin"
|
|
||||||
# custom_init_pos 不设置或使用默认值 [0,0,0,0,0,0,1]
|
|
||||||
```
|
|
||||||
|
|
||||||
**推荐起始条件**:
|
|
||||||
- 距离原始 SLAM 轨迹上某点 **1 米**以内
|
|
||||||
- 朝向与原始方向偏差在 **±10 度**以内
|
|
||||||
- 位于地图中视觉特征明显的区域
|
|
||||||
|
|
||||||
**行为**:
|
|
||||||
1. 启动时,Odin 尝试将当前观测与地图匹配
|
|
||||||
2. 如果成功,发布 `map` 和 `odom` 坐标系之间的 TF
|
|
||||||
3. 如果失败,系统进入后备 SLAM 模式(地图保存功能禁用)
|
|
||||||
4. 后台持续尝试重定位直到成功
|
|
||||||
|
|
||||||
**提示**:
|
|
||||||
- 启动后轻轻晃动或移动设备可以提高重定位精度
|
|
||||||
- 在特征明显的场景中,可能在超出 1m/10° 范围时也能成功匹配
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Mode 2: Init Position Relocalization / 指定初始位置重定位
|
|
||||||
|
|
||||||
### English
|
|
||||||
|
|
||||||
In init position relocalization mode, you provide an initial pose estimate to help the algorithm converge faster.
|
|
||||||
|
|
||||||
**Configuration** (`config/control_command.yaml`):
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
register_keys:
|
|
||||||
custom_map_mode: 2
|
|
||||||
relocalization_map_abs_path: "/path/to/your/map.bin"
|
|
||||||
custom_init_pos: [x, y, z, qx, qy, qz, qw]
|
|
||||||
```
|
|
||||||
|
|
||||||
**When to Use**:
|
|
||||||
- You know the approximate starting position (e.g., from external localization system)
|
|
||||||
- Starting position is far from the recommended 1m/10° range
|
|
||||||
- You need faster relocalization convergence
|
|
||||||
- Deploying in a fixed docking station with known pose
|
|
||||||
|
|
||||||
**Behavior**:
|
|
||||||
1. Algorithm uses provided `init_pos` as initial pose estimate
|
|
||||||
2. Searches for matches in the vicinity of the provided position
|
|
||||||
3. Faster convergence compared to auto mode when estimate is accurate
|
|
||||||
|
|
||||||
### 中文
|
|
||||||
|
|
||||||
在指定初始位置重定位模式下,您提供初始位姿估计以帮助算法更快收敛。
|
|
||||||
|
|
||||||
**配置** (`config/control_command.yaml`):
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
register_keys:
|
|
||||||
custom_map_mode: 2
|
|
||||||
relocalization_map_abs_path: "/path/to/your/map.bin"
|
|
||||||
custom_init_pos: [x, y, z, qx, qy, qz, qw]
|
|
||||||
```
|
|
||||||
|
|
||||||
**适用场景**:
|
|
||||||
- 您知道大致的起始位置(例如,来自外部定位系统)
|
|
||||||
- 起始位置远离推荐的 1m/10° 范围
|
|
||||||
- 需要更快的重定位收敛速度
|
|
||||||
- 部署在已知位姿的固定充电桩
|
|
||||||
|
|
||||||
**行为**:
|
|
||||||
1. 算法使用提供的 `init_pos` 作为初始位姿估计
|
|
||||||
2. 在提供位置的附近搜索匹配
|
|
||||||
3. 当估计准确时,比自动模式收敛更快
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## init_pos Format / init_pos 格式说明
|
|
||||||
|
|
||||||
### English
|
|
||||||
|
|
||||||
`init_pos` is an array of **7 float values** representing position and orientation:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
custom_init_pos: [x, y, z, qx, qy, qz, qw]
|
|
||||||
```
|
|
||||||
|
|
||||||
| Index | Parameter | Description | Unit |
|
|
||||||
|-------|-----------|-------------|------|
|
|
||||||
| 0 | x | X position in map frame | meters |
|
|
||||||
| 1 | y | Y position in map frame | meters |
|
|
||||||
| 2 | z | Z position in map frame | meters |
|
|
||||||
| 3 | qx | Quaternion X component | - |
|
|
||||||
| 4 | qy | Quaternion Y component | - |
|
|
||||||
| 5 | qz | Quaternion Z component | - |
|
|
||||||
| 6 | qw | Quaternion W component | - |
|
|
||||||
|
|
||||||
**Important Notes**:
|
|
||||||
- The quaternion must be normalized: `sqrt(qx² + qy² + qz² + qw²) ≈ 1.0`
|
|
||||||
- Coordinates are relative to the **map frame** (world frame at SLAM start)
|
|
||||||
- Default value `[0, 0, 0, 0, 0, 0, 1]` represents origin with no rotation
|
|
||||||
|
|
||||||
**Common Quaternion Values**:
|
|
||||||
|
|
||||||
| Orientation | qx | qy | qz | qw |
|
|
||||||
|-------------|----|----|----|----|
|
|
||||||
| No rotation (identity) | 0 | 0 | 0 | 1 |
|
|
||||||
| 90° around Z-axis | 0 | 0 | 0.707 | 0.707 |
|
|
||||||
| 180° around Z-axis | 0 | 0 | 1 | 0 |
|
|
||||||
| -90° around Z-axis | 0 | 0 | -0.707 | 0.707 |
|
|
||||||
|
|
||||||
### 中文
|
|
||||||
|
|
||||||
`init_pos` 是一个包含 **7 个 float 值**的数组,表示位置和朝向:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
custom_init_pos: [x, y, z, qx, qy, qz, qw]
|
|
||||||
```
|
|
||||||
|
|
||||||
| 索引 | 参数 | 描述 | 单位 |
|
|
||||||
|------|------|------|------|
|
|
||||||
| 0 | x | 地图坐标系中的 X 位置 | 米 |
|
|
||||||
| 1 | y | 地图坐标系中的 Y 位置 | 米 |
|
|
||||||
| 2 | z | 地图坐标系中的 Z 位置 | 米 |
|
|
||||||
| 3 | qx | 四元数 X 分量 | - |
|
|
||||||
| 4 | qy | 四元数 Y 分量 | - |
|
|
||||||
| 5 | qz | 四元数 Z 分量 | - |
|
|
||||||
| 6 | qw | 四元数 W 分量 | - |
|
|
||||||
|
|
||||||
**重要说明**:
|
|
||||||
- 四元数必须归一化:`sqrt(qx² + qy² + qz² + qw²) ≈ 1.0`
|
|
||||||
- 坐标相对于**地图坐标系**(SLAM 启动时的世界坐标系)
|
|
||||||
- 默认值 `[0, 0, 0, 0, 0, 0, 1]` 表示原点且无旋转
|
|
||||||
|
|
||||||
**常用四元数值**:
|
|
||||||
|
|
||||||
| 朝向 | qx | qy | qz | qw |
|
|
||||||
|------|----|----|----|----|
|
|
||||||
| 无旋转(单位四元数) | 0 | 0 | 0 | 1 |
|
|
||||||
| 绕 Z 轴旋转 90° | 0 | 0 | 0.707 | 0.707 |
|
|
||||||
| 绕 Z 轴旋转 180° | 0 | 0 | 1 | 0 |
|
|
||||||
| 绕 Z 轴旋转 -90° | 0 | 0 | -0.707 | 0.707 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Configuration Examples / 配置示例
|
|
||||||
|
|
||||||
### Example 1: Auto Relocalization / 自动重定位示例
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
register_keys:
|
|
||||||
custom_map_mode: 2
|
|
||||||
relocalization_map_abs_path: "/home/user/maps/office_map.bin"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example 2: Init Position at Origin / 在原点指定初始位置
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
register_keys:
|
|
||||||
custom_map_mode: 2
|
|
||||||
relocalization_map_abs_path: "/home/user/maps/office_map.bin"
|
|
||||||
custom_init_pos: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example 3: Init Position with Offset / 带偏移的初始位置
|
|
||||||
|
|
||||||
Position at (5.2, -3.1, 0) with 90° rotation around Z-axis:
|
|
||||||
|
|
||||||
位置在 (5.2, -3.1, 0),绕 Z 轴旋转 90°:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
register_keys:
|
|
||||||
custom_map_mode: 2
|
|
||||||
relocalization_map_abs_path: "/home/user/maps/warehouse_map.bin"
|
|
||||||
custom_init_pos: [5.2, -3.1, 0.0, 0.0, 0.0, 0.707, 0.707]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example 4: Docking Station Pose / 充电桩位置
|
|
||||||
|
|
||||||
Known docking station at (10.5, 2.3, 0) facing -X direction (180° rotation):
|
|
||||||
|
|
||||||
已知充电桩位置在 (10.5, 2.3, 0),朝向 -X 方向(旋转 180°):
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
register_keys:
|
|
||||||
custom_map_mode: 2
|
|
||||||
relocalization_map_abs_path: "/home/user/maps/factory_map.bin"
|
|
||||||
custom_init_pos: [10.5, 2.3, 0.0, 0.0, 0.0, 1.0, 0.0]
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Programmatic API / 编程接口
|
|
||||||
|
|
||||||
### English
|
|
||||||
|
|
||||||
You can also set `init_pos` programmatically using the `lidar_set_custom_parameter` API. This is useful for:
|
|
||||||
- Dynamic relocalization during runtime
|
|
||||||
- Integration with external localization systems
|
|
||||||
- Setting initial pose from robot's last known position
|
|
||||||
|
|
||||||
#### API Function
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include "lidar_api.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set a custom parameter on the device
|
|
||||||
* @param device Device handle obtained from lidar_open_device()
|
|
||||||
* @param param_name Parameter name (e.g., "init_pos")
|
|
||||||
* @param value_data Pointer to the parameter data
|
|
||||||
* @param value_length Size of the data in bytes
|
|
||||||
* @return 0 on success, -1 on error, -2 if file transfer in progress
|
|
||||||
*/
|
|
||||||
int lidar_set_custom_parameter(device_handle device,
|
|
||||||
const char* param_name,
|
|
||||||
const void* value_data,
|
|
||||||
size_t value_length);
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Complete Example
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include "lidar_api.h"
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cmath>
|
|
||||||
|
|
||||||
// Helper function to create quaternion from yaw angle (rotation around Z-axis)
|
|
||||||
void yaw_to_quaternion(float yaw_rad, float* qx, float* qy, float* qz, float* qw) {
|
|
||||||
*qx = 0.0f;
|
|
||||||
*qy = 0.0f;
|
|
||||||
*qz = sinf(yaw_rad / 2.0f);
|
|
||||||
*qw = cosf(yaw_rad / 2.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
int set_init_position(device_handle device,
|
|
||||||
float x, float y, float z,
|
|
||||||
float qx, float qy, float qz, float qw) {
|
|
||||||
// init_pos format: [x, y, z, qx, qy, qz, qw] - 7 floats
|
|
||||||
float init_pos[7] = {x, y, z, qx, qy, qz, qw};
|
|
||||||
|
|
||||||
int result = lidar_set_custom_parameter(
|
|
||||||
device,
|
|
||||||
"init_pos", // Parameter name
|
|
||||||
init_pos, // Data pointer
|
|
||||||
sizeof(init_pos) // 7 * sizeof(float) = 28 bytes
|
|
||||||
);
|
|
||||||
|
|
||||||
if (result == 0) {
|
|
||||||
printf("Successfully set init_pos: [%.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f]\n",
|
|
||||||
x, y, z, qx, qy, qz, qw);
|
|
||||||
} else {
|
|
||||||
printf("Failed to set init_pos, error code: %d\n", result);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Usage examples:
|
|
||||||
|
|
||||||
// Example 1: Set position at origin with no rotation
|
|
||||||
void example_origin(device_handle device) {
|
|
||||||
set_init_position(device,
|
|
||||||
0.0f, 0.0f, 0.0f, // x, y, z
|
|
||||||
0.0f, 0.0f, 0.0f, 1.0f // qx, qy, qz, qw (identity)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Example 2: Set position with 90° yaw rotation
|
|
||||||
void example_with_rotation(device_handle device) {
|
|
||||||
float qx, qy, qz, qw;
|
|
||||||
float yaw_degrees = 90.0f;
|
|
||||||
float yaw_rad = yaw_degrees * M_PI / 180.0f;
|
|
||||||
|
|
||||||
yaw_to_quaternion(yaw_rad, &qx, &qy, &qz, &qw);
|
|
||||||
|
|
||||||
set_init_position(device,
|
|
||||||
5.2f, -3.1f, 0.0f, // x, y, z
|
|
||||||
qx, qy, qz, qw // quaternion from yaw
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Example 3: Set position from external localization system
|
|
||||||
void example_from_external_localization(device_handle device,
|
|
||||||
double ext_x, double ext_y, double ext_yaw) {
|
|
||||||
float qx, qy, qz, qw;
|
|
||||||
yaw_to_quaternion((float)ext_yaw, &qx, &qy, &qz, &qw);
|
|
||||||
|
|
||||||
set_init_position(device,
|
|
||||||
(float)ext_x, (float)ext_y, 0.0f,
|
|
||||||
qx, qy, qz, qw
|
|
||||||
);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### ROS Integration Example
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include "lidar_api.h"
|
|
||||||
#include <geometry_msgs/PoseWithCovarianceStamped.h> // ROS1
|
|
||||||
// or
|
|
||||||
#include <geometry_msgs/msg/pose_with_covariance_stamped.hpp> // ROS2
|
|
||||||
|
|
||||||
// Callback for /initialpose topic (from RViz "2D Pose Estimate" tool)
|
|
||||||
void initialPoseCallback(const geometry_msgs::PoseWithCovarianceStamped::ConstPtr& msg,
|
|
||||||
device_handle device) {
|
|
||||||
float init_pos[7] = {
|
|
||||||
(float)msg->pose.pose.position.x,
|
|
||||||
(float)msg->pose.pose.position.y,
|
|
||||||
(float)msg->pose.pose.position.z,
|
|
||||||
(float)msg->pose.pose.orientation.x,
|
|
||||||
(float)msg->pose.pose.orientation.y,
|
|
||||||
(float)msg->pose.pose.orientation.z,
|
|
||||||
(float)msg->pose.pose.orientation.w
|
|
||||||
};
|
|
||||||
|
|
||||||
int result = lidar_set_custom_parameter(device, "init_pos", init_pos, sizeof(init_pos));
|
|
||||||
|
|
||||||
if (result == 0) {
|
|
||||||
ROS_INFO("Set init_pos from RViz: [%.2f, %.2f, %.2f]",
|
|
||||||
init_pos[0], init_pos[1], init_pos[2]);
|
|
||||||
} else {
|
|
||||||
ROS_ERROR("Failed to set init_pos: %d", result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Important Notes
|
|
||||||
|
|
||||||
1. **Call timing**: Set `init_pos` **before** starting the stream with `lidar_start_stream()`
|
|
||||||
2. **Map mode**: Ensure `custom_map_mode` is set to `2` (relocalization mode)
|
|
||||||
3. **Map file**: The relocalization map must be set via `lidar_set_relocalization_map()` or YAML config
|
|
||||||
4. **Thread safety**: `lidar_set_custom_parameter` is thread-safe but blocks until response received
|
|
||||||
|
|
||||||
### 中文
|
|
||||||
|
|
||||||
您也可以使用 `lidar_set_custom_parameter` API 以编程方式设置 `init_pos`。适用于:
|
|
||||||
- 运行时动态重定位
|
|
||||||
- 与外部定位系统集成
|
|
||||||
- 从机器人上次已知位置设置初始位姿
|
|
||||||
|
|
||||||
#### API 函数
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include "lidar_api.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 在设备上设置自定义参数
|
|
||||||
* @param device 从 lidar_open_device() 获取的设备句柄
|
|
||||||
* @param param_name 参数名称(如 "init_pos")
|
|
||||||
* @param value_data 指向参数数据的指针
|
|
||||||
* @param value_length 数据大小(字节)
|
|
||||||
* @return 成功返回 0,错误返回 -1,文件传输中返回 -2
|
|
||||||
*/
|
|
||||||
int lidar_set_custom_parameter(device_handle device,
|
|
||||||
const char* param_name,
|
|
||||||
const void* value_data,
|
|
||||||
size_t value_length);
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 完整示例
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include "lidar_api.h"
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cmath>
|
|
||||||
|
|
||||||
// 辅助函数:从偏航角(绕 Z 轴旋转)创建四元数
|
|
||||||
void yaw_to_quaternion(float yaw_rad, float* qx, float* qy, float* qz, float* qw) {
|
|
||||||
*qx = 0.0f;
|
|
||||||
*qy = 0.0f;
|
|
||||||
*qz = sinf(yaw_rad / 2.0f);
|
|
||||||
*qw = cosf(yaw_rad / 2.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
int set_init_position(device_handle device,
|
|
||||||
float x, float y, float z,
|
|
||||||
float qx, float qy, float qz, float qw) {
|
|
||||||
// init_pos 格式: [x, y, z, qx, qy, qz, qw] - 7 个 float
|
|
||||||
float init_pos[7] = {x, y, z, qx, qy, qz, qw};
|
|
||||||
|
|
||||||
int result = lidar_set_custom_parameter(
|
|
||||||
device,
|
|
||||||
"init_pos", // 参数名
|
|
||||||
init_pos, // 数据指针
|
|
||||||
sizeof(init_pos) // 7 * sizeof(float) = 28 字节
|
|
||||||
);
|
|
||||||
|
|
||||||
if (result == 0) {
|
|
||||||
printf("成功设置 init_pos: [%.3f, %.3f, %.3f, %.3f, %.3f, %.3f, %.3f]\n",
|
|
||||||
x, y, z, qx, qy, qz, qw);
|
|
||||||
} else {
|
|
||||||
printf("设置 init_pos 失败,错误码: %d\n", result);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 使用示例:
|
|
||||||
|
|
||||||
// 示例 1:在原点设置位置,无旋转
|
|
||||||
void example_origin(device_handle device) {
|
|
||||||
set_init_position(device,
|
|
||||||
0.0f, 0.0f, 0.0f, // x, y, z
|
|
||||||
0.0f, 0.0f, 0.0f, 1.0f // qx, qy, qz, qw(单位四元数)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 示例 2:设置带 90° 偏航旋转的位置
|
|
||||||
void example_with_rotation(device_handle device) {
|
|
||||||
float qx, qy, qz, qw;
|
|
||||||
float yaw_degrees = 90.0f;
|
|
||||||
float yaw_rad = yaw_degrees * M_PI / 180.0f;
|
|
||||||
|
|
||||||
yaw_to_quaternion(yaw_rad, &qx, &qy, &qz, &qw);
|
|
||||||
|
|
||||||
set_init_position(device,
|
|
||||||
5.2f, -3.1f, 0.0f, // x, y, z
|
|
||||||
qx, qy, qz, qw // 从偏航角计算的四元数
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 示例 3:从外部定位系统设置位置
|
|
||||||
void example_from_external_localization(device_handle device,
|
|
||||||
double ext_x, double ext_y, double ext_yaw) {
|
|
||||||
float qx, qy, qz, qw;
|
|
||||||
yaw_to_quaternion((float)ext_yaw, &qx, &qy, &qz, &qw);
|
|
||||||
|
|
||||||
set_init_position(device,
|
|
||||||
(float)ext_x, (float)ext_y, 0.0f,
|
|
||||||
qx, qy, qz, qw
|
|
||||||
);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### ROS 集成示例
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include "lidar_api.h"
|
|
||||||
#include <geometry_msgs/PoseWithCovarianceStamped.h> // ROS1
|
|
||||||
// 或
|
|
||||||
#include <geometry_msgs/msg/pose_with_covariance_stamped.hpp> // ROS2
|
|
||||||
|
|
||||||
// /initialpose 话题的回调函数(来自 RViz 的 "2D Pose Estimate" 工具)
|
|
||||||
void initialPoseCallback(const geometry_msgs::PoseWithCovarianceStamped::ConstPtr& msg,
|
|
||||||
device_handle device) {
|
|
||||||
float init_pos[7] = {
|
|
||||||
(float)msg->pose.pose.position.x,
|
|
||||||
(float)msg->pose.pose.position.y,
|
|
||||||
(float)msg->pose.pose.position.z,
|
|
||||||
(float)msg->pose.pose.orientation.x,
|
|
||||||
(float)msg->pose.pose.orientation.y,
|
|
||||||
(float)msg->pose.pose.orientation.z,
|
|
||||||
(float)msg->pose.pose.orientation.w
|
|
||||||
};
|
|
||||||
|
|
||||||
int result = lidar_set_custom_parameter(device, "init_pos", init_pos, sizeof(init_pos));
|
|
||||||
|
|
||||||
if (result == 0) {
|
|
||||||
ROS_INFO("从 RViz 设置 init_pos: [%.2f, %.2f, %.2f]",
|
|
||||||
init_pos[0], init_pos[1], init_pos[2]);
|
|
||||||
} else {
|
|
||||||
ROS_ERROR("设置 init_pos 失败: %d", result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 重要说明
|
|
||||||
|
|
||||||
1. **调用时机**:在调用 `lidar_start_stream()` 启动数据流**之前**设置 `init_pos`
|
|
||||||
2. **地图模式**:确保 `custom_map_mode` 设置为 `2`(重定位模式)
|
|
||||||
3. **地图文件**:必须通过 `lidar_set_relocalization_map()` 或 YAML 配置设置重定位地图
|
|
||||||
4. **线程安全**:`lidar_set_custom_parameter` 是线程安全的,但会阻塞直到收到响应
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Troubleshooting / 故障排除
|
|
||||||
|
|
||||||
### Relocalization Fails / 重定位失败
|
|
||||||
|
|
||||||
**English**:
|
|
||||||
- Ensure starting position is within recommended range (1m/10°)
|
|
||||||
- Check that the map file path is correct and file exists
|
|
||||||
- Verify the environment hasn't changed significantly since mapping
|
|
||||||
- Try gently moving the device to provide more observations
|
|
||||||
|
|
||||||
**中文**:
|
|
||||||
- 确保起始位置在推荐范围内(1m/10°)
|
|
||||||
- 检查地图文件路径是否正确且文件存在
|
|
||||||
- 验证环境自建图以来没有显著变化
|
|
||||||
- 尝试轻轻移动设备以提供更多观测
|
|
||||||
|
|
||||||
### init_pos Not Taking Effect / init_pos 未生效
|
|
||||||
|
|
||||||
**English**:
|
|
||||||
- Verify `custom_map_mode` is set to `2`
|
|
||||||
- Check that `custom_init_pos` has exactly 7 values
|
|
||||||
- Ensure quaternion is normalized (sum of squares ≈ 1)
|
|
||||||
- Restart the driver after modifying configuration
|
|
||||||
|
|
||||||
**中文**:
|
|
||||||
- 验证 `custom_map_mode` 设置为 `2`
|
|
||||||
- 检查 `custom_init_pos` 是否恰好有 7 个值
|
|
||||||
- 确保四元数已归一化(平方和 ≈ 1)
|
|
||||||
- 修改配置后重启驱动程序
|
|
||||||
|
|
||||||
### TF Not Published / TF 未发布
|
|
||||||
|
|
||||||
**English**:
|
|
||||||
- Relocalization may still be in progress
|
|
||||||
- Check ROS logs for relocalization status messages
|
|
||||||
- System operates in fallback mode until relocalization succeeds
|
|
||||||
|
|
||||||
**中文**:
|
|
||||||
- 重定位可能仍在进行中
|
|
||||||
- 检查 ROS 日志中的重定位状态消息
|
|
||||||
- 系统在重定位成功前以后备模式运行
|
|
||||||
|
|
||||||
### Map File Not Found / 地图文件未找到
|
|
||||||
|
|
||||||
**English**:
|
|
||||||
- Use absolute path (starting with `/`)
|
|
||||||
- Check file permissions
|
|
||||||
- Verify file extension is `.bin`
|
|
||||||
|
|
||||||
**中文**:
|
|
||||||
- 使用绝对路径(以 `/` 开头)
|
|
||||||
- 检查文件权限
|
|
||||||
- 验证文件扩展名为 `.bin`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Related Topics / 相关话题
|
|
||||||
|
|
||||||
| Topic | Description |
|
|
||||||
|-------|-------------|
|
|
||||||
| `/odin1/odometry` | Odometry in odom frame |
|
|
||||||
| `/odin1/odometry_highfreq` | High-frequency odometry |
|
|
||||||
| `/odin1/cloud_slam` | SLAM point cloud in odom frame |
|
|
||||||
| `/tf` | Transform tree (includes map→odom after successful relocalization) |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## See Also / 参见
|
|
||||||
|
|
||||||
- [README.md](README.md) - Main documentation
|
|
||||||
- [config/control_command.yaml](config/control_command.yaml) - Configuration file
|
|
||||||
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
# RC_WheelLeg / Odin1 ROS 工作区说明
|
|
||||||
|
|
||||||
本目录是一个 ROS 工作区归档,当前根目录为 `D:\桌面\catkin_ws`,主要内容位于子目录 `catkin_ws`。
|
|
||||||
|
|
||||||
## 目录内容
|
|
||||||
|
|
||||||
```text
|
|
||||||
D:\桌面\catkin_ws
|
|
||||||
└── catkin_ws
|
|
||||||
├── README.md
|
|
||||||
├── odin1的使用手册.md
|
|
||||||
├── project.log
|
|
||||||
├── runros.sh
|
|
||||||
└── src
|
|
||||||
└── odin_ros_driver
|
|
||||||
├── .gitignore
|
|
||||||
└── RELOCALIZATION_GUIDE.md
|
|
||||||
```
|
|
||||||
|
|
||||||
## 文件说明
|
|
||||||
|
|
||||||
- `catkin_ws/README.md`:原工作区说明文档,描述 Odin1 与 ROS 工作区的基本使用方式。
|
|
||||||
- `catkin_ws/odin1的使用手册.md`:Odin1 使用手册。
|
|
||||||
- `catkin_ws/project.log`:项目日志文件。
|
|
||||||
- `catkin_ws/runros.sh`:ROS 环境构建/运行相关脚本。
|
|
||||||
- `catkin_ws/src/odin_ros_driver/`:Odin ROS 驱动目录。该目录内部当前保留了独立 Git 仓库元数据,外层仓库仅记录其中当前可见的普通文件。
|
|
||||||
- `catkin_ws/src/odin_ros_driver/RELOCALIZATION_GUIDE.md`:重定位相关说明文档。
|
|
||||||
|
|
||||||
## 注意事项
|
|
||||||
|
|
||||||
- `catkin_ws/src/odin_ros_driver` 本身是一个独立 Git 仓库;在外层仓库提交时,应避免把其内部 `.git` 目录作为外层仓库内容提交。
|
|
||||||
- 当前归档按磁盘现有内容整理,未包含 ROS 构建产物目录,例如 `build/`、`install/`、`log/`。
|
|
||||||
- 如需完整恢复 `odin_ros_driver` 的驱动源码,应以其内部 Git 仓库或官方远程仓库状态为准。
|
|
||||||
Reference in New Issue
Block a user