webstudio/docs/example.md
2024-08-16 13:36:23 +00:00

6.6 KiB
Raw Blame History

Пример: проект "Шахматы"

Имеем доску, две модели фигур - коня и пешку, робота, камеру. Задачей будет из фигур в наличии расставить шахматы на доску в начальную позицию.

Создаём проект

* Projects
{
  "sid": 1,
  "name": "chess",
  "description": "Robossembler Example"
}

Добавляем модели твёрдых тел (фигур и доски) в библиотеку проекта

Сначала добавляются пакеты:

* Packages
{
  "sid": 1,
  "project": 1,
  "type": "part_model",
  "description": "Robossembler: chessboard",
  "command": "python",
  "package": "",
  "executable": "chessboard.py",
  "args": {
    "blend": \${FILE:string:""},
    "dae": \${FILE:string:""},rbs_arm/robot1/controller
    "fbx": \${FILE:string:""},
    "...": ""
  }
}
{
  "sid": 2,
  "project": 1,
  "type": "part_model",
  "description": "Robossembler: chess pieces",
  "command": "python",
  "package": "",
  "executable": "chess_pieces.py",
  "args": [ // ARRAY of pieces
    {
    "name": \${NAME:string:""},
    "blend": \${FILE:string:""},
    "dae": \${FILE:string:""},
    "fbx": \${FILE:string:""},
    "...": ""
    }
  ]
}

Затем при запуске "get_interface.py" для каждого пакета, получаем json со структурой:

{
  "cameras": [{"properties1": "value1", "propertiesN": "valueN"}],
  "robots": [{"properties1": "value1", "propertiesN": "valueN"}],
  "topics": [{"properties1": "value1", "propertiesN": "valueN"}],
  "...": ""
}

в которой ключи - это наши сущности из БД.
В данном случае будет присутствовать только массив "parts". Web-сервис записывает парсинг результата в соответствующую таблицу.

* Parts_lib
{
  "sid": 1,
  "package": 1,
  "name": "chessboard",
  "description": "Robossembler: chessboard",
  "meshs": {
    "blend": "chessboard.blend",
    "dae": "chessboard.dae",
    "fbx": "chessboard.fbx",
    "...": ""
  }
}
{
  "sid": 2,
  "package": 2,
  "name": "pawn",
  "description": "Robossembler: pawn",
  "meshs": {
    "blend": "pawn.blend",
    "dae": "pawn.dae",
    "fbx": "pawn.fbx",
    "...": ""
  }
}
{
  "sid": 3,
  "package": 2,
  "name": "knight",
  "description": "Robossembler: knight",
  "meshs": {
    "blend": "knight.blend",
    "dae": "knight.dae",
    "fbx": "knight.fbx",
    "...": ""
  }
}

Note. Кроме "sid" и "packages" все остальные поля заполняются из массива [{"properties1": "value1", "propertiesN": "valueN"}].

Пример: цифровой двойник "Камера"

Добавляем пакет с моделью камеры в библиотеку проекта

{
  "sid": 3,
  "type": "digital_twin",
  "entity": "CAMERA",
  "description": "ROS Wrapper for Intel RealSense Cameras",
  "command": "ros2 launch",
  "package": "realsense2_camera",
  "executable": "rs_launch.py",
  "args": {
    "camera_namespace": \${NAME:string:""},
    "camera_name": \${NAME:string:""},
    ... // + всё, что сейчас в модели данных в коде
  },
  "interfaces": {
    "cmd": "python ros2_topic_to_json.py"
  }
}

Добавляем экземпляр камеры в сцену (Scene Builder)

При этом запускаем "get_interface.py" и получаем json со структурой, описанной выше, но в данном случае в результате будет

{
  "cameras": [
    {
        "model_name": "Intel RealSense",
        "model_type": "RGBD",
        "...": "..."
    }
  ],
  "topics": [
    {
        "topic_name": "camera/camera1/image_raw",
        "msg_type":"sensor_msgs/msg/Image"
    },
    {
        "topic_name": "camera/camera1/camera_info",
        "msg_type":"sensor_msgs/msg/CameraInfo"
    }
  ],
}

В БД создаются:

* Cameras
{
  "sid": 1,
  "package": 3,
  "model_name": "Intel RealSense",
  "model_type": "RGBD",
  "pose": {}
}
* Topics
{
  "sid": 1,
  "package": 3,
  "topic_name": "camera/camera1/image_raw",
  "msg_type":"sensor_msgs/msg/Image"
}
{
  "sid": 2,
  "package": 3,
  "topic_name": "camera/camera1/camera_info",
  "msg_type":"sensor_msgs/msg/CameraInfo"
}

Робот добавляется аналогично камере

Модель робота

{
  "sid": 3,
  "type": "digital_twin",
  "entity": "ROBOT",
  "description": "Robossembler Arm",
  "command": "ros2 launch",
  "package": "rbs_bringup",
  "executable": "single_robot.launch.py",
  "args": {
    "robot_name": \${NAME:string:""},
    "dof": \${NAME:number:""},
    ... // + всё, что сейчас в модели данных в коде
  },
  "interfaces": {
    "cmd": "python ros2_topic_to_json.py"
  }
}
* Topics
{
  "sid": 3,
  "package": 4,
  "topic_name": "rbs_arm/robot1/controller",
  "msg_type":"sensor_msgs/msg/JointState"
}
{
  "sid": 4,
  "package": 4,
  "topic_name": "rbs_arm/robot1/controller1",
  "msg_type":"sensor_msgs/msg/JointState"
}

Добавляем пакет навыка Pose Estimation DOPE в библиотеку проекта

* Packages
{
  "sid": 5,
  "project": 1,
  "type": "skill_server",
  "description": "Pose Estimation Skill Dope 6D",
  "command": "ros2 launch",
  "package": "dope6d",
  "executable": "dope.py",
  "args": {
    "output_topic": \${NAME:string:"bound_box"}
  },
  "interfaces": {
    "cmd": "python ros2_topic_to_json.py"
  },
  "bt_param":[
        {
          "name": "peConfigure",
          "description": "configuring lifecycle node ROS 2",
          "type_action": "action"/"condition",
          "type": "run",
          "param": [
            {
              "type": "weights",
              "dependency": { "object_name": "knight", "weights_file": "/home/shalenikol/0_rbs/w_knight.pth", "dimensions": [0.03, 0.026, 0.065] },
              "sid": "123"
            }
          ],
          "result": ["POSE"]
        },
        { "name": "peStop", "type": "stop", "param": [], "result": [] }
  ]
}

Запускаем "get_interfaces.py"

* Topics
{
  "sid": 5,
  "package": 5,
  "topic_name": "bound_box",
  "msg_type":"geometry_msgs/msg/BoundBox"
}
* BTrees
{
  "sid": 1,
  "package": 5,
  "command_name": "peConfigure",
  "dependency": {"$FormBuilderTemplate$"}
}