Initial commit

This commit is contained in:
Junhan Chang
2025-04-17 15:19:47 +08:00
parent a47a3f5c3a
commit c78ac482d8
262 changed files with 39871 additions and 0 deletions

View File

View File

@@ -0,0 +1,55 @@
import os
import inspect
from pydantic import BaseModel, Field
from typing import get_type_hints
# 定义你要解析的 pydantic 模型所在的 Python 文件
MODULES = ['my_pydantic_models'] # 替换为你的 Python 模块名
ROS_MSG_DIR = 'msg' # 消息文件生成目录
def map_python_type_to_ros(python_type):
type_map = {
int: 'int32',
float: 'float64',
str: 'string',
bool: 'bool',
list: '[]', # List in Pydantic should be handled separately
}
return type_map.get(python_type, None)
def generate_ros_msg_from_pydantic(model):
fields = get_type_hints(model)
ros_msg_lines = []
for field_name, field_type in fields.items():
ros_type = map_python_type_to_ros(field_type)
if not ros_type:
raise TypeError(f"Unsupported type {field_type} for field {field_name}")
ros_msg_lines.append(f"{ros_type} {field_name}\n")
return ''.join(ros_msg_lines)
def save_ros_msg_file(model_name, ros_msg_definition):
msg_file_path = os.path.join(ROS_MSG_DIR, f'{model_name}.msg')
os.makedirs(ROS_MSG_DIR, exist_ok=True)
with open(msg_file_path, 'w') as msg_file:
msg_file.write(ros_msg_definition)
def main():
for module_name in MODULES:
module = __import__(module_name)
for name, obj in inspect.getmembers(module):
if inspect.isclass(obj) and issubclass(obj, BaseModel) and obj != BaseModel:
print(f"Generating ROS message for Pydantic model: {name}")
ros_msg_definition = generate_ros_msg_from_pydantic(obj)
save_ros_msg_file(name, ros_msg_definition)
if __name__ == '__main__':
main()