玩转PiPER|教你使用PiPER RL训练一个简单的任务
创始人
2025-11-30 09:30:10
0

(来源:AGV网)

|导入

在具身智能领域,强化学习(Reinforcement Learning, RL)正成为实现自主决策与自适应操作的重要技术路径。尤其对于多自由度机械臂系统,如何让其在复杂环境中高效、稳定地完成指定任务,是当前研究与工程应用的关键挑战之一。

PiPER 作为松灵机器人推出的高性价比六轴协作机械臂,凭借其开源生态和灵活的控制接口,为开发者提供了理想的实验平台。

本文将围绕 “PiPER RL Demo” 开源项目,详细介绍如何在 Mujoco 和 Genesis 两大主流仿真环境中,构建并训练一个面向“末端夹爪到达目标位置”任务的强化学习策略。我们将从环境搭建、自定义 Gym 环境设计、奖励函数构建到并行训练与可视化评估,完整呈现一个端到端的 RL 开发流程,帮助读者快速上手机器人强化学习实践。

代码仓库

PiPER_RL:https://github.com/vanstrong12138/Piper_rl.git

AgileX-College:https://github.com/agilexrobotics/Agilex-College.git

一、环境依赖

  • • 安装RL相关的依赖

pip install -r requirements.txt

  • • 安装Genesis相关的依赖

  1. 1. Pytorch 安装Pytorch,根据自己的CUDA版本选择对应的安装命令,命令在链接中寻找相应cuda版本的pytorch。例如使用cuda12.9的版本,安装命令如下:

pip install torch==2.8.0 torchvision==0.23.0 torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cu129

  1. 2.Genesis World 安装Genesis World,命令如下:

pip install genesis-world

  • • 安装Mujoco

pip install mujoco==3.3.2

二、Genesis 示例

在genesis中加载piper模型

运行genesis_demo/hello_genesis.py

python genesis_demo/hello_genesis.py

可以看见成功加载了Piper模型

在genesis中控制PiPER模型

运行genesis_demo/control_piper.py

python genesis_demo/control_piper.py

可以看见piper根据设定的位置进行运动

在genesis中实现多个piper并行仿真

运行genesis_demo/multi_piper.py

python genesis_demo/multi_piper.py

在genesis中实现多个piper并行训练

运行piper_rl_genesis.py

python piper_rl_genesis.py

可以看见多个piper试图接近设定的位置

开启tensorboard可以看见训练过程中多个piper的奖励变化

tensorboard  --logdir tensorboard/piper_reach_target/

三、在genesis中实现piper env的基础步骤

1. 初始化env

# 继承gym.Env更详细的方法参考OpenAI提供的gym示例
class PiperEnv(gym.Env):

    # __init__():将会初始化环境以及初始化机器人的参数、动作空间与状态空间,便于强化学习算法在给定的状态空间中搜索合适的动作
    def __init__(self, visualize: bool = False):
        super(PiperEnv, self).__init__()

        self.visualize = visualize

        # 设置需要控制的关节索引
        self.jnt_name = [
            "joint1",
            "joint2",
            "joint3",
            "joint4",
            "joint5",
            "joint6"
        ]

        # 设置随机目标点的生成空间与piper机械臂的工作空间
        self.workspace = {
            'x': [-0.5, 1.5],
            'y': [-0.8, 0.8],
            'z': [0.05, 0.5]
        }

        # 设置环境的设备
        self.tensor_device = "cpu"
        self.gs_device = gs.cpu

        # 设置关节限位
        self.jnt_range = torch.tensor([
            [-2.61, 2.61],
            [0, 3.14],
            [-2.7, 0],
            [-1.83, 1.83],
            [-1.22, 1.22],
            [-1.57, 1.57]
        ], device=self.tensor_device)

        # piper机械臂关节的PD控制器参数
        self.kp = torch.tensor([4500, 4500, 3500, 3500, 2500.0, 2500.0], device=self.tensor_device)
        self.kv = torch.tensor([450.0, 450.0, 350.0, 350.0, 250.0, 250.0], device=self.tensor_device)

        gs.init(backend = self.gs_device)

        # 创建genesis场景
        self.scene = gs.Scene(
            # 设置相机
            show_viewer = self.visualize,
            viewer_options = gs.options.ViewerOptions(
                camera_pos    = (3.5, -1.0, 2.5),
                camera_lookat = (0.0, 0.0, 0.5),
                camera_fov    = 40,
            ),
            # 设置物理引擎
            rigid_options = gs.options.RigidOptions(
                dt = 0.01,
            ),
        )

        # 添加地面
        plane = self.scene.add_entity(
            gs.morphs.Plane(),
        )

        # 添加piper机器人
        self.robot = self.scene.add_entity(
            gs.morphs.MJCF(file='xml/agilex_piper/piper.xml'),
        )

        # 构建场景
        self.scene.build()

        # 初始姿态是piper机械臂的默认姿态,即所有关节角度为0
        self.default_joint_pos = torch.tensor([0.0, 0.0, 0.0, 0.0, 0.0, 0.0], device=self.tensor_device)
        # 定义末端执行器的位置x,y,z(实际当piper为初始姿态时,末端执行器的位置不为(0,0,0))
        self.default_ee_pos = torch.tensor([0.0, 0.0, 0.0], device=self.tensor_device)

        # 定义动作空间与状态空间,确保关节的数值不会超过-PI到PI
        self.action_space = spaces.Box(low=-3.14, high=3.14, shape=(6,), dtype=np.float32)

        # 定义状态空间,包括6个关节角度、3个末端执行器位置
        self.observation_space = spaces.Box(low=-np.inf, high=np.inf, shape=(9,), dtype=np.float32)

        
        self.motors_dof_idx = [self.robot.get_joint(name).dof_start for name in self.jnt_name]
        self.robot.set_dofs_kp(self.kp, self.motors_dof_idx)
        self.robot.set_dofs_kv(self.kv, self.motors_dof_idx)

        self.goal = torch.tensor(torch.zeros(3, dtype=torch.float32), device=self.tensor_device)
        self.last_action = torch.tensor(torch.zeros(6, dtype=torch.float32), device=self.tensor_device)
        self.goal_threshold = 0.005
  1. 2. 设计奖励函数

