Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ UDP JSON,端口 `127.0.0.1:5005`。
| `gripper_position` | float | 夹爪指位置目标(m),各发送端有各自的换算方式(见下表) |

**夹爪控制链:**
接收端将收到的 `gripper_position` 直接作为左右两个滑动关节的位置目标,并按各指裁剪到 `[0, 上限]`(USD 上限:`joint_left` 0.05 m,`joint_right` 0.0715 m)。接收端不做额外缩放。各发送端到 `gripper_position` 的换算如下:
接收端将收到的 `gripper_position` 直接作为左右两个滑动关节的位置目标,并按各指裁剪到 `[0, 上限]`(USD 上限:两指均为 0.05 m;两指由同一电机通过单个小齿轮驱动,行程严格 1:1)。接收端不做额外缩放。各发送端到 `gripper_position` 的换算如下:

| 发送端 | 到 `gripper_position`(m)的换算 |
|------|------|
Expand Down
2 changes: 1 addition & 1 deletion README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ UDP JSON on `127.0.0.1:5005`.
| `gripper_position` | float | Gripper finger position target (m); each sender computes it with its own mapping (see below) |

**Gripper control chain:**
The receiver applies the received `gripper_position` directly as the position target of both prismatic finger joints, clipped per finger to `[0, upper limit]` (USD upper limits: `joint_left` 0.05 m, `joint_right` 0.0715 m). There is no extra scaling on the receiver side. The senders map their input to `gripper_position` as follows:
The receiver applies the received `gripper_position` directly as the position target of both prismatic finger joints, clipped per finger to `[0, upper limit]` (USD upper limit: 0.05 m on both fingers; a single motor drives both through one pinion, so their travel is rigidly 1:1). There is no extra scaling on the receiver side. The senders map their input to `gripper_position` as follows:

| Sender | Mapping to `gripper_position` (m) |
|------|------|
Expand Down
2 changes: 1 addition & 1 deletion README_ES.md
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ JSON sobre UDP en `127.0.0.1:5005`.
| `gripper_position` | float | Objetivo de posición de los dedos de la pinza (m); cada emisor lo calcula con su propia conversión (véase más abajo) |

**Cadena de control de la pinza:**
El receptor aplica el `gripper_position` recibido directamente como objetivo de posición de las dos articulaciones prismáticas de los dedos, recortado por dedo a `[0, límite superior]` (límites superiores del USD: `joint_left` 0,05 m, `joint_right` 0,0715 m). El receptor no aplica ninguna escala adicional. Los emisores convierten su entrada a `gripper_position` de la siguiente manera:
El receptor aplica el `gripper_position` recibido directamente como objetivo de posición de las dos articulaciones prismáticas de los dedos, recortado por dedo a `[0, límite superior]` (límite superior del USD: 0,05 m en ambos dedos; un solo motor mueve los dos a través de un único piñón, por lo que su recorrido es rígidamente 1:1). El receptor no aplica ninguna escala adicional. Los emisores convierten su entrada a `gripper_position` de la siguiente manera:

| Emisor | Conversión a `gripper_position` (m) |
|------|------|
Expand Down
31 changes: 30 additions & 1 deletion mjcf/rebot_devarm/build_mjcf.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,15 @@
DYNAMICS = {
"rs06": ("5", "900", "60", "-36 36"),
"rs00": ("2", "120", "10", "-14 14"),
"gripper": ("1", "100", "4", "-500 500"),
# Gripper gains come from the physical actuator, not from a tuned guess.
# Motor 7 (RobStride, limit_torque = 14 Nm read from firmware) drives both
# racks through one pinion of r = 7.353 mm/rad, so it presents
# K = kp_motor / r^2 = 50 / 0.007353^2 = 925 kN/m and 14 / 0.007353 = 1904 N
# at the finger. kp is capped at the stiffest value that stays stable at the
# solver step; kv gives a damping ratio of 1 against the 0.0752 kg finger.
# The previous (100, 4, 500) left the fingers at zeta = 0.685 -- underdamped,
# f_n = 5.45 Hz -- so they swung whenever the arm moved.
"gripper": ("1", "5000", "41.28", "-1904 1904"),
}
JOINT_CLASS = {
"joint1": "rs06",
Expand Down Expand Up @@ -271,6 +279,27 @@ def build(self):
}
ET.SubElement(actuator, "position", attrs)

# The two fingers are one mechanism, not two: a single motor drives two
# opposed racks through one pinion (hardware BOM: 02_Rack.step x2), so
# their travel is rigidly 1:1. Modelling them as independent prismatic
# joints let the jaws drift apart whenever the arm accelerated.
# solref uses the standard positive (timeconst, dampratio) form with
# timeconst = 2*dt. Direct constraint gains (negative solref) couple
# ~11x tighter in MuJoCo but make Newton's SolverMuJoCo diverge to NaN,
# and this model is published for both engines.
equality = ET.SubElement(root, "equality")
ET.SubElement(
equality,
"joint",
{
"joint1": "joint_left",
"joint2": "joint_right",
"polycoef": "0 1 0 0 0",
"solref": "0.004 1",
"solimp": "0.9999 0.99999 0.001 0.5 2",
},
)

