Skip to content

Conversation

Viswesh-N
Copy link
Contributor

No description provided.

@Viswesh-N Viswesh-N changed the title added SO-101 initial draft SO-101 Support Jul 10, 2025
@@ -337,11 +337,11 @@

<!-- Joint from gripper to moving_jaw_so101_v1 -->
<joint name="gripper" type="revolute">
<origin xyz="0.0202 0.0188 -0.0234" rpy="1.5708 -0.909 -1.41553e-15"/>
<origin xyz="0.0202 0.0188 -0.0234" rpy="1.5708 -5.24284e-08 -1.41553e-15"/>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this e-08 value should just be 0?

<parent link="gripper_link"/>
<child link="moving_jaw_so101_v1_link"/>
<axis xyz="0 0 1"/>
<limit effort="0" velocity="10" lower="-1.13778" upper="1.16081"/>
<limit effort="10" velocity="10" lower="-0.174533" upper="2.0944"/>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we don't use effort but just checking these values of 10 are copied from the original so101 urdf, the new calibrated one here right https://github.com/TheRobotStudio/SO-ARM100/blob/main/Simulation/SO101/so101_new_calib.urdf

@@ -398,7 +398,7 @@
<!-- Joint from upper_arm to lower_arm -->
<!-- Note: 5-degree calibration offset applied to joint limits -->
<joint name="elbow_flex" type="revolute">
<origin xyz="-0.11257 -0.028 1.73763e-16" rpy="-3.63608e-16 0.03 1.5708"/>
<origin xyz="-0.11257 -0.028 1.73763e-16" rpy="-3.63608e-16 8.74301e-16 1.4408"/>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

e-16 should just be 0

@@ -438,7 +438,7 @@

<!-- Joint from base to shoulder -->
<joint name="shoulder_pan" type="revolute">
<origin xyz="0.0388353 -8.97657e-09 0.0624" rpy="3.14159 4.18253e-17 -3.14159"/>
<origin xyz="0.0388353 -8.97657e-09 0.0624" rpy="3.14159 4.18253e-17 -3.20159"/>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

e-17 should be 0.

I noticed the official urdfs from the robotstudio used the e-17 values, but we should use 0 (and I'll tell them they should use 0 as well).

from lerobot.common.motors.motors_bus import MotorNormMode
from lerobot.common.robots.robot import Robot
from lerobot.common.utils.robot_utils import busy_wait
from cameras.camera import Camera
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this seems like a wrong import

@@ -58,6 +58,8 @@ def set_target_qpos(self, qpos: Array):
# NOTE (stao): It seems the calibration from LeRobot has some offsets in some joints. We fix reading them here to match the expected behavior
if self.real_robot.name == "so100_follower":
qpos["elbow_flex.pos"] = qpos["elbow_flex.pos"] + 6.8
elif self.real_robot.name == "so101_follower":
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is not needed the elif. In another PR we will also remove the SO100 one.

@@ -113,6 +115,8 @@ def get_qpos(self):
# NOTE (stao): It seems the calibration from LeRobot has some offsets in some joints. We fix reading them here to match the expected behavior
if self.real_robot.name == "so100_follower":
qpos_deg["elbow_flex"] = qpos_deg["elbow_flex"] - 6.8
elif self.real_robot.name == "so101_follower":
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this elif is also not needed

<?xml version="1.0" ?>
<robot name="so101">

<!-- TODO: Check if this is correct -->
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you verify this? Basically run the demo robot code in cpu sim, and open the contact tab and check there aren't any impossible self collisions being detected or considered

@StoneT2000
Copy link
Member

StoneT2000 commented Jul 18, 2025

Is there a reason why the SO101 task is not set to be at the "normalized" 0 position? For consistency we want to reset to this "right angle, 0" position (even though in radians the joints wont be a multiple of np.pi/2). This way in the real world it also easier for users to do alignment as measuring multiples of 90 degrees is much easier.

We will do the same treatment for SO100 later as well once we fix that URDF rpy and limits as well

image Screenshot from 2025-07-17 22-08-35

@StoneT2000
Copy link
Member

Another is we can decompose the mesh for the moving jaw a bit more on the SO101? To achieve the same quality as the SO100 one. You can even use the same collision mesh file probably.

Here is SO100 overlaid

image

Here is SO101 overlaid at the moment. Red circles mark some discrepancies

image

@StoneT2000
Copy link
Member

@Viswesh-N looking at the PR again. The collision meshes are still too off. For the moving jaw you may need two stl files to describe it and add both of them into the urdf, we load these both individually to form a non convex shape. SO100 modelling does this as well.

SRDF also needs updating. wrist_link and the moving_jaw_so101_v1_link are marked as potentially colliding when they can't actually collide.

@StoneT2000
Copy link
Member

image finally this rest position seems off and not at the expected right angles. Can those be fixed as well?

@StoneT2000
Copy link
Member

One more thing, some of the values that should be 0 are really just those smaller than 1e-16 (at that precision it was probably a typo it was that small). Other values (like inertias which often are 1e-5 to 1e-8 range) should be kept the same.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants