# 轨迹生成
轨迹生成任务是用户基于已有的场景包括机器人和物体，进行物体的抓取放置操作，录制轨迹数据，数据是ros2bag格式，可以进行数据处理转化变成lerobotv3格式，用于后续的模型评测。
 #### 前提条件
执行本节操作前，必须确保包含以下文件：
- metadata.json：不一定要求完整，但是必须有robot_type字段，和已有的topic，相机topic可以之后添加修改。
- robot_profile.yaml：由patch_moveit_config.py脚本生成，不要修改删除字段，否则创建轨迹生成任务资产校验不通过，会一直处于资源准备中，然后失败，重启也是不可以的。
- robot_abc.prefab：机器人URDF导入后并经过后处理脚本后的产物。
- **abc_config（ROS2包）：moveit配置后生成的产物，需要确认有demo_me.launch.py文件，srdf文件只有一个，没有手动修改moveit生成的config包后不运行补丁脚本，也没有编译。**
- **abc_description（ROS2包）：机器人描述文件包其中包括urdf和mesh。**
- **abc_gripper_controller（ROS2包）：夹爪控制包。**
- abc.yaml：运行后处理脚本需要的配置文件。
 
#### 一、创建轨迹生成任务
1. 在左侧导航栏中单击"数据准备 \> 数据生产"，进入数据生产页面。
2. 选择"自动生成轨迹"页签，进入自动生成轨迹页面。
3. 单击右上角"创建任务"，进入创建页面，参照如下参数说明配置相关信息。 
   表1自动生成轨迹任务参数说明 
   | 参数        | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   |:---|:---|
   | **基础信息**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        ||
   | 任务名称     | 自动生成轨迹任务的名称。 命名规则：名称是由中文、数字、字母、下划线（_）、连字符（-）组成，输入长度范围为3\~64个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 描述（可选）    | 自动生成轨迹任务的简介。 长度为512个字符以内。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | **自动生成轨迹配置**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ||
   | 任务类型  | 默认选中"操作类"任务类型。 说明： "操作类"任务类型：模拟设备动作交互，生成精细化肢体操作运动轨迹。 当前支持：拿放pick and place。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   | 生成轨迹数量  | 在数字微调器中输入值，默认为3。专属资源池支持输入值为1\~500。 说明： - 生成轨迹数量越多，任务执行时长越长，对资源要求越高，每条轨迹生成大约耗时1分钟，请按实际业务填入。  - 设置仿真任务需要产出的轨迹总条数，系统将自动生成对应轨迹数据，满足多组样本采集需求。                                                                                                                                                                                                                                                                                                                                                                                                                    |
   | **资源配置**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     ||
   | 资源池    | 选择资源池类型，本实践需选择"专属资源池"。 专属资源池不与其他用户共享，资源更可控。在使用专属资源池之前，您需要先创建专属资源池，然后在开发过程中选择此专属资源池。不同业务使用的专属资源池有所不同，请参考[资源准备](https://support.huaweicloud.com/usermanual-cloudrobo/cloudrobo_02_0147.html)创建对应的专属资源池。 请在下拉列表选择该业务拥有的专属资源池。 - 开发环境：勾选开启后，即可调试空间资产本体。环境预装ros2、MoveIt、RViz等机器人开发常用工具，方便开展调试工作。 开发环境OBS挂载路径：开发环境可直接访问该OBS桶内文件。调试自定义机器人建议挂载机器人资产关联的OBS路径，调试后自动同步至资产中心；如为非资产路径，调试完成请手动更新资产的OBS文件。   - 任务自动停止：开启后，需在60分钟内单击执行任务；超时未启动任务自动终止。   |
   | **数据配置**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    ||
   | 场景     | 在场景处单击"选择资产"，页面右侧选择"空间资产-仿真"页签中，选择[任务场景搭建](https://support.huaweicloud.com/bestpractice-cloudrobo/cloudrobo_05_0054.html)保存成功的任务场景。 **"专属资源池"开启开发环境后，仅支持含自定义机器人的场景。** 图1选择资产 ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002765139393.png "点击放大") 在页面中选择目标场景，仅支持单选。 完成后单击"确定"，页面会显示场景卡片。 如果不满意此次选择的场景，可在卡片右上角单击"重新选择"。 图2场景卡片示例 ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002735466832.png "点击放大")                                                                                                                     |
   | 输出数据名称  | 在输入框中输入数据名称。输出数据名称一经创建 不支持修改， 请谨慎填写。输出结果默认保存至 空间资产-数据 模块。 命名规则：由中文、数字、字母、下划线（_）、连字符（-）组成。 说明： - 输出结果默认保存至"空间资产-数据"模块。  - 创建后将自动拉起仿真环境，预计耗时10～15分钟；仿真环境拉起后请在60分钟内完成参数配置并启动轨迹生成，超过60分钟仿真环境将自动释放。                                                                                                                                                                                                                                                                                                       |
   | 输出数据格式 | 在下拉列表选择输出数据格式，仅支持选择ros2bag，可以后续创建数据处理任务转换生成LeRobotV3格式。 ros2bag： 原生格式，输出原始时序消息，用于机器人回放调试。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
      
   
   
4. 填写完相关参数后，单击"立即创建"，系统自动返回自动生成轨迹列表页面，当任务状态变为"等待配置"后，单击任务"操作列"需进入仿真环境和开发环境，调试和启动轨迹生成任务。
 
#### 二、进入仿真环境
1. 在轨迹生成任务列表中，单击目标任务"操作"列的"进入仿真环境"，进入MetaEngine Editor界面，如下图所示。 
   ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002765261785.png "点击放大")
   
   
2. 在左上角选择"轨迹生成"，单击"更新运控配置"，编译ROS2包。 
   ![](https://support.huaweicloud.com/bestpractice-cloudrobo/public_sys-resources/caution_3.0-zh-cn.png)
   执行该步骤前，请确保[前提条件]中的配置文件正确。
   ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002765262043.png "点击放大")
   如果发现编译错误，根据以下步骤需要重新修改ROS2包，其中config包不要手动修改，可以打开[四、在安装了moveit assistant的本地或调试环境启动moveit，生成moveit所需的config文件夹](https://support.huaweicloud.com/bestpractice-cloudrobo/cloudrobo_05_0054.html#ZH-CN_TOPIC_0000002723735820__section489585663416)中Moveit的Edit Existing Movelt Configuration Package修改配置重新生成编译通过。要保证如果最后修改过ROS2包之后运行过补丁脚本。
   1. 返回轨迹生成任务列表，单击目标任务"操作"列的"进入开发环境"。
   
   2. 在开发环境命令行中，执行补丁脚本patch_moveit_config.py。
      ```
      python3 patch_moveit_config.py \
        --package-path /obs/robot_abc/Assets/robots/robot_abc/abc_config \
        --prefab-config /obs/robot_abc/Assets/robots/robot_abc/abc_config.yaml \
      ```
      
   
   3. 再进入仿真环境，在左上角选择"轨迹生成"，单击"更新运控配置"，重新编译ROS2包。
   
   
   
   
3. 在MetaEngine Editor的左上角单击"Endity Oudiner"，如下图所示。 
   ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002765424795.png "点击放大")
   
   
4. 抓取的物体要放在Movable下，放置的物体要放在在Target下，如下图所示。 
   ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002735786266.png "点击放大")
   如果Movable或Target下面没有物体时，执行如下操作：
   1. 单击Movable或Target的右键，选择Create entity默认创建一个entity，然后单击entity的右键选择Rename。 ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002735791856.png "点击放大")
      
   
   2. 选中要抓取和放置的物体，在右侧面板选择"Inspector"，然后单击"Add Component"，添加ROS2 Frame组件，Frame Name必须与要抓取和放置的物体名字一致。如下图示。 ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002761947217.png "点击放大")
      
   
   
   如下图所示是一个抓取魔方放置到塑料盒中的任务，将抓取的物体rigid_rubikscube_0_RoboTwin放在Movable下，将放置的物体rigid_plasticbox_9_RoboTwin放在Target下。
   如果需要抓取多个物体，也可以都放在Movable下。
   ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002761948025.png "点击放大")
   抓取物体和放置物体位姿不存在的情况下，如下图所示是添加抓取物体和放置物体的抓取位姿和放置位姿的场景。
   1. 选中抓取的物体，在右侧面板单击"任务定义"，单击"刷新"，单击"添加抓取位姿";选中放置的物体，单击"添加放置位姿"。 ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002762107307.png "点击放大")
      
   
   2. 单击"任务定义"添加指令描述，用英文该场景，比如示例是：The table features an atomic-nucleus-like textured surface, with a Rubik's cube and a blue plastic box placed on it. The robot arm picks up the Rubik's cube from the table and places it into a blue container.（这张桌子具有类似原子核的纹理表面，上面放着一个魔方和一个蓝色塑料盒。机器臂从桌子上抓起一个魔方，并将其放入一个蓝色容器中。） ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002765195583.png "点击放大")
      
   
   
   
   