def calc_reward(self, action, obs):

        # 计算机械臂关节与目标位置的距离
        dist_to_goal = torch.linalg.norm(obs[6:] - self.goal)
        
        # 非线性距离奖励
        if dist_to_goal < self.goal_threshold:
            distance_reward = 100.0
        elif dist_to_goal < 2*self.goal_threshold:
            distance_reward = 50.0
        elif dist_to_goal < 3*self.goal_threshold:
            distance_reward = 10.0
        else:
            distance_reward = 1.0 / (1.0 + dist_to_goal)
        
        # 动作相关惩罚:惩罚关节大幅度变化
        action_diff = action - self.last_action
        smooth_penalty = 0.1 * torch.linalg.norm(action_diff)

        # 关节角度限制惩罚
        joint_penalty = 0.0
        for i in range(6):
            min_angle = self.jnt_range[i][0]
            max_angle = self.jnt_range[i][1]
            if obs[i] < min_angle:
                joint_penalty += 0.5 * (min_angle - obs[i])
            elif obs[i] > max_angle:
                joint_penalty += 0.5 * (obs[i] - max_angle)
        
        # 总奖励计算
        total_reward = distance_reward - smooth_penalty - joint_penalty
        # 更新上一步动作
        self.last_action = action.clone()
        
        return total_reward, dist_to_goal
  1. 3. 设置步进函数

def step(self, action):
        action_tensor = torch.tensor(action, device=self.tensor_device, dtype=torch.float32)
        
        # 动作缩放: 归一化不同物理量纲的观测值.神经网络会对大数值特征更敏感,训练不稳定,通过缩放使所有观测值在相似范围内
        scaled_action = torch.zeros(6, device=self.tensor_device, dtype=torch.float32)
        for i in range(6):
            scaled_action[i] = self.jnt_range[i][0] + (action_tensor[i] + 1) * 0.5 * (self.jnt_range[i][1] - self.jnt_range[i][0])
        
        # genesis机器人执行动作
        self.robot.control_dofs_position(scaled_action, self.motors_dof_idx)
        # genesis场景模拟一步
        self.scene.step()

        # 观测
        obs = self.get_observation()

        # 计算奖励
        reward, dist_to_goal = self.calc_reward(action_tensor, obs)
        terminated = False
        if dist_to_goal < self.goal_threshold:
            terminated = True

        if not terminated:
            if time.time() - self.start_t > 20.0:
                reward -= 10.0
                print(f"[超时] 时间过长,奖励减半")
                terminated = True
        
        info = {
            'is_success': terminated and (dist_to_goal < self.goal_threshold),
            'distance_to_goal': dist_to_goal.item()
        }

        return obs.cpu().numpy(), reward.item(), terminated, False, info

