撰写主配置文件
1. 准备
请准备好机器人的URDF文件
接下来以OpenLoong为例,介绍如何构造配置文件。
确认URDF可用
在OpenLoong路径下,使用以下python3脚本测试:
import pybullet as p
import time
p.connect(p.GUI)
p.loadURDF("azureloong_description/urdf/AzureLoong_sr.urdf")
while 1:
time.sleep(0.1)
正确运行后应有机器人正常显示在pybullet中。

2. 确定机器人home姿态
调整机器人home姿态
在OpenLoong路径下,使用以下python3脚本测试:
import pybullet as p
import time
p.connect(p.GUI)
robot_id = p.loadURDF("azureloong_description/urdf/AzureLoong_sr.urdf")
joint_index_debug_param_dt = {}
for i in range(0, p.getNumJoints(robot_id)):
joint_info = p.getJointInfo(robot_id, i)
print(joint_info)
if joint_info[2] != p.JOINT_FIXED:
joint_index_debug_param_dt[i] = p.addUserDebugParameter(
paramName=f" {i} {joint_info[1].decode('utf-8')}",
rangeMin=joint_info[8],
rangeMax=joint_info[9],
startValue=p.getJointState(robot_id, i)[0],
)
while 1:
for joint_index, param_id in joint_index_debug_param_dt.items():
p.resetJointState(robot_id, joint_index, p.readUserDebugParameter(param_id))
time.sleep(0.1)
程序运行后,应当看到如下可视化界面

通过调节右侧的滑块,调整机器人手臂的关节角度到期望的home姿态。 例如:
将右手臂大致调整到如下位置: [0.20, -0.97, -2.00, 1.70, 0.63, 0.00, -0.43]
将左手臂大致调整到如下位置:
[-0.20, -0.97, 2.00, 1.70, -0.63, 0.00, 0.43]

3. 添加EE定义
将机械臂调整至home姿态后,需要在URDF中添加EE link 和 joint,用来做末端的位姿映射。
运行调整机器人home姿态的脚本时,终端会打印出机器人的joint信息,找到机器人手臂的末端link,一般是最后一个关节,或者有gripper,hand,palm这样的关键词。
例如,在OpenLoong中,我们选择:
(11, b'J_arm_r_palm', 4, -1, -1, 0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, b'Link_arm_r_palm', (0.0, 0.0, 0.0), (0.007859, 0.00817000000000001, 0.037736), (0.0, 0.0, 0.0, 1.0), 10)
(47, b'J_arm_l_palm', 4, -1, -1, 0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, b'Link_arm_l_palm', (0.0, 0.0, 0.0), (0.0077872, -0.30705, 0.027733), (0.0, 0.0, 0.0, 1.0), 46)
在urdf中,找到相应的link,添加EE link和joint,注意urdf树的依赖顺序:
<link name="io_teleop_ee_link_left"/>
<joint name="io_teleop_ee_joint_left" type="fixed">
<origin rpy="0 0 0" xyz="0 0 0"/>
<parent link="Link_arm_l_palm"/>
<child link="io_teleop_ee_link_left"/>
</joint>
<link name="io_teleop_ee_link_right"/>
<joint name="io_teleop_ee_joint_right" type="fixed">
<origin rpy="0 0 0" xyz="0 0 0"/>
<parent link="Link_arm_r_palm"/>
<child link="io_teleop_ee_link_right"/>
</joint>