5. 单击"任务定义"，单击"刷新"、"保存"，单击"测试效果"。 
   如果夹爪移动，说明ROS2包及配置文件正确，执行失败通常是因为位姿偏差过大，机器人无法到达目标位置，算法规划不可达。
   可手动调试物体和夹爪的坐标，单击Transform下的移动、旋转来变换物体夹爪的位姿。
   ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002738059586.png "点击放大")
   - 如果测试效果成功，可以记录下机器人、抓取物体、放置物体以及抓取位姿、放置位姿的坐标。
   
   - 如果测试效果不成功，要分清是什么情况，如果进入了play模式后机器人没有规划运动直接失败，可以看左侧的日志看是诸如坐标问题还是什么具体问题，然后去修改相应的包或者配置文件并编译，修改了config包需要再次运行补丁脚本，不要手动修改robot_profile.yaml，否则导致运动规划无法匹配，然后单击"更新运控配置"，重新进行测试效果。 ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002761947955.png "点击放大")
     
   
   
   
   
6. **添加腕部相机（wrist_camera）** 。要注意这里不一定都是腕部相机，要结合机器人实际情况（此处以腕部相机示例），首先选机器人自己有的相机，比如单臂一般就是腕部相机和手动添加的外部相机，第三方视角，便于后续训练模型和模型评测。比如双臂机器人那就是left / right（左右手腕），以及front 或 head（前方/头部），这些命名对于后续数据处理比较方便。
   
   1. 双击机器人Prefab编辑器，搜索现有的camera实体。
      
   
   2. 首先使用机器人自带的相机实体，重命名为wrist_camera。
      如果没有，在 Entity Outliner中右键"Add Entity"，命名为wrist_camera。
      
   
   3. 选中该实体，在右侧Inspector面板，单击"Add Component"添加 **ROS2 Camera Sensor**。
   
   4. ROS2 Frame组件，Frame Name必须与机器人相机名字一致，命名为wrist_camera；**ROS2 Camera Sensor**组件，topic命名必须为/wrist_camera/camera_image_color
   
   5. 参考如下示例，设置需要的参数：
      - Width: 640
        
      
      - Height: 480
        
      
      - Frequency (HZ): 10.0
        
       
   
   6. 将相机挂载到机器人腕部关节上。如下图所示。
      ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002735961472.png "点击放大")
      ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002765321043.png "点击放大")
      
   
   
   
   