| 四、Mujoco示例

在mujoco中实现多个piper并行训练

运行piper_rl_mujoco.py

python piper_rl_mujoco.py

开启tensorboard可以看见训练过程中多个piper的奖励变化

tensorboard  --logdir tensorboard/piper_reach_target/

在mujoco中测试训练好的模型

运行piper_rl_mujoco.py

python piper_rl_mujoco.py

可以看到piper成功到达目标位置

参考

[https://github.com/LitchiCheng/mujoco-learning](https://github.com/LitchiCheng/mujoco-learning)

通过在 Mujoco 与 Genesis 两个仿真平台上的对比实验,我们不仅验证了 PiPER 机械臂在强化学习框架下的可训练性,也展示了 Genesis 在多实例并行仿真方面的高效优势。无论是初学者希望理解 RL 与机器人控制的结合方式,还是研究者寻求高性能仿真工具链,本项目都提供了一个清晰、可复现的技术范例。

相关内容

日遗化武‌80年未清,4次...
转自:北京日报客户端近日,《禁止化学武器公约》第30届缔约国大会在...
2025-11-30 13:00:43
6G技术,重大突破!万亿元...
本文转自【央视财经】;据专家介绍,目前我国已经完成第一阶段6G技术...
2025-11-30 13:00:36
美战机接近,委防长:“战争...
(来源:直新闻)当地时间11月29日,委内瑞拉国防部长洛佩斯与军事...
2025-11-30 13:00:31
环保宣传邂逅“黄河观凌周”...
(来源:中国环境网)转自:中国环境网11月29日上午,内蒙古自治区...
2025-11-30 12:55:14
(经济观察)上海建设全球金...
中新网上海11月30日电 (高志苗)全球金融科技中心发展指数(20...
2025-11-30 12:55:09
美媒披露美防长曾下令“干掉...
新华社北京11月30日电 美国媒体28日披露,美军9月2日在加勒比...
2025-11-30 12:50:23
成为全国合并体制改革样板,...
(来源:上观新闻)廿载同心创一流、凝心聚力向未来。11月29日,上...
2025-11-30 12:50:08
C视觉丨藏不住了 阆中冬日...
C视觉签约摄影师 姚文顺 川观新闻记者 肖雨杨11月30日,南充阆...
2025-11-30 12:45:23
《疯狂动物城2》成为中国影...
据灯塔专业版,截至11月30日0时,影片《疯狂动物城2》票房已突破...
2025-11-30 12:45:17

热门资讯

日遗化武‌80年未清,4次逾期... 转自:北京日报客户端近日,《禁止化学武器公约》第30届缔约国大会在荷兰海牙审议化武销毁决定执行情况。...
6G技术,重大突破!万亿元级市... 本文转自【央视财经】;据专家介绍,目前我国已经完成第一阶段6G技术试验,形成超过300项关键技术储备...
美战机接近,委防长:“战争即将... (来源:直新闻)当地时间11月29日,委内瑞拉国防部长洛佩斯与军事指挥官举行保卫国家军事会议,洛佩斯...
环保宣传邂逅“黄河观凌周”,包... (来源:中国环境网)转自:中国环境网11月29日上午,内蒙古自治区包头市生态环境局昆都仑区分局与包头...
(经济观察)上海建设全球金融科... 中新网上海11月30日电 (高志苗)全球金融科技中心发展指数(2025)29日发布,结果显示,纽约、...
美媒披露美防长曾下令“干掉‘运... 新华社北京11月30日电 美国媒体28日披露,美军9月2日在加勒比海对一艘“运毒船”发射导弹打击后,...
成为全国合并体制改革样板,上海... (来源:上观新闻)廿载同心创一流、凝心聚力向未来。11月29日,上海交通大学与上海第二医科大学强强合...
C视觉丨藏不住了 阆中冬日绝美... C视觉签约摄影师 姚文顺 川观新闻记者 肖雨杨11月30日,南充阆中市白塔山观景台观看冬季日出的游客...
《疯狂动物城2》成为中国影史进... 据灯塔专业版,截至11月30日0时,影片《疯狂动物城2》票房已突破16亿元,超过第一部《疯狂动物城》...
金正恩:朝鲜空军有新的重大任务 新华社消息援引朝中社30日报道,朝鲜28日举行系列活动庆祝人民军空军成立80周年,朝鲜劳动党总书记、...