添加完成后再次运行调整机器人home姿态的脚本,
记录下终端打印信息中,手臂关节的id(每一行打印的第一个元素),与ee link的id
对于OpenLoong,应该是:
joint_id_dt = {
"right_arm_joint_ids": [4, 5, 6, 7, 8, 9, 10],
"left_arm_joint_ids": [41, 42, 43, 44, 45, 46, 47],
}
ee_id_dt = {"right_ee_link_id": 12, "left_ee_link_id": 49}
在OpenLoong路径下,运行下方python3脚本,可视化ee坐标系
import pybullet as p
import time
import numpy as np
def debug_draw_pose(pose, replace_line_ids=None, line_width=5, line_length=0.3):
axes = np.identity(3) * line_length
colors = np.identity(3)
line_ids = [] if replace_line_ids is None else replace_line_ids
for i in range(3):
if replace_line_ids is None:
line_id = p.addUserDebugLine(
lineFromXYZ=pose[0],
lineToXYZ=p.multiplyTransforms(pose[0], pose[1], axes[i], [0, 0, 0, 1])[
0
],
lineColorRGB=colors[i],
lineWidth=line_width,
lifeTime=0,
)
line_ids.append(line_id)
else:
p.addUserDebugLine(
lineFromXYZ=pose[0],
lineToXYZ=p.multiplyTransforms(pose[0], pose[1], axes[i], [0, 0, 0, 1])[
0
],
lineColorRGB=colors[i],
lineWidth=line_width,
lifeTime=0,
replaceItemUniqueId=replace_line_ids[i],
)
return line_ids
p.connect(p.GUI)
robot_id = p.loadURDF("azureloong_description/urdf/AzureLoong_sr.urdf")
joint_id_dt = {
"right_arm_joint_ids": [4, 5, 6, 7, 8, 9, 10],
"left_arm_joint_ids": [41, 42, 43, 44, 45, 46, 47],
}
ee_id_dt = {"right_ee_link_id": 12, "left_ee_link_id": 49}
# joint home is list concat of right and left arm home pos, it must be right arm first then left arm
joint_home = [0.20, -0.97, -2.00, 1.70, 0.63, 0.00, -0.43] +
[-0.20, -0.97, 2.00, 1.70, -0.63, 0.00, 0.43]
joint_ids = [id for ids in joint_id_dt.values() for id in ids]
ee_ids = [id for id in ee_id_dt.values()]
for i in range(p.getNumJoints(robot_id)):
if i in joint_ids:
p.resetJointState(robot_id, i, joint_home[joint_ids.index(i)])
if i in ee_ids:
debug_draw_pose(p.getLinkState(robot_id, i)[4:6], line_width=10)
while 1:
time.sleep(0.1)
正确运行后,应当看到如下可视化界面

接下来通过修改urdf中io_teleop_ee_joint_right和io_teleop_ee_joint_left的origin rpy和xyz字段,
调整ee link的位置和姿态,使其满足:坐标系原点position落在掌心(或夹爪)中心(TCP)
下面区分使用相对或绝对姿态旋转的两种情况:
1. 绝对姿态旋转(推荐):
末端的旋转相对与机器人的base,可以以任意姿态手持VR控制器
2. 相对姿态旋转:
末端的旋转相对于按下A键时的末端姿态,要求每次按下A键时,人手臂姿态与机器人手臂姿态尽量保持一致
在这种情况下,需要额外调整URDF中的io_teleop_ee_joint_right和io_teleop_ee_joint_left的origin rpy字段,使其满足:
- Z轴竖直向上
- Y轴与手面平行,且朝前(从机器人的角度,朝向机器人base的前方)
小提示:在pybullet中,为定轴旋转
对于青龙机器人调整后的结果应该是:
<link name="io_teleop_ee_link_left"/>
<joint name="io_teleop_ee_joint_left" type="fixed">
<origin rpy="3.14 -1.57 0" xyz="0 0 0"/>
<parent link="Link_arm_l_palm"/>
<child link="io_teleop_ee_link_left"/>
</joint>
<link name="io_teleop_ee_link_right"/>
<joint name="io_teleop_ee_joint_right" type="fixed">
<origin rpy="3.14 1.57 0" xyz="0 0 0"/>
<parent link="Link_arm_r_palm"/>
<child link="io_teleop_ee_link_right"/>
</joint>

4. 填写配置文件
在OpenLoong路径下,创建vr_configs.yml文件
添加vr_configs.yml文件,填入如下内容: