Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhancement: create urdf #355

Open
iory opened this issue Feb 17, 2024 · 0 comments
Open

Enhancement: create urdf #355

iory opened this issue Feb 17, 2024 · 0 comments

Comments

@iory
Copy link
Owner

iory commented Feb 17, 2024

cc: @hiroya1224

import numpy as np

from skrobot.coordinates.math import random_quaternion
from skrobot.coordinates.math import random_translation
from skrobot.coordinates.math import quaternion2rpy
from skrobot.model import RobotModel
from skrobot.model import RotationalJoint
from skrobot.model import Cylinder
from skrobot.coordinates import Coordinates
from skrobot.viewers import TrimeshSceneViewer


class JointRelative(object):
    def __init__(self,
                 reference_jointname, target_jointname,
                 relative_position, relative_rotation):
        # frame_id of reference_joint and target_joint
        self.reference_jointname = reference_jointname
        self.target_jointname = target_jointname
        # target_joint's position and rotation w.r.t. reference_joint
        # 3D vector
        self.relative_position = relative_position
        # quaternion (wxyz order) or rotation
        self.relative_rotation = relative_rotation


joint_relatives = [
    JointRelative("joint{}".format(0), "joint{}".format(1),
                      [1, 0, 0],
                      [1, 0, 0, 0],
                      ),
    JointRelative("joint{}".format(1), "joint{}".format(2),
                      [1, 0, 0],
                      [1, 0, 0, 0],
                      )
]


def generate_urdf(joint_relatives):
    urdf_template = """
<robot name="simple_robot">
  {links}
  {joints}
</robot>
"""

    link_template = """
  <link name="{name}">
    <visual>
      <geometry>
        <cylinder length="{length}" radius="0.1"/>
      </geometry>
      <origin rpy="{rpy}" xyz="{xyz}"/>
    </visual>
  </link>
"""

    joint_template = """
  <joint name="{name}" type="revolute">
    <parent link="{parent}"/>
    <child link="{child}"/>
    <origin xyz="{xyz}" rpy="{rpy}"/>
    <axis xyz="0 1 0"/>
    <limit effort="10" lower="-3.141592653589793" upper="3.141592653589793" velocity="10" />
  </joint>
"""

    links = []
    joints = []

    # Add root link
    cylinder_rpy = '0.0 1.5707963267948966 0.0'
    links.append(link_template.format(name='base_link',
                                      length=0.01,
                                      xyz='0.01 0 0',
                                      rpy=cylinder_rpy))
    joints.append(joint_template.format(
        name=f"joint0",
        parent='base_link',
        child='link_joint0',
        xyz="0 0 0",
        rpy="0 0 0",
    ))

    for i, joint_relative in enumerate(joint_relatives):
        # Add link
        length = np.linalg.norm(joint_relative.relative_position)
        links.append(link_template.format(
            name='link_' + joint_relative.reference_jointname,
            length=length,
            xyz=" ".join(map(str, [length / 2.0, 0, 0])),
            # xyz=" ".join(map(str, [0, 0, 0])),
            rpy=cylinder_rpy))

        # Add joint
        parent_link = 'link_' + joint_relative.reference_jointname
        joints.append(joint_template.format(
            name=f"joint{i + 1}",
            parent=parent_link,
            child='link_' + joint_relative.target_jointname,
            xyz=" ".join(map(str, joint_relative.relative_position)),
            rpy=" ".join(map(str, quaternion2rpy(joint_relative.relative_rotation)[0])),
        ))

    links.append(link_template.format(
        name='link_' + joint_relative.target_jointname,
        length=0.01,
        xyz="0.005 0 0",
        rpy=cylinder_rpy))

    urdf_str = urdf_template.format(links="\n".join(links), joints="\n".join(joints))
    return urdf_str


urdf_str = generate_urdf(joint_relatives)
out_urdfpath = '/tmp/robot.urdf'
with open(out_urdfpath, 'w') as f:
    f.write(urdf_str)

robot_model = RobotModel()
robot_model.load_urdf_file(open(out_urdfpath))
viewer = TrimeshSceneViewer()
viewer.add(robot_model)
viewer.show()
robot_model.joint0.joint_angle(0.4)
robot_model.joint1.joint_angle(-0.5)

robot_model.joint0.joint_angle(0.4)
robot_model.joint1.joint_angle(-0.5)
robot_model.inverse_kinematics(
    target_coords=Coordinates(pos=[1.9, 0, 0]),
    rotation_axis=False,
    move_target=robot_model.link_joint2)
# array([-0.3183119 ,  0.63661397,  0.        ], dtype=float32)
viewer.redraw()
print(robot_model.link_joint2.copy_worldcoords())
#<Coordinates 0x176d61c50 1.900 0.000 0.000 / 0.0 0.3 0.0>

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

No branches or pull requests

1 participant