7. **添加外部相机（external_camera）。**
   
   1. 双击机器人Prefab编辑器，在base_link右键添加entity实体，命名为external_camera。
      
   
   2. 选中该实体，在右侧Inspector面板，单击"Add Component"添加**ROS2 Camera Sensor**。
   
   3. ROS2 Frame组件，Frame Name必须与添加的外部相机名字一致，命名为external_camera；**ROS2 Camera Sensor**组件，topic命名必须为/external_camera/camera_image_color。
   
   4. 参考如下示例，设置需要的参数：
      - Width: 640
        
      
      - Height: 480
        
      
      - Frequency (HZ): 10.0
        
       
   
   5. 将相机放置在场景外部，对准机器人抓取放置物体的工作区域。
      参考下图。
      ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002735961822.png "点击放大")
      ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002765321471.png "点击放大")
      
   
   
   
   
8. **验证相机视角** 。
   
   1. 进入仿真Play模式后，可以通过开发环境的rviz确认相机视角。
   
   2. 返回任务列表单击"进入开发环境"，终端输入
      ```
      export FASTDDS_BUILTIN_TRANSPORTS=UDPv4
      ros2 launch abc_config demo_me.launch.py
      ```
      如果点击了测试效果可能有进程，那可以ros2 launch abc_config rviz_only.launch.py来查看相机视角。
      ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002754818556.png "点击放大")
      
   
   3. 再进入仿真环境，先选择base_link，再进入仿真器点击Play模式。
   
   
   如下图操作，可以看到腕部相机、外部相机等相机topic视角，如果不符合预期可以调整相机位置、旋转相机姿态，退出**请在终端Ctrl+C确定退出进程**。
   ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002733363612.png "点击放大")
   
   