keyframe = ET.SubElement(root, "keyframe")
for name, qpos in KEYFRAMES:
ET.SubElement(keyframe, "key", {"name": name, "qpos": qpos, "ctrl": qpos})
Expand Down
9 changes: 6 additions & 3 deletions mjcf/rebot_devarm/rebot_devarm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
</default>
<default class="gripper">
<joint damping="1" />
<position kp="100" kv="4" forcerange="-500 500" />
<position kp="5000" kv="41.28" forcerange="-1904 1904" />
</default>
</default>
</default>
Expand Down Expand Up @@ -74,7 +74,7 @@
</body>
<body name="gripper_right" pos="-0.041939 7.3385E-05 0" quat="0.5 -0.5 -0.5 -0.5">
<inertial pos="0.00218008703135955 -0.018709035593418 0.00932188568692151" mass="0.0752" fullinertia="1.09877964176176E-05 9.50146036720166E-06 9.30779991911125E-06 0 0 0" />
<joint name="joint_right" type="slide" range="0 0.0715" axis="0 0 1" class="gripper" />
<joint name="joint_right" type="slide" range="0 0.05" axis="0 0 1" class="gripper" />
<geom name="gripper_right_visual_0" type="mesh" mesh="gripper_right_merged_gripper" material="default_material" class="visual" pos="0 0 0" />
<geom type="mesh" class="collision" name="gripper_right_collision_gripper_right_convex" mesh="gripper_right_convex" />
</body>
Expand Down Expand Up @@ -118,8 +118,11 @@
<position class="rs00" name="joint5" joint="joint5" ctrlrange="-1.57 1.57" />
<position class="rs00" name="joint6" joint="joint6" ctrlrange="-3.14 3.14" />
<position class="gripper" name="joint_left" joint="joint_left" ctrlrange="0 0.05" />
<position class="gripper" name="joint_right" joint="joint_right" ctrlrange="0 0.0715" />
<position class="gripper" name="joint_right" joint="joint_right" ctrlrange="0 0.05" />
</actuator>
<equality>
<joint joint1="joint_left" joint2="joint_right" polycoef="0 1 0 0 0" solref="0.004 1" solimp="0.9999 0.99999 0.001 0.5 2" />
</equality>
<keyframe>
<key name="home" qpos="0 0 0 0 0 0 0 0" ctrl="0 0 0 0 0 0 0 0" />
<key name="raised" qpos="0 -0.7 -1.1 0 0 0 0 0" ctrl="0 -0.7 -1.1 0 0 0 0 0" />
Expand Down
10 changes: 5 additions & 5 deletions urdf/00-arm-rs_asm-v3/urdf/00-arm-rs_asm-v3.urdf
Original file line number Diff line number Diff line change
Expand Up @@ -752,8 +752,8 @@
<limit
lower="0"
upper="0.05"
effort="500"
velocity="10" />
effort="1904"
velocity="0.243" />
</joint>
<link
name="gripper_right">
Expand Down Expand Up @@ -837,8 +837,8 @@
xyz="0 0 1" />
<limit
lower="0"
upper="0.0715"
effort="500"
velocity="10" />
upper="0.05"
effort="1904"
velocity="0.243" />
</joint>
</robot>
120 changes: 119 additions & 1 deletion usd/RS-rebot-dev-arm/RS-rebot-dev-arm.usda
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ Generated from Composed Stage of root layer urdf/00-arm-rs_asm-v3 (asset transfo
def Xform "tn__00armrs_asmv3_hJ6D" (
prepend apiSchemas = ["IsaacRobotAPI"]
kind = "component"
prepend references = @./payloads/RS-rebot-dev-arm_base.usd@
prepend payload = @./payloads/RS-rebot-dev-arm_physics.usd@
prepend references = @./payloads/RS-rebot-dev-arm_base.usd@
variants = {
string Physics = "physics"
}
Expand Down Expand Up @@ -59,6 +59,124 @@ def Xform "tn__00armrs_asmv3_hJ6D" (

}
"none" {
over "Physics" (
active = false
)
{
}

over "Geometry"
{
over "base_link" (
apiSchemas = None
)
{
over "base_link_1" (
active = false
)
{
}

over "link1" (
apiSchemas = None
)
{
over "link1_1" (
active = false
)
{
}

over "link2" (
apiSchemas = None
)
{
over "link2" (
active = false
)
{
}

over "link3" (
apiSchemas = None
)
{
over "link3" (
active = false
)
{
}

over "link4" (
apiSchemas = None
)
{
over "link4" (
active = false
)
{
}

over "link5" (
apiSchemas = None
)
{
over "link5" (
active = false
)
{
}

over "link6" (
apiSchemas = None
)
{
over "link6_1" (
active = false
)
{
}

over "gripper_end" (
apiSchemas = None
)
{
over "gripper_end" (
active = false
)
{
}

over "gripper_left" (
apiSchemas = None
)
{
over "gripper_left" (
active = false
)
{
}
}

over "gripper_right" (
apiSchemas = None
)
{
over "gripper_right" (
active = false
)
{
}
}
}
}
}
}
}
}
}
}
}

}
"physics" (
Expand Down
Loading