| | import re |
| | from typing import Tuple |
| |
|
| | def parse_camera_params( |
| | text: str, |
| | mode: str = "base" |
| | ) -> Tuple[float, float, float]: |
| | """ |
| | Extract roll, pitch, fov from text using one of two patterns: |
| | - 'base' mode: ... are: roll, pitch, fov. |
| | - 'cot' mode: <answer>roll, pitch, fov</answer> |
| | |
| | Args: |
| | text: The full text to search. |
| | mode: One of {"base", "cot"}. |
| | |
| | Returns: |
| | roll, pitch, fov as floats. |
| | |
| | Raises: |
| | ValueError if the chosen pattern is not found, or mode is invalid. |
| | """ |
| | |
| | pat_base = re.compile( |
| | r"are:\s*([+-]?\d+(?:\.\d+)?)\s*,\s*" |
| | r"([+-]?\d+(?:\.\d+)?)\s*,\s*" |
| | r"([+-]?\d+(?:\.\d+)?)[\.\s]*$" |
| | ) |
| | pat_cot = re.compile( |
| | r"<answer>\s*([+-]?\d+(?:\.\d+)?)\s*,\s*" |
| | r"([+-]?\d+(?:\.\d+)?)\s*,\s*" |
| | r"([+-]?\d+(?:\.\d+)?)\s*</answer>" |
| | ) |
| |
|
| | m = None |
| | if mode == "base": |
| | m = pat_base.search(text) |
| | elif mode == "cot": |
| | m = pat_cot.search(text) |
| | else: |
| | raise ValueError(f"Invalid mode: {mode!r}. Choose 'base', 'cot', or 'auto'.") |
| |
|
| | if not m: |
| | raise ValueError(f"No camera parameters found using mode '{mode}'.") |
| |
|
| | roll_s, pitch_s, fov_s = m.group(1), m.group(2), m.group(3) |
| | return float(roll_s), float(pitch_s), float(fov_s) |