9. 返回任务列表，单击"进入开发环境"修改metadata.json。 
   开始准备执行轨迹生成任务录制rosbag，对应修改metadata.json的record_topic和camera_introduce，如下所示即最后录制出来的ros2bag会包含的topic。
   ```
   {
       "robot_type": "abc",
       "record_topic": [
           "/arm_controller/follow_joint_trajectory/_action/feedback",  // MoveIt / arm_controller 的 FollowJointTrajectory Action 执行反馈
           "/arm_position_controller/commands",    // 机械臂各关节的位置控制命令
           "/joint_states",      // 机器人各关节的当前状态，包括关节位置、速度等
           "/hand_position_controller/commands",   // 夹爪左右手指关节的位置控制命令
           "/hand_gripper_controller",     // 发送给夹爪控制节点的上层开合命令         
           "/wrist_camera/camera_image_color",      // 手腕相机图像
           "/external_camera/camera_image_color"   // 外部相机图像
       ]
   }
   ```
   
   
10. 刷新topic列表。 
    1. 修改完metadata.json，需要进入仿真环境，单击右侧"任务定义"，单击"刷新"、"保存"，会重新读取metadata.json，在录制topic模块，勾选新增的topic，确认列表与预期一致。
    
    2. 单击"保存"按钮，会将当前TaskDefinition配置写入task_definition_config.json，后续轨迹生成任务从此文件读取topic列表，才会录制最新版本的ros2bag。
    
    
    
    
11. 配置数据增广，可以单击仿真器的小眼睛![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002767721687.png)查看增广范围即黄色区域，修改Box Shape的Dimensions的xyz值，就可以修改增广的范围，记得增广范围的最高处不要高过桌面太多。单击数据增广的全局随机与预览，可以看到选中的物体的魔方变换了位置，变换的位置就是增广的范围，要注意增广范围太大可能会导致失败的数据过多。
    
    ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002738043906.png "点击放大")
    ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002738203856.png "点击放大")
    ![](https://support.huaweicloud.com/bestpractice-cloudrobo/figure/zh-cn_image_0000002767563383.png "点击放大")
    
    
12. 调试轨迹生成任务。 
    1. 点击"更新运控配置"，确认没有报错
    
    2. 单击"任务定义"，单击"测试效果"，机器人可以抓取物体放置目标位置，确认测试效果成功，单击"保存"，更新task_definition_config.json文件。
    
    3. 单击左上角选择"File"，选择"Save"或者Ctrl+S保存。
    
    4. 单击"启动轨迹生成"，开启批量生产轨迹数据，执行完成任务就会显示已完成。输出的数据可以用于后续数据处理。
    
    
    
    
 
