def test_programatic_robot_model(): robot = RobotModel("robot") link0 = robot.add_link("link0") link1 = robot.add_link("link1") robot.add_joint("joint1", Joint.CONTINUOUS, link0, link1) assert(['link0', 'joint1', 'link1'] == list(robot.iter_chain())) link2 = robot.add_link("link2") robot.add_joint("joint2", Joint.CONTINUOUS, link1, link2) assert(['link0', 'joint1', 'link1', 'joint2', 'link2'] == list(robot.iter_chain()))
def test_programmatic_robot_model(): robot = RobotModel("robot") link0 = robot.add_link("link0") link1 = robot.add_link("link1") robot.add_joint("joint1", Joint.CONTINUOUS, link0, link1) assert (['link0', 'joint1', 'link1'] == list(robot.iter_chain())) link2 = robot.add_link("link2") robot.add_joint("joint2", Joint.CONTINUOUS, link1, link2) assert (['link0', 'joint1', 'link1', 'joint2', 'link2'] == list(robot.iter_chain())) urdf = URDF.from_robot(robot) robot_reincarnated = RobotModel.from_urdf_string(urdf.to_string()) assert (['link0', 'joint1', 'link1', 'joint2', 'link2'] == list(robot_reincarnated.iter_chain()))
from compas.geometry import Translation from compas.robots import Joint from compas.robots import RobotModel from compas_fab.rhino import RobotArtist from compas_fab.robots import Configuration # create cylinder in yz plane radius, length = 0.3, 5 cylinder = Cylinder(Circle(Plane([0, 0, 0], [1, 0, 0]), radius), length) cylinder.transform(Translation([length / 2., 0, 0])) # create robot robot = RobotModel("robot", links=[], joints=[]) # add first link to robot link0 = robot.add_link("world") # add second link to robot mesh = Mesh.from_shape(cylinder) link1 = robot.add_link("link1", visual_mesh=mesh, visual_color=(0.2, 0.5, 0.6)) # add the joint between the links axis = (0, 0, 1) origin = Frame.worldXY() robot.add_joint("joint1", Joint.CONTINUOUS, link0, link1, origin, axis) # add another link mesh = Mesh.from_shape(cylinder) # create a copy! link2 = robot.add_link("link2", visual_mesh=mesh, visual_color=(0.5, 0.6, 0.2)) # add another joint to 'glue' the link to the chain
from compas.robots import RobotModel from compas.robots import Joint robot = RobotModel('tom') # ============================================================================== # Links # ============================================================================== base = robot.add_link('base') shoulder = robot.add_link('shoulder') arm = robot.add_link('arm') forearm = robot.add_link('forearm') wrist = robot.add_link('wrist') hand = robot.add_link('hand') # ============================================================================== # Joints # ============================================================================== base_joint = robot.add_joint('base-shoulder', Joint.REVOLUTE, base, shoulder) shoulder_joint = robot.add_joint('shoulder-arm', Joint.REVOLUTE, shoulder, arm) elbow_joint = robot.add_joint('arm-forearm', Joint.REVOLUTE, arm, forearm) wrist_joint = robot.add_joint('forearm-wrist', Joint.REVOLUTE, forearm, wrist) hand_joint = robot.add_joint('wrist-hand', Joint.CONTINUOUS, wrist, hand) # ============================================================================== # Visualization # ============================================================================== print(robot)
from compas.utilities import remap_values import compas_rhino from compas_rhino.artists import FrameArtist, LineArtist, CylinderArtist from compas_rhino.artists import RobotModelArtist robot = RobotModel('tom') # ============================================================================== # Links # ============================================================================== cylinder = Cylinder(Circle(Plane(Point(0, 0, 0), Vector(0, 0, 1)), 0.5), 0.02) mesh = Mesh.from_shape(cylinder, u=32) base = robot.add_link('base', visual_meshes=[mesh], visual_color=(0.1, 0.1, 0.1)) cylinder = Cylinder(Circle(Plane(Point(0, 0, 0), Vector(0, 0, 1)), 0.2), 0.5) cylinder.transform(Translation.from_vector([0, 0, 0.25])) mesh = Mesh.from_shape(cylinder, u=24) shoulder = robot.add_link('shoulder', visual_meshes=[mesh], visual_color=(0, 0, 1.0)) cylinder = Cylinder(Circle(Plane(Point(0, 0, 0), Vector(0, 0, 1)), 0.08), 1.0) cylinder.transform(Translation.from_vector([0, 0, 0.5])) mesh = Mesh.from_shape(cylinder) arm = robot.add_link('arm', visual_meshes=[mesh], visual_color=(0.0, 1.0, 1.0)) cylinder = Cylinder(Circle(Plane(Point(0, 0, 0), Vector(0, 0, 1)), 0.08), 1.0)
from compas.geometry import Circle from compas.geometry import Cylinder from compas.geometry import Frame from compas.geometry import Plane from compas.geometry import Sphere from compas.geometry import Vector from compas_rhino.artists import RobotModelArtist model = RobotModel('drinking_bird') foot_1 = Box(Frame([2, .5, .25], [1, 0, 0], [0, 1, 0]), 1, 2, .5) foot_2 = Box(Frame([-2, .5, .25], [1, 0, 0], [0, 1, 0]), 1, 2, .5) leg_1 = Box(Frame([2, 0, 4], [1, 0, 0], [0, 1, 0]), .5, 1, 7) leg_2 = Box(Frame([-2, 0, 4], [1, 0, 0], [0, 1, 0]), .5, 1, 7) axis = Cylinder(Circle(Plane([0, 0, 7], [1, 0, 0]), .01), 4) legs_link = model.add_link('legs', visual_meshes=[foot_1, foot_2, leg_1, leg_2, axis]) torso = Cylinder(Circle(Plane([0, 0, 0], [0, 0, 1]), .5), 8) torso_link = model.add_link('torso', visual_meshes=[torso]) legs_joint_origin = Frame([0, 0, 7], [1, 0, 0], [0, 1, 0]) joint_axis = Vector(1, 0, 0) model.add_joint('torso_base_joint', Joint.CONTINUOUS, legs_link, torso_link, legs_joint_origin, joint_axis) head = Sphere([0, 0, 0], 1) beak = Cylinder(Circle(Plane([0, 1, -.3], [0, 1, 0]), .3), 1.5) head_link = model.add_link('head', visual_meshes=[head, beak]) neck_joint_origin = Frame([0, 0, 4], [1, 0, 0], [0, 1, 0]) model.add_joint('neck_joint', Joint.FIXED,
from compas.geometry import Frame from compas.geometry import Plane from compas.geometry import Translation from compas.robots import Joint from compas.robots import RobotModel # create cylinder in yz plane radius, length = 0.3, 5 cylinder = Cylinder(Circle(Plane([0, 0, 0], [1, 0, 0]), radius), length) cylinder.transform(Translation.from_vector([length / 2., 0, 0])) # create robot model = RobotModel("robot", links=[], joints=[]) # add first link to robot link0 = model.add_link("world") # add second link to robot mesh = Mesh.from_shape(cylinder) link1 = model.add_link("link1", visual_mesh=mesh, visual_color=(0.2, 0.5, 0.6)) # add the joint between the links axis = (0, 0, 1) origin = Frame.worldXY() model.add_joint("joint1", Joint.CONTINUOUS, link0, link1, origin, axis) # add another link mesh = Mesh.from_shape(cylinder) # create a copy! link2 = model.add_link("link2", visual_mesh=mesh, visual_color=(0.5, 0.6, 0.2)) # add another joint to 'glue' the link to the chain
# Rhino from compas.datastructures import Mesh from compas.geometry import * from compas.robots import Joint, RobotModel from compas_fab.rhino import RobotArtist from compas_fab.robots import Configuration # create cylinder in yz plane radius, length = 0.3, 5 cylinder = Cylinder(Circle(Plane([0, 0, 0], [1, 0, 0]), radius), length) cylinder.transform(Translation([length / 2., 0, 0])) mesh = Mesh.from_shape(cylinder) # create robot robot = RobotModel("robot", links=[], joints=[]) link0 = robot.add_link("world") # Add all other links to robot for count in range(1, 8): # add new link to robot robot.add_link("link" + str(count), visual_mesh=mesh.copy(), visual_color=(count * 0.72 % 1.0, count * 0.23 % 1.0 , 0.6)) # add the joint between the last two links axis = (0, 0, 1) origin = Frame((length , 0, 0), (1, 0, 0), (0, 1, 0)) robot.add_joint("joint" + str(count), Joint.CONTINUOUS, robot.links[-2] , robot.links[-1], origin, axis) artist = RobotArtist(robot) artist.clear_layer() joint_names = robot.get_configurable_joint_names()