.. _examples_rfl: ******************************************************************************** RFL Simulation examples ******************************************************************************** .. contents:: RFL simulation requires a running instance of `v-rep `_ with the RFL scene pre-loaded. There are two options to run v-rep: * `Download it `_, install it and open the RFL scene file contained in this package (``fab\robots\rfl\vrep_remote_api\rfl_scene.ttt``). * Install as a service using Docker (only on Windows 10 and higher): * Make sure you have `Docker `_ installed. * Run the following commands on the command line:: docker pull gramaziokohler/vrep-rfl docker run --restart=always -p 19997:19997 -d gramaziokohler/vrep-rfl Basic example ============= The most basic example is just connect to the simulator and verify the connection is working. Copy and paste the following example and run it, you should see ``Connected: True`` if everything is working properly:: from compas_fab.fab.robots.rfl import * with Simulator() as simulator: print ('Connected: %s' % simulator.is_connected()) Forward Kinematics ==================== Moving robots ------------- The RFL has 4 robots that can be referenced by an identifier: ``11``, ``12``, ``21`` and ``22``. .. image:: rfl.png It's important to make sure all four of them are positioned correctly and not colliding with each other at start, otherwise path planning will fail. The position of a robot is specified as an instance of :class:`compas_fab.fab.robots.rfl.Configuration`. Here's a simple example on how to position two of the robots using forward kinematics:: from compas_fab.fab.robots.rfl import * config_robot_a = Configuration.from_joints_and_external_axes([190, 0, 0, 0, 90, 0], [8260, -1000, -3690]) config_robot_b = Configuration.from_joints_and_external_axes([190, 0, 0, 0, 90, 0], [8260, -8320, -3690]) with Simulator() as simulator: robot_a = Robot(11, client=simulator) robot_b = Robot(12, client=simulator) simulator.set_robot_config(robot_a, config_robot_a) simulator.set_robot_config(robot_b, config_robot_b) Inverse Kinematics ================== Basic path planning example --------------------------- Calculating a path plan requires several parameters to be configured in order to start the process. In its minimal expression, a path planning request must define a start configuration and a goal pose and rely on defaults for the rest. Here is an example of such a request:: from compas_fab.fab.robots import Pose from compas_fab.fab.robots.rfl import * start_config = Configuration.from_joints_and_external_axes([-143, 37, -112, 0, -15, -126], [8260, -5320, -3690]) goal_pose = Pose.from_list([-1.0, 0.0, 0.0, 8110, 0.0, 0.0, -1.0, 7020, 0.0, -1.0, 0.0, 1810]) with Simulator() as simulator: robot = Robot(12, client=simulator) simulator.set_robot_config(robot, start_config) path = simulator.find_path_plan(robot, goal_pose) print('Found path of %d steps' % len(path)) Complete path planning example ------------------------------ The following example showcases a lot of the configuration options available when calculating a path plan:: import logging from compas.datastructures.mesh import Mesh from compas_fab import get_data from compas_fab.fab.robots import Pose from compas_fab.fab.robots.rfl import * # Configure logging to DEBUG to see detailed timing of the path planning logging.basicConfig(level=logging.DEBUG) # Configure parameters for path planning start_pose = Pose.from_list([0.0, 1.0, 0.0, 7453, -1.0, 0.0, 0.0, 10919, 0.0, 0.0, 1.0, 609]) goal_pose = Pose.from_list([-1.0, 0.0, 0.0, 8110, 8.97e-13, 0.0, -1.0, 6920, 0.0, -1.0, 0.0, 1810]) algorithm = 'rrtconnect' max_trials = 1 resolution = 0.02 building_member = Mesh.from_obj(get_data('timber_beam.obj')) structure = [Mesh.from_obj(get_data('timber_structure.obj'))] metric = [0.1] * 9 fast_search = True with Simulator(debug=True) as simulator: robot = Robot(12, client=simulator) simulator.reset_all_robots() simulator.pick_building_member(robot, building_member, start_pose) path = simulator.find_path_plan(robot, goal_pose, metric_values=metric, collision_meshes=structure, algorithm=algorithm, trials=max_trials, resolution=resolution, shallow_state_search=fast_search) print('Found path of %d steps' % len(path)) Grasshopper integration ======================= .. image:: grasshopper.png Besides the examples above that can be run standalone or inside CAD software, this package contains a ready-made integration for Grasshopper that allows configuration of most available parameters. See :download:`this basic example ` and then :download:`this complete path planning example ` for Grasshopper.