GithubHelp home page GithubHelp logo

wpi-aim / ambf Goto Github PK

View Code? Open in Web Editor NEW
147.0 18.0 58.0 261.04 MB

Asynchronous Multi-Body Framework

CMake 4.30% C++ 76.50% Python 17.98% Shell 0.08% C 0.39% GLSL 0.66% Dockerfile 0.09%
dynamic-simulations surgical-robots soft-body-simulator real-time-simulation

ambf's Introduction

Asynchronous Multi-Body Framework (AMBF)

Author: Adnan Munawar ([email protected])

Build Status

ambf-2.0

Please checkout the discussions tab for questions, suggestions, and connecting with the community.

2. Wiki:

Please check out the Wiki for in-depth details about AMBF, its components, examples, and concepts. You can also check out the video below for a brief rundown of some of the features of AMBF.

AMBF Simulator

3. Description:

This multi-body framework offers a real-time dynamic simulation of robots, free bodies, and multi-link puzzles coupled with real-time haptic interaction via several haptic devices (CHAI-3D) (including dVRK Manipulators and Razer Hydras). It also provides a Python client for training NN and RL Agents on real-time data with the simulation in the loop. This framework is built around several external tools that include an extended version of CHAI-3D (developed alongside AMBF), BULLET-Physics, Open-GL, GLFW, yaml-cpp, pyyaml, and Eigen to name a few. Each external library has its license that can be found in the corresponding subfolder.

4. Featured Projects:

These are some example projects that are developed on/using AMBF. Please click on the project title to navigate to the project webpage.

drilling_matcap.mp4

The bone drilling simulator also provides stereoscopic view of supported Virtual Reality (VR) Head Mounted Displays (HMDs):

Barrel.Roll.Distortion.mp4
surgical_robotics_half.mp4
space_robotics_half.mp4

5. Usage:

5.1 Tested Platforms:

AMBF has been tested on Ubuntu 16.04, Ubuntu 18.04 and Ubuntu 20.04. We need a few extra steps on Ubuntu 14.04, please create an issue if you would like to get instructions for that.

Even though it is recommended to use Linux for the full feature set of AMBF using ROS, AMBF has been tested on MacOS Maverick and MacOS Mojave without ROS support.

5.2 Building:

5.2.1 Linux (Ubuntu 16.04, 18.04, 20.04):

Install the following dependencies if not present:

sudo apt install libasound2-dev libgl1-mesa-dev xorg-dev

Optional but recommended: Install the appropriate ROS 1 version for your specific Linux distribution based on the instructions here http://wiki.ros.org/ROS/Installation. Source the ROS installation by following the instructions in Section 1.5 Environment Setup here (http://wiki.ros.org/noetic/Installation/Ubuntu). Note: Change the ROS version based on which ROS you have installed.

Now we can proceed to build AMBF:

cd ~
git clone https://github.com/WPI-AIM/ambf.git
cd ambf && mkdir build
cd build
cmake ..
make

Optional but recommended (If building with ROS support): Source the correct folder to achieve system-wide availability of AMBF ROS modules.

cd ~/ambf/build/
source ./devel/setup.bash

You can also permanently add the install location in your ~/.bashrc with the following command:

echo "source ~/ambf/build/devel/setup.bash" >> ~/.bashrc
# Then either reload the terminal or run `. ~/.bashrc` for the changes to take effect

Creating an Alias: AMBF can be executed by navigating to the ambf/bin/<os> directory (i.e. cd ambf/bin/<os>) and typing ./ambf_simulator. For Linux, this may be ambf/bin/lin-x86_64 and on MacOS it may be ambf/bin/mac-x86_64. To execute ambf_simulator without having to be in the ambf/bin/<os> directory, one can set an alias at the end of the ~/.bashrc file.

# Open the ~/.bashrc file in a text editor
# At the end of the file add
alias ambf_simulator=~/ambf/bin/lin-x86_64/ambf_simulator # Replace lin-x86_64 with your OS.
# Save and close the file and reload by either relaunching the terminal or typing 
. ~/.bashrc

With the alias set, ambf_simulator can be executed from a terminal from any location. Please check that by opening a new terminal and typing

ambf_simulator

Working with Multiple ROS Workspaces: You may notice that if you have ROS packages in a Catkin workspace (e.g. ~/your_catkin_ws) then sourcing AMBF unsources that your_catkin_ws (i.e. the packages in your_catkin_ws are no longer accessible in the terminal) and vice-versa. This happens because the workspaces (your_catkin_ws and ambf/build/devel) are not properly overlaid. You can read more about workspace overlaying here: Overlaying with catkin workspaces.

In summary, if you wish to use AMBF's ROS packages (e.g. ambf_client or ambf_msgs) within a separate ROS package (e.g., your_catkin_ws), it is recommended to overlay the Catkin workspaces (other Catkin workspaces with AMBF):

  1. Ensure that AMBF is sourced in your terminal.
  2. Ensure your_catkin_ws has not been built (catkin clean and/or remove build and devel if it has been built).
  3. Build your_catkin_ws.

Under the hood this will do a caktin workspace overlay, which will make sure AMBF is sourced whenever you source your_catkin_ws and that sourcing your_catkin_ws does not make the AMBF packages "unsource"/get overwritten in the environment variables.

5.2.2 Mac OS

If you don't have Boost libraries, you will need to install them as follows

  1. Install Xcode from App Store
  2. Install command-line tools by running this in the terminal xcode-select --install
  3. Install Homebrew view running this in terminal /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  4. Install boost by running the following in the terminal brew install boost

To build the framework (Linux and Mac-OS):

cd ~
git clone https://github.com/WPI-AIM/ambf.git
cd ambf && mkdir build
cd build
cmake ..
make

5.3 Running AMBF:

Having completed the steps above running AMBF is easy.

On Linux OS, open a terminal and run roscore.

roscore

Then depending on what OS you're using simply follow the commands below in a new terminal:

ambf_simulator

5.4 Launching Specific AMBF Description Format (ADF) Files:

There are two ways to launch an ADF file:

  1. Using the integer index of the filename specified in the launch file
  2. Providing the explicit filename(s).
5.4.1 Using the Integer Index in the launch file

The -l command-line argument can be used to launch a specific ADF file at launch using indexing. The ADF files are defined in ambf_models/descriptions/launch.yaml and are commented with indices for ease of identification. By default, launching the simulator without the -l command line argument loads the first 1 ADF file defined in the (launch.yaml)[./ambf_models/descriptions/launch.yaml]. To launch a specific ADF file you can use the -l flag with its integer index as follows:

ambf_simulator -l 4

This command will launch the 4th ADF file defined in the launch.yaml file. To launch multiple ADF files, you can use a comma-separated list (without spaces in between) of integers indices e.g.ambf_simulator -l 1,6,10. This in turn would load the ADF files defined at 1, 6, and the 10th index in the launch.yaml file.

5.4.2 Providing the fully qualified filename

The second option is to use the -a flag. For example, if one has an AMBF description file in the home directory /users/potato/tests/robot.yaml, this file can be launched directly as follows

ambf_simulator -a /users/potato/tests/robot.yaml

Similarly, as is the case with the -l flag, multiple filenames can be launched by comma-separated values. E.g.

ambf_simulator -a /users/potato/tests/robot.yaml,/users/potato/tests/car.yaml

Lastly, the -l and -a flags can be used together to launch some files based on the index and some based on the filenames.

5.4.3 Note:

The entry point to AMBF is via the launch file located in ambf/ambf_models/descriptions/launch.yaml. This is a meta-data file that contains filepaths of a world description file, an input-device file, and scene-data files (that may define a group of links, joints, sensors, actuators, cameras, lights, etc.).

6 Creating custom AMBF Description Format (ADF) Files:

Robots and scene data are defined using the ADF files. These can be created either by hand or by using the blender-ambf addon. Please refer to its documentation for loading and creating ADF files in Blender.

7 Interacting with the Robots/Bodies in AMBF:

There are multiple ways of interacting with the bodies in the simulator. If you are using Linux, the provided Python client offers a convenient user interface and robust API.

For the full feature set of the AMBF, it is advised that you install it on Linux (Ubuntu) 16, 17, or 18. Other variants might be supported but have not yet been tested.

7.1 The AMBF Python Client

The simplest way to interact with bodies in the AMBF is by using the high-speed Asynchronous Communication Interface that is implemented via ROS-topics in the AMBF Framework Library. One can use either C++ or Python for this purpose. A convenient Python Client is provided for easy interaction.

Start AMBF with the desired ADF file.

Then, in your Python application

# Import the Client from ambf_comm package
# You might have to do: pip install gym
from ambf_client import Client
import time

# Create an instance of the client
_client = Client()

# Connect the client which in turn creates callable objects from ROS topics
# and initiates a shared pool of threads for bi-directional communication
_client.connect()

# You can print the names of objects found
print(_client.get_obj_names())

# Lets say from the list of printed names, we want to get the
# handle to an object named "Torus"
torus_obj = _client.get_obj_handle('Torus')

# Now you can use the torus_obj to set and get its position, rotation,
# Pose etc. If the object has joints, you can also control them
# in either position control mode or open-loop effort mode. You can even mix and
# match the joints commands
torus_obj.set_pos(0, 0, 0) # Set the XYZ Pos in obj's World frame
torus_obj.set_rpy(1.5, 0.7, .0) # Set the Fixed RPY in World frame
time.sleep(5) # Sleep for a while to see the effect of the command before moving on

# Other methods to control the obj position include
# torus_obj.set_pose(pose_cmd) # Where pose_cmd is of type Geometry_msgs/Pose
# torus_obj.set_rot(quaternion) # Where quaternion is a list in the order of [qx, qy, qz, qw]
# Finally all the position control params can be controlled in a single method call
# torus_obj.pose_command(px, py, pz, roll, pitch, yaw, *jnt_cmds)

# We can just as easily get the pose information of the obj
cur_pos = torus_obj.get_pos() # xyx position in World frame
cur_rot = torus_obj.get_rot() # Quaternion in World frame
cur_rpy = torus_obj.get_rpy() # Fixed RPY in World frame

# Similarly you can directly control the wrench acting on the obj by
# The key difference is that it's the user's job to update the forces
# and torques in a loop otherwise the wrench is cleared after an internal
# watchdog timer expires if a new command is not set. This is for safety
# reasons where a user shouldn't set a wrench and then forget about it.
for i in range(0, 5000):
    torus_obj.set_force(5, -5, 10) # Set the force in the World frame
    torus_obj.set_torque(0, 0, 0.8) # Set the torque in the World frame
    time.sleep(0.001) # Sleep for a while to see the effect of the command before moving on

# Similar to the pose_command, one can assign the force in a single method call
# torus_obj.wrench_command(fx, fy, fz, nx, ny, nz) in the World frame

# We can get the number of children and joints connected to this body as
num_joints = torus_obj.get_num_joints() # Get the number of joints of this object
children_names = torus_obj.get_children_names() # Get a list of children's names belonging to this obj

print(num_joints)
print(children_names)

# If the obj has some joints, we can control them as follows
if num_joints > 1:
    torus_obj.set_joint_pos(0, 0.5) # The joints at idx 0 to 0.5 Radian
    torus_obj.set_joint_effort(1, 5) # Set the effort of the joint at idx 1 to 5 Nm
    time.sleep(2) # Sleep for a while to see the effect of the command before moving on


# Lastly to cleanup
_client.clean_up()

8 Raven and DVRK Kinematics Controller Client

See here for more information.

9 AMBF Network Setup:

To subscribe and publish data using AMBF over multiple machines, the following steps would need to be followed:

  1. Check the connectivity between the machines (example: using ssh and ping)
  2. Edit the /etc/hosts and add the hostnames of the machines, so that the machines can find each other over the network (example: similar to Adding hostname to /etc/hosts)
  3. Set the ROS environment variable in the local machine to the host using export ROS_MASTER_URI=http://hostIPaddress:11311 (ex: export ROS_MASTER_URI=http://112.115.256.121:11311)
  4. Now you should be able to send and receive ROS messages over the two machines and control AMBF.
  5. If you face any firewall issues or if you are unable to receive/publish any ROS topics over the two machines, follow the next step.
  6. Open a terminal and type the command: sudo apt-get install gufw
  7. Next type sudo gufw (type the password when prompted) and ensure both the Incoming and Outgoing traffic is allowed.

10 Docker with visualization

Please follow these instructions.

Citation

If this work is helpful for your research, please use the following reference for citation:

@INPROCEEDINGS{8968568,
author={A. {Munawar} and Y. {Wang} and R. {Gondokaryono} and G. S. {Fischer}},
booktitle={2019 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
title={A Real-Time Dynamic Simulator and an Associated Front-End Representation Format for Simulating Complex Robots and Environments},
year={2019},
volume={},
number={},
pages={1875-1882},
keywords={},
doi={10.1109/IROS40897.2019.8968568},
ISSN={2153-0858},
month={Nov},}

ambf's People

Contributors

adnanmunawar avatar cshreyastech avatar dhruvkoolrajamani avatar faridtavakol avatar htp2 avatar jieyingwu avatar kschwan avatar melodysu83 avatar mlauret avatar nag92 avatar prajankya avatar radiang avatar vigneshmanoj avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ambf's Issues

python client issue: getting object of world makes the code crash

In the make function of '/ambf/ambf_ros_modules/ambf_comm/scripts/ambf_env.py' script the world handle is assigned using the function get_obj_handle (present in '/ambf/ambf_ros_modules/ambf_comm/scripts/ambf_client.py'). But since the world doesn't have children, it is unable to set the set_publish_children_names_flag true.
Need to add an if case which excludes running that for World object.

Feature enhancement: personalize message type for topics

All all topics have same message types which could have irrelevant message types.

For example light topics has torque and velocity which are irrelevant to the topic.
Creating personalized message types for each topic category will make the topics much realistic and modular.

As suggested by @adnanmunawar , customizing light and camera topics would be good start.

@adnanmunawar, can you also list out other topic topic categories and their corresponding relevant messages to be published?

Thanks

Running ./ambf_simulator Fails w/ "failed initialization" Error on Docker

It is possible to install AMBF using the Dockerfile below (see #60 for discussion):

## Base image
FROM ros:melodic-ros-base

## Set work directory
RUN mkdir /usr/src/ambf
WORKDIR /usr/src/ambf

## Install required packages
# RUN apt-get install -y git cmake
RUN apt-get update && \
    apt-get install -y ros-melodic-desktop-full \
    libasound2-dev libgl1-mesa-dev xorg-dev libyaml-cpp-dev && \
    rm -r /var/lib/apt/lists

## Install AMBF
# Copy files into docker 
COPY . .
# Update the submodules required by ambf
RUN git submodule update --init --recursive
# Create a build subdirectory, cd into it and build
RUN . /opt/ros/melodic/setup.sh && \
    mkdir build && \
    cd build && \
    cmake .. && \
    make

## Entrypoint for the image (command that will execute when invoking docker run)
CMD ["bash"]

However, trying to run the resulting installation yields the following message. Is there any place where I can find a log to help me debug?

root@a88d8c19cf92:/usr/src/ambf/bin/lin-x86_64# ./ambf_simulator

____________________________________________________________

ASYNCHRONOUS MULTI-BODY FRAMEWORK SIMULATOR (AMBF Simulator)


                (www.aimlab.wpi.edu)
                  (Copyright 2019)
____________________________________________________________

STARTUP COMMAND LINE OPTIONS: 

InputDevices Application Usage:
  -h [ --help ]                     Show help
  -n [ --ndevs ] arg                Number of Haptic Devices to Load
  -i [ --load_devices ] arg         Index number of devices to load which is 
                                    specified in input_device.yaml
  -e [ --enableforces ] arg         Enable Force Feedback on Haptic Devices
  -p [ --phx_frequency ] arg        Physics Update Frequency (default: 1000 Hz)
  -d [ --htx_frequency ] arg        Haptics Update Frequency (default: 1000 Hz)
  -t [ --fixed_phx_timestep ] arg   Use Fixed Time-Step for Physics (default: 
                                    False)
  -f [ --fixed_htx_timestep ] arg   Use Fixed Time-Step for Haptics (default: 
                                    False)
  -a [ --load_multibody_files ] arg Description Filenames of Multi-Body(ies) to
                                    Launch, .e.g. -a <path>/test.yaml, 
                                    <another_path>/test2.yaml will load 
                                    multibodies test.yaml and test2.yaml if 
                                    they are valid files
  -l [ --load_multibodies ] arg     Index of Multi-Body(ies) to Launch, .e.g. 
                                    -l 1,2,3 will load multibodies at indexes 
                                    1,2,3. See launch.yaml file
  --launch_file arg                 Launch file path to load (default: 
                                    ../../ambf_models/descriptions/launch.yaml
  -g [ --show_gui ] arg             Show GUI
  --ns arg                          Override the default (or specified in ADF) 
                                    world namespace


------------------------------------------------------------



failed initialization

How to use Python Client

Based on the wiki here https://github.com/WPI-AIM/ambf/wiki/The-Python-Client
We can use python to control the robot

Where should the python code be saved?
I tried putting it in my own folder (outside ambf folder) and it gives this error:

Traceback (most recent call last):
File "test_ambf.py", line 2, in
from ambf_client import Client
ImportError: No module named ambf_client

I look at this issue #9
I don't understand this part
"source the ambf/build/devel folder to export ros_modules and then you should be able to import ambf_client"
Can you please elaborate?

Thank you

Runtime error

When loaded without a robot being uncommented this pops up and when the process is interrupted by Ctrl + C the simulator pops up without a robot where i can interact with the surroundings.

When a robot model is uncommented from the launch.yaml file, the message presists and simulator does not pop up when Ctrl + C is pressed.

[ERROR] [1554766455.928841748]: [registerPublisher] Failed to contact master at [localhost:11311]. Retrying...

Build Failure

MacBook Pro 2018 13 Inch Mojave 10.14.5

[ 0%] Building C object CMakeFiles/ambf_framework.dir/external/glew/src/glew.c.o
/Users/isabelzhang/ambf/external/glew/src/glew.c:1599:1: error: unknown type name 'PFNGLPROGRAMUNIFORM1DEXTPROC'
PFNGLPROGRAMUNIFORM1DEXTPROC __glewProgramUniform1dEXT = NULL;
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1600:1: error: unknown type name 'PFNGLPROGRAMUNIFORM1DVEXTPROC'
PFNGLPROGRAMUNIFORM1DVEXTPROC __glewProgramUniform1dvEXT = NULL;
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1607:1: error: unknown type name 'PFNGLPROGRAMUNIFORM2DEXTPROC'
PFNGLPROGRAMUNIFORM2DEXTPROC __glewProgramUniform2dEXT = NULL;
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1608:1: error: unknown type name 'PFNGLPROGRAMUNIFORM2DVEXTPROC'
PFNGLPROGRAMUNIFORM2DVEXTPROC __glewProgramUniform2dvEXT = NULL;
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1615:1: error: unknown type name 'PFNGLPROGRAMUNIFORM3DEXTPROC'
PFNGLPROGRAMUNIFORM3DEXTPROC __glewProgramUniform3dEXT = NULL;
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1616:1: error: unknown type name 'PFNGLPROGRAMUNIFORM3DVEXTPROC'
PFNGLPROGRAMUNIFORM3DVEXTPROC __glewProgramUniform3dvEXT = NULL;
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1623:1: error: unknown type name 'PFNGLPROGRAMUNIFORM4DEXTPROC'
PFNGLPROGRAMUNIFORM4DEXTPROC __glewProgramUniform4dEXT = NULL;
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1624:1: error: unknown type name 'PFNGLPROGRAMUNIFORM4DVEXTPROC'
PFNGLPROGRAMUNIFORM4DVEXTPROC __glewProgramUniform4dvEXT = NULL;
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1631:1: error: unknown type name 'PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC'; did you mean 'PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC'?
PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC __glewProgramUniformMatrix2dvEXT = NULL;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC
/usr/local/include/GL/glew.h:9837:28: note: 'PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC' declared here
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1633:1: error: unknown type name 'PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC'; did you mean 'PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC'?
PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC __glewProgramUniformMatrix2x3dvEXT = NULL;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC
/usr/local/include/GL/glew.h:9838:28: note: 'PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC' declared here
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1635:1: error: unknown type name 'PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC'; did you mean 'PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC'?
PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC __glewProgramUniformMatrix2x4dvEXT = NULL;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC
/usr/local/include/GL/glew.h:9839:28: note: 'PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC' declared here
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1637:1: error: unknown type name 'PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC'; did you mean 'PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC'?
PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC __glewProgramUniformMatrix3dvEXT = NULL;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC
/usr/local/include/GL/glew.h:9840:28: note: 'PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC' declared here
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1639:1: error: unknown type name 'PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC'; did you mean 'PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC'?
PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC __glewProgramUniformMatrix3x2dvEXT = NULL;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC
/usr/local/include/GL/glew.h:9841:28: note: 'PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC' declared here
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1641:1: error: unknown type name 'PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC'; did you mean 'PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC'?
PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC __glewProgramUniformMatrix3x4dvEXT = NULL;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC
/usr/local/include/GL/glew.h:9842:28: note: 'PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC' declared here
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1643:1: error: unknown type name 'PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC'; did you mean 'PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC'?
PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC __glewProgramUniformMatrix4dvEXT = NULL;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC
/usr/local/include/GL/glew.h:9843:28: note: 'PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC' declared here
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1645:1: error: unknown type name 'PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC'; did you mean 'PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC'?
PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC __glewProgramUniformMatrix4x2dvEXT = NULL;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC
/usr/local/include/GL/glew.h:9844:28: note: 'PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC' declared here
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1647:1: error: unknown type name 'PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC'; did you mean 'PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC'?
PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC __glewProgramUniformMatrix4x3dvEXT = NULL;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC
/usr/local/include/GL/glew.h:9845:28: note: 'PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC' declared here
typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:1996:1: error: unknown type name 'PFNGLGETPOINTERVPROC'
PFNGLGETPOINTERVPROC __glewGetPointerv = NULL;
^
/Users/isabelzhang/ambf/external/glew/src/glew.c:2448:1: error: unknown type name 'PFNGLCLEARDEPTHFOESPROC'; did you mean 'PFNGLCLEARDEPTHFPROC'?
PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES = NULL;
^~~~~~~~~~~~~~~~~~~~~~~
PFNGLCLEARDEPTHFPROC
/usr/local/include/GL/glew.h:3821:28: note: 'PFNGLCLEARDEPTHFPROC' declared here
typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d);
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make[2]: *** [CMakeFiles/ambf_framework.dir/external/glew/src/glew.c.o] Error 1
make[1]: *** [CMakeFiles/ambf_framework.dir/all] Error 2
make: *** [all] Error 2

Build Faliure

Getting this error when trying to build project from github clone:

In file included from /media/vidur/DATA/ambf/ambf_ros_modules/ambf_comm/include/ambf_comm/Object.h:49:0,
from /media/vidur/DATA/ambf/external/chai3d-bullet/src/CBulletGenericObject.h:56,
from /media/vidur/DATA/ambf/ambf_framework/afGripper.h:51,
from /media/vidur/DATA/ambf/ambf_framework/afGripper.cpp:46:
/media/vidur/DATA/ambf/ambf_ros_modules/ambf_comm/include/ambf_comm/ObjectRosCom.h:49:10: fatal error: ambf_msgs/ObjectState.h: No such file or directory
#include "ambf_msgs/ObjectState.h"
^~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
CMakeFiles/ambf_framework.dir/build.make:62: recipe for target 'CMakeFiles/ambf_framework.dir/ambf_framework/afGripper.cpp.o' failed
make[2]: *** [CMakeFiles/ambf_framework.dir/ambf_framework/afGripper.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/ambf_framework.dir/all' failed
make[1]: *** [CMakeFiles/ambf_framework.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2

How do we install the module ambf_client used in the example code ?

How do we install the module ambf_client used in the example code ?

On Mon, Apr 22, 2019 at 10:35 AM Adnan Munawar [email protected]
wrote:

Sorry about that. Have been restructuring the wiki a bit so the old link
became deprecated. Here is the new link.
https://github.com/WPI-AIM/ambf/wiki/Understanding-ROS-Message-Payloads

And then to get a hands-on example. Please look at these two:

https://github.com/WPI-AIM/ambf/wiki/Controlling-dVRK-Manipulators

https://github.com/WPI-AIM/ambf/wiki/Controlling-a-Toy-Car

โ€”
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
#5 (comment), or mute
the thread
https://github.com/notifications/unsubscribe-auth/AJ4Z7JUJRENYOY6OMLLBP23PRXZOZANCNFSM4HENXMZA
.

Originally posted by @vidurvij in #5 (comment)

Make (Build) Issue "fatal error: dvrk_arm/Arm.h: No such file or directory"

The error reported in #11 appears to occur when attempting to install this package on Ubuntu 18.04 without ROS installed.

Output from CMake

root@63a651139a01:/ambf/build# cmake ..
-- Boost version: 1.65.1
CMake Warning at CMakeLists.txt:104 (find_package):
  By not providing "Findcatkin.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "catkin", but
  CMake did not find one.

  Could not find a package configuration file provided by "catkin" with any
  of the following names:

    catkinConfig.cmake
    catkin-config.cmake

  Add the installation prefix of "catkin" to CMAKE_PREFIX_PATH or set
  "catkin_DIR" to a directory containing one of the above files.  If "catkin"
  provides a separate development package or SDK, be sure it has been
  installed.


USINGX86_64_ASM
-- Boost version: 1.65.1
-- Found the following Boost libraries:
--   program_options
--   filesystem
--   system
CMake Warning at CMakeLists.txt:359 (find_package):
  By not providing "Findcatkin.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "catkin", but
  CMake did not find one.

  Could not find a package configuration file provided by "catkin" with any
  of the following names:

    catkinConfig.cmake
    catkin-config.cmake

  Add the installation prefix of "catkin" to CMAKE_PREFIX_PATH or set
  "catkin_DIR" to a directory containing one of the above files.  If "catkin"
  provides a separate development package or SDK, be sure it has been
  installed.


-- Configuring done
-- Generating done
-- Build files have been written to: /ambf/build

From the CMakeLists.txt definition (shown below) I thought it would not be required. Is ROS a required dependency?

ambf/CMakeLists.txt

Lines 103 to 164 in 566e184

if (${CMAKE_SYSTEM_NAME} MATCHES Linux)
find_package(catkin COMPONENTS
roscpp
)
if (${catkin_FOUND})
message("-- *** FOUND ROS ON THIS MACHINE, ENABLING SUPPORT FOR AMBF_ROS MODULES")
add_subdirectory(${PROJECT_SOURCE_DIR}/ambf_ros_modules)
add_subdirectory(${PROJECT_SOURCE_DIR}/external/tf_function)
# Call find catkin again, with REQUIRED this time, it's okay to write over previously
# imported catkin variables
find_package(catkin QUIET COMPONENTS ambf_comm ambf_msgs dvrk_arm razer_hydra cv_bridge image_transport)
find_package(tf_function REQUIRED)
if(${ambf_comm_FOUND} AND ${ambf_msgs_FOUND} AND ${dvrk_arm_FOUND})
message("-- *** FOUND AMBF_COMM, AMBF_MSGS and DVRK_ARM, ENABLING SUPPORT")
set(AMBF_ROS_INCLUDE_DIRS ${AMBF_ROS_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
set(AMBF_ROS_LIBRARIES ${AMBF_ROS_LIBRARIES} ${catkin_LIBRARIES})
add_definitions(-DC_ENABLE_AMBF_COMM_SUPPORT)
add_definitions(-DC_ENABLE_AMBF_DVRK_SUPPORT)
set (CHAI3D_DEFINITIONS -DC_ENABLE_AMBF_COMM_SUPPORT)
set (CHAI3D_DEFINITIONS -DC_ENABLE_AMBF_DVRK_DEVICE_SUPPORT)
else()
message("-- *** AMBF_COMM, AMBF_MSGS and DVRK_ARM NOT FOUND")
endif()
find_package(OpenCV QUIET)
if(${OpenCV_FOUND})
message("-- *** FOUND OPENCV")
if(${cv_bridge_FOUND} AND ${image_transport_FOUND})
message("-- *** FOUND ROS_CV_BRIDGE and IMAGE_TRANSPORT, ENABLING SUPPORT")
add_definitions(-DAF_ENABLE_OPEN_CV_SUPPORT)
set(AMBF_ROS_INCLUDE_DIRS ${AMBF_ROS_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
set(AMBF_ROS_LIBRARIES ${AMBF_ROS_LIBRARIES} ${OpenCV_LIBRARIES})
set(AMBF_ROS_INCLUDE_DIRS ${AMBF_ROS_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
set(AMBF_ROS_LIBRARIES ${AMBF_ROS_LIBRARIES} ${catkin_LIBRARIES})
else()
message("-- *** ROS CV_BRIDGE and IMAGE_TRANSPORT NOT FOUND")
endif()
endif()
if (${razer_hydra_FOUND})
message("-- *** FOUND RAZER HYDRA'S ROS PACKAGE, ENABLING SUPPORT")
add_definitions(-DC_ENABLE_RAZER_HYDRA_DEVICE_SUPPORT)
set(AMBF_ROS_INCLUDE_DIRS ${AMBF_ROS_INCLUDE_DIRS} ${razer_hydra_INCLUDE_DIRS})
set(AMBF_ROS_LIBRARIES ${AMBF_ROS_LIBRARIES} ${razer_hydra_LIBRARIES})
add_definitions(-DC_ENABLE_RAZER_HYDRA_DEVICE_SUPPORT)
set (CHAI3D_DEFINITIONS -DC_ENABLE_RAZER_HYDRA_DEVICE_SUPPORT)
else()
message("RAZER HYDRA'S ROS PACKAGE NOT FOUND")
endif()
endif()
include_directories(${catkin_INCLUDE_DIRS})
endif()

I added the line message(${catkin_FOUND}) to the CMakeLists.txt and it correctly prints out 0 (Not detected).

[Release] Move away from cv_transport for camera topics

Move away from cv_transport libraries to publish various camera topics. Test virtual webcams, linux drivers, etc. More info to be added here once information has been gathered.

using cv_transport can cause dependency issues with various versions of opencv. To make AMBF release versions robust, image topics should be published agnostic of dependency issues so that it is open to the user to use any opencv version is a virtualenv.

build error

Hi, I'm getting this error while running make in the build dir.

[  0%] Building C object CMakeFiles/ambf_framework.dir/external/giflib/src/dev2gif.c.o
ambf/external/giflib/src/dev2gif.c:324:47: error: use of undeclared identifier 'FALSE'
    if ((GifFile = EGifOpenFileName(FileName, FALSE)) == NULL ||
                                              ^
ambf/external/giflib/src/dev2gif.c:327:65: error: use of undeclared identifier 'FALSE'
        EGifPutImageDesc(GifFile, 0, 0, ScreenXMax, ScreenYMax, FALSE,
                                                                ^
ambf/external/giflib/src/dev2gif.c:347:30: error: too few arguments to function call, expected 2, have
      1
    if (EGifCloseFile(GifFile) == GIF_ERROR) {
        ~~~~~~~~~~~~~        ^
/usr/local/include/gif_lib.h:132:1: note: 'EGifCloseFile' declared here
int EGifCloseFile(GifFileType *GifFile, int *ErrorCode);
^
ambf/external/giflib/src/dev2gif.c:502:13: warning: implicit declaration of function 'GifLastError' is
      invalid in C99 [-Wimplicit-function-declaration]
    int i = GifLastError();
            ^
ambf/external/giflib/src/dev2gif.c:504:30: error: too few arguments to function call, expected 2, have
      1
    if (EGifCloseFile(GifFile) == GIF_ERROR) {
        ~~~~~~~~~~~~~        ^
/usr/local/include/gif_lib.h:132:1: note: 'EGifCloseFile' declared here
int EGifCloseFile(GifFileType *GifFile, int *ErrorCode);
^
1 warning and 4 errors generated.
make[2]: *** [CMakeFiles/ambf_framework.dir/external/giflib/src/dev2gif.c.o] Error 1
make[1]: *** [CMakeFiles/ambf_framework.dir/all] Error 2
make: *** [all] Error 2

Build issue

I am running into an error when I use the make command.

nivii@nivii-Alienware-Aurora-R7:~/ambf/build$ make
Scanning dependencies of target ambf_framework
[  1%] Building CXX object CMakeFiles/ambf_framework.dir/ambf_framework/afInputDevices.cpp.o
In file included from /home/nivii/ambf/external/chai3d/src/chai3d.h:80:0,
                 from /home/nivii/ambf/external/chai3d-bullet/src/CBulletGenericObject.h:50,
                 from /home/nivii/ambf/external/chai3d-bullet/src/CBulletMultiMesh.h:50,
                 from /home/nivii/ambf/ambf_framework/afSoftMultiMesh.h:52,
                 from /home/nivii/ambf/ambf_framework/afFramework.h:53,
                 from /home/nivii/ambf/ambf_framework/afInputDevices.h:51,
                 from /home/nivii/ambf/ambf_framework/afInputDevices.cpp:46:
/home/nivii/ambf/external/chai3d/src/devices/CdVRKDevices.h:53:26: fatal error: dvrk_arm/Arm.h: No such file or directory
 #include <dvrk_arm/Arm.h>
                          ^
compilation terminated.
CMakeFiles/ambf_framework.dir/build.make:62: recipe for target 'CMakeFiles/ambf_framework.dir/ambf_framework/afInputDevices.cpp.o' failed
make[2]: *** [CMakeFiles/ambf_framework.dir/ambf_framework/afInputDevices.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/ambf_framework.dir/all' failed
make[1]: *** [CMakeFiles/ambf_framework.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

Does the ambf repo require setting up other dvrk related files before working with it?

Create teleop for PSM

Creating teleop for PMS would be helpful to study the joint space and Task space of PSM. It can further be used for FK and IK analysis.

a is bring striped out

I pulled the recent branch and I am getting a weird error causing all the "a"s to be stripped out

['/mbf/env/Rightthigh/Stte',
 '/mbf/env/Leftthigh/Stte',
 '/mbf/env/Rightfoot/Stte',
 '/mbf/env/Leftfoot/Stte',
 '/mbf/env/Rightshnk/Stte',
 '/mbf/env/lights/light_left/Stte',
 '/mbf/env/Hip/Stte',
 '/mbf/env/Leftshnk/Stte',
 '/cmers/defult_cmer/Stte',
 '/lights/light_right/Stte']


Memory leak problem when running in 20.04

When attempting to launch the simulator in 20.04 I get the following error:

Thread Joined: World
INFO! SETTING SIMULATION MAX ITERATIONS TO : 50
Thread Joined: light_left
Thread Joined: light_right
Thread Joined: default_camera
Thread Joined: Chassis
Thread Joined: ShockBL
Thread Joined: WheelBR
Thread Joined: ShockBR
Thread Joined: WheelBL
Thread Joined: ShockFL
Thread Joined: WheelFR
Thread Joined: ShockFR
Thread Joined: WheelFL
free(): double free detected in tcache 2
Aborted (core dumped)


Can't run python client

Installed ambf and ros. Tried to run the python client, but this error pops up instead.
System: Ubuntu 18.04, ROS Melodic, Python 2.7

 File "/home/nicholas/ambf/build/devel/lib/python2.7/dist-packages/ambf_client/__init__.py", line 35, in <module>
    exec(__fh.read())
  File "<string>", line 49, in <module>
  File "/home/nicholas/ambf/ambf_ros_modules/ambf_comm/scripts/ambf_object.py", line 49, in <module>
    from external.tf_function.transformations import quaternion_from_euler, euler_from_quaternion
ImportError: No module named external.tf_function.transformations

pInertia and mass values are not updated

While subscribing to the rostopic ObjectState, the mass and pInertia values are not being updated and consistently print zero value.
Output of subscriber:

mass value is 0.0
Inertia val is x: 0.0
y: 0.0
z: 0.0

List of prerequsite

It would be helpful to have a list of prerequisites like ubuntu versions, packages and hardware configurations to use this project

Thanks

[Discussion] Topic definition and namespace handling for multiple robots for controller design

Currently, spawning multiple instances of the same model appends a number to the link like this:

image

My suggestion is to append the number to the namespace:

image

And also have a feature of maybe storing the namespaces in a list on the param server if ros is running OR publish a topic with the namespace prefixes.

image

The need for this is for designing a controller, modifying the prefix as compared to the link names might be cleaner when describing the details of a robot in one or many environments.

Importing prespective file for dVRK raises this error in the terminal

GtkDialog mapped without a transient parent. This is discouraged.
PerspectiveManager._create_perspective(ecm-psm-mtm-rqt-gui, False)
MainWindow.save_settings()
PluginManager.save_settings()
PluginManager.save_settings() completed
Traceback (most recent call last):
File "/home/vidur/miniconda3/lib/python3.7/site-packages/shiboken2/files.dir/shibokensupport/signature/loader.py", line 111, in seterror_argument
return errorhandler.seterror_argument(args, func_name)
File "/home/vidur/miniconda3/lib/python3.7/site-packages/shiboken2/files.dir/shibokensupport/signature/errorhandler.py", line 97, in seterror_argument
update_mapping()
File "/home/vidur/miniconda3/lib/python3.7/site-packages/shiboken2/files.dir/shibokensupport/signature/mapping.py", line 255, in update
g.update(gproc_name)
File "/home/vidur/miniconda3/lib/python3.7/site-packages/shiboken2/files.dir/shibokensupport/signature/mapping.py", line 391, in init_QtCore
"QJsonObject": typing.Dict[str, PySide2.QtCore.QJsonValue],
NameError: name 'PySide2' is not defined
Fatal Python error: seterror_argument did not receive a result

Current thread 0x00007f5815ccb740 (most recent call first):
File "", line 1 in
File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui/perspective_manager.py", line 410 in _import_value
File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui/perspective_manager.py", line 400 in _convert_values
File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui/perspective_manager.py", line 403 in _convert_values
File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui/perspective_manager.py", line 403 in _convert_values
File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui/perspective_manager.py", line 403 in _convert_values
File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui/perspective_manager.py", line 342 in import_perspective_from_file
File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui/perspective_manager.py", line 329 in _on_import_perspective
File "/opt/ros/melodic/lib/python2.7/dist-packages/qt_gui/main.py", line 557 in main
File "/opt/ros/melodic/lib/python2.7/dist-packages/rqt_gui/main.py", line 59 in main
File "/opt/ros/melodic/lib/rqt_gui/rqt_gui", line 13 in
Aborted (core dumped)

Cannot get Geomagic Touch USB working with the AMBF simulator

Hello,

We are trying to connect the Geomagic Touch USB with the ambf simulator but have been unsuccessful. We are currently working on a fresh install of Ubuntu 18.04. We think we have correctly set up the Openhaptics and Touch Drivers needed and correctly set up chai3d. This is the terminal message output.

Openhaptics and Touch Drivers were installed using the direction from the following link:
https://support.3dsystems.com/s/article/OpenHaptics-for-Linux-Developer-Edition-v34?language=en_US

Thread Joined: World
INFO! SETTING SIMULATION MAX ITERATIONS TO : 50
Thread Joined: light_left
Thread Joined: light_right
Thread Joined: default_camera
Thread Joined: Chassis
Thread Joined: ShockBL
Thread Joined: WheelBR
Thread Joined: ShockBR
Thread Joined: WheelBL
Thread Joined: ShockFL
Thread Joined: WheelFR
Thread Joined: ShockFR
Thread Joined: WheelFL
****************************************
This is the DEVELOPER EDITION of OPENHAPTICS, commercial distribution is prohibited
Please contact 3D Systems to obtain a commercial license
****************************************
Found Lib: libdvrk_arm.so
No of dVRK Masters detected: 0
WARNING: FAILED TO LOAD DEVICE: "Geomagic Touch"

Please advise us on how to go about this situation.

Thank you.

Python client set_pos setting up all joints

I was using python client to set position for Kuka robot (./ambf_simulator -l 8 i.e. blender-kuka.yaml)

#! /usr/bin/env python

import time

from ambf_client import Client

_client = Client()

_client.connect()

print('\n\n----')
print("List of Objects")
print(_client.get_obj_names())

kuka_handle = _client.get_obj_handle('base')

time.sleep(0.2)
print('\n\n----')

print('Kuka Base Pos:')
print(kuka_handle.get_pos())

print('\n\n----')

print('Number of Joints in kuka:')
print(kuka_handle.get_num_joints())

print('Name of kuka\'s children:')
print(kuka_handle.get_joint_names())


print(kuka_handle.get_name())
print(kuka_handle.get_pos_command())
print(kuka_handle.get_pose())

kuka_handle.set_joint_pos(0, 1.57)
# kuka_handle.set_joint_effort(0, 10)
# kuka_handle.set_joint_effort(1, 10)

print('\n\n----')
raw_input("Let's clean up. Press Enter to continue...")
# Lastly to cleanup
_client.clean_up()

Also the blender-kuka.yaml file was updated to change PID values for all joints as a work around for the issue.
blender-kuka.yaml

# AMBF Version: (0.1)
# Generated By: ambf_addon for Blender (2.79.0)
# Link: https://github.com/WPI-AIM/ambf_addon
# Generated on: 2019-04-01 17:46:58
bodies: [BODY base, BODY link1, BODY link2, BODY link3, BODY link4, BODY link5, BODY
    link6, BODY link7]
joints: [JOINT base-link1, JOINT link1-link2, JOINT link2-link3, JOINT link3-link4,
  JOINT link4-link5, JOINT link5-link6, JOINT link6-link7]
high resolution path: ../../../meshes/blender_afmb/kuka_lwr/high_res/
low resolution path: ../../../meshes/blender_afmb/kuka_lwr/low_res/
ignore inter-collision: true
namespace: /ambf/env/
joint erp: 0.5
joint cfm: 0.3
BODY base:
  name: base
  mesh: base.STL
  mass: 0.0
  collision margin: 0.001
  scale: 1.0
  location:
    orientation: {p: -0.0, r: 0.0, y: 0.0}
    position: {x: 0.0, y: 0.0, z: -1.3}
  inertial offset:
    orientation: {p: 0, r: 0, y: 0}
    position: {x: 0.001, y: -0.0, z: 0.06}
  publish joint names: true
  publish joint positions: true
  friction: {rolling: 0.01, static: 0.5}
  damping: {angular: 0.95, linear: 0.95}
  restitution: 0
  collision groups: [0]
  color components:
    ambient: {level: 1.0}
    diffuse: {b: 0.0147, g: 0.0147, r: 0.0147}
    specular: {b: 1.0, g: 1.0, r: 1.0}
    transparency: 1.0
BODY link1:
  name: link1
  mesh: link1.STL
  mass: 1.0
  collision margin: 0.001
  scale: 1.0
  location:
    orientation: {p: -0.0, r: 0.0, y: 0.0}
    position: {x: 0.0, y: 0.0, z: -1.197}
  inertial offset:
    orientation: {p: 0, r: 0, y: 0}
    position: {x: 0.0, y: -0.017, z: 0.134}
  friction: {rolling: 0.01, static: 0.5}
  damping: {angular: 0.95, linear: 0.95}
  restitution: 0
  collision groups: [0]
  color components:
    ambient: {level: 1.0}
    diffuse: {b: 0.0054, g: 0.2702, r: 0.8}
    specular: {b: 1.0, g: 1.0, r: 1.0}
    transparency: 1.0
BODY link2:
  name: link2
  mesh: link2.STL
  mass: 1.0
  collision margin: 0.001
  scale: 1.0
  location:
    orientation: {p: -0.0, r: -1.571, y: 0.0}
    position: {x: 0.0, y: 0.013, z: -0.988}
  inertial offset:
    orientation: {p: 0, r: 0, y: 0}
    position: {x: 0.0, y: -0.074, z: 0.009}
  friction: {rolling: 0.01, static: 0.5}
  damping: {angular: 0.95, linear: 0.95}
  restitution: 0
  collision groups: [0]
  color components:
    ambient: {level: 1.0}
    diffuse: {b: 0.0647, g: 0.5619, r: 0.8}
    specular: {b: 1.0, g: 1.0, r: 1.0}
    transparency: 1.0
BODY link3:
  name: link3
  mesh: link3.STL
  mass: 1.0
  collision margin: 0.001
  scale: 1.0
  location:
    orientation: {p: -0.0, r: -0.0, y: 0.0}
    position: {x: 0.0, y: 0.004, z: -0.794}
  inertial offset:
    orientation: {p: 0, r: 0, y: 0}
    position: {x: 0.0, y: 0.017, z: 0.134}
  friction: {rolling: 0.01, static: 0.5}
  damping: {angular: 0.95, linear: 0.95}
  restitution: 0
  collision groups: [0]
  color components:
    ambient: {level: 1.0}
    diffuse: {b: 0.005, g: 0.3311, r: 1.0}
    specular: {b: 1.0, g: 1.0, r: 1.0}
    transparency: 1.0
BODY link4:
  name: link4
  mesh: link4.STL
  mass: 1.0
  collision margin: 0.001
  scale: 1.0
  location:
    orientation: {p: -0.0, r: 1.571, y: 0.0}
    position: {x: 0.0, y: -0.009, z: -0.592}
  inertial offset:
    orientation: {p: 0, r: 0, y: 0}
    position: {x: -0.001, y: 0.081, z: 0.008}
  friction: {rolling: 0.01, static: 0.5}
  damping: {angular: 0.95, linear: 0.95}
  restitution: 0
  collision groups: [0]
  color components:
    ambient: {level: 1.0}
    diffuse: {b: 0.0, g: 0.4756, r: 0.8}
    specular: {b: 1.0, g: 1.0, r: 1.0}
    transparency: 1.0
BODY link5:
  name: link5
  mesh: link5.STL
  mass: 1.0
  collision margin: 0.001
  scale: 1.0
  location:
    orientation: {p: -0.0, r: -0.0, y: 0.0}
    position: {x: -0.002, y: -0.001, z: -0.39}
  inertial offset:
    orientation: {p: 0, r: 0, y: 0}
    position: {x: 0.0, y: -0.017, z: 0.129}
  friction: {rolling: 0.01, static: 0.5}
  damping: {angular: 0.95, linear: 0.95}
  restitution: 0
  collision groups: [0]
  color components:
    ambient: {level: 1.0}
    diffuse: {b: 0.005, g: 0.3119, r: 0.9406}
    specular: {b: 1.0, g: 1.0, r: 1.0}
    transparency: 1.0
BODY link6:
  name: link6
  mesh: link6.STL
  mass: 1.0
  collision margin: 0.001
  scale: 1.0
  location:
    orientation: {p: -0.0, r: -1.571, y: 0.0}
    position: {x: 0.0, y: -0.053, z: -0.186}
  inertial offset:
    orientation: {p: 0, r: 0, y: 0}
    position: {x: -0.0, y: 0.007, z: 0.068}
  friction: {rolling: 0.01, static: 0.5}
  damping: {angular: 0.95, linear: 0.95}
  restitution: 0
  collision groups: [0]
  color components:
    ambient: {level: 1.0}
    diffuse: {b: 0.0167, g: 0.5171, r: 0.8}
    specular: {b: 1.0, g: 1.0, r: 1.0}
    transparency: 1.0
BODY link7:
  name: link7
  mesh: link7.STL
  mass: 1.0
  collision margin: 0.001
  scale: 1.0
  location:
    orientation: {p: -0.0, r: -0.0, y: 0.0}
    position: {x: -0.003, y: 0.0, z: -0.136}
  inertial offset:
    orientation: {p: 0, r: 0, y: 0}
    position: {x: 0.006, y: 0.0, z: 0.015}
  friction: {rolling: 0.01, static: 0.5}
  damping: {angular: 0.95, linear: 0.95}
  restitution: 0
  collision groups: [0]
  color components:
    ambient: {level: 1.0}
    diffuse: {b: 0.01, g: 0.01, r: 0.01}
    specular: {b: 1.0, g: 1.0, r: 1.0}
    transparency: 1.0
JOINT base-link1:
  name: base-link1
  parent: BODY base
  child: BODY link1
  parent axis: {x: 0.0, y: 0.0, z: 1.0}
  parent pivot: {x: 0.0, y: 0.0, z: 0.103}
  child axis: {x: 0.0, y: 0.0, z: 1.0}
  child pivot: {x: 0.0, y: 0.0, z: 0.0}
  joint limits: {high: 2.094, low: -2.094}
  controller: {D: 0.1, I: 0, P: 100.0}
  type: revolute
JOINT link1-link2:
  name: link1-link2
  parent: BODY link1
  child: BODY link2
  parent axis: {x: 0.0, y: 1.0, z: -0.0}
  parent pivot: {x: 0.0, y: 0.013, z: 0.209}
  child axis: {x: 0.0, y: 0.0, z: 1.0}
  child pivot: {x: 0.0, y: 0.0, z: 0.0}
  joint limits: {high: 2.094, low: -2.094}
  controller: {D: 0.1, I: 0, P: 100.0}
  type: revolute
JOINT link2-link3:
  name: link2-link3
  parent: BODY link2
  child: BODY link3
  parent axis: {x: 0.0, y: -1.0, z: 0.0}
  parent pivot: {x: 0.0, y: -0.194, z: -0.009}
  child axis: {x: 0.0, y: 0.0, z: 1.0}
  child pivot: {x: 0.0, y: 0.0, z: 0.0}
  joint limits: {high: 2.094, low: -2.094}
  controller: {D: 0.1, I: 0, P: 100.0}
  type: revolute
JOINT link3-link4:
  name: link3-link4
  parent: BODY link3
  child: BODY link4
  parent axis: {x: 0.0, y: -1.0, z: 0.0}
  parent pivot: {x: 0.0, y: -0.013, z: 0.202}
  child axis: {x: 0.0, y: 0.0, z: 1.0}
  child pivot: {x: 0.0, y: 0.0, z: 0.0}
  joint limits: {high: 2.094, low: -2.094}
  controller: {D: 0.1, I: 0, P: 100.0}
  type: revolute
JOINT link4-link5:
  name: link4-link5
  parent: BODY link4
  child: BODY link5
  parent axis: {x: 0.0, y: 1.0, z: 0.0}
  parent pivot: {x: -0.002, y: 0.202, z: -0.008}
  child axis: {x: 0.0, y: 0.0, z: 1.0}
  child pivot: {x: 0.0, y: 0.0, z: 0.0}
  joint limits: {high: 2.094, low: -2.094}
  controller: {D: 0.1, I: 0, P: 100.0}
  type: revolute
JOINT link5-link6:
  name: link5-link6
  parent: BODY link5
  child: BODY link6
  parent axis: {x: 0.0, y: 1.0, z: 0.0}
  parent pivot: {x: 0.002, y: -0.052, z: 0.204}
  child axis: {x: 0.0, y: 0.0, z: 1.0}
  child pivot: {x: 0.0, y: 0.0, z: 0.0}
  joint limits: {high: 2.094, low: -2.094}
  controller: {D: 0.1, I: 0, P: 100.0}
  type: revolute
JOINT link6-link7:
  name: link6-link7
  parent: BODY link6
  child: BODY link7
  parent axis: {x: 0.0, y: -1.0, z: 0.0}
  parent pivot: {x: -0.003, y: -0.05, z: 0.053}
  child axis: {x: 0.0, y: 0.0, z: 1.0}
  child pivot: {x: 0.0, y: 0.0, z: 0.0}
  joint limits: {high: 3.054, low: -3.054}
  controller: {D: 0.1, I: 0, P: 100.0}
  type: revolute

After running the python, below is the terminal output

----
List of Objects
['link5', 'link4', 'link7', 'link6', 'link1', 'link3', 'link2', 'lights/light_left', 'base', 'default_camera', 'World', 'lights/light_right']


----
Kuka Base Pos:
x: -0.001
y: 0.0
z: -1.36


----
Number of Joints in kuka:
7
 
Name of kuka's children:
['base-link1', 'link1-link2', 'link2-link3', 'link3-link4', 'link4-link5', 'link5-link6', 'link6-link7']
base
x: -0.001
y: 0.0
z: -1.36
[-0.001, 0.0, -1.36, -0.0, 0.0, -0.0]


----
Let's clean up. Press Enter to continue...
Closing publisher for:  link5
Closing publisher for:  link4
Closing publisher for:  link7
Closing publisher for:  link6
Closing publisher for:  link1
Closing publisher for:  link3
Closing publisher for:  link2
Closing publisher for:  lights/light_left
Closing publisher for:  base
Closing publisher for:  default_camera
Closing publisher for:  World
Closing publisher for:  lights/light_right

Below is the output of running rostopic echo /ambf/env/base/Command

---
header: 
  seq: 201578
  stamp: 
    secs: 1568321596
    nsecs: 638394117
  frame_id: ''
enable_position_controller: False
pose: 
  position: 
    x: 0.0
    y: 0.0
    z: 0.0
  orientation: 
    x: 0.0
    y: 0.0
    z: 0.0
    w: 0.0
wrench: 
  force: 
    x: 0.0
    y: 0.0
    z: 0.0
  torque: 
    x: 0.0
    y: 0.0
    z: 0.0
joint_cmds: [1.5700000524520874, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
position_controller_mask: [True, True, True, True, True, True, True]
publish_children_names: False
publish_joint_names: False
publish_joint_positions: False

Ambf simulator is being sent all the joint positions from ambf_client, which as discussed with @adnanmunawar is not how it is should be.

[Release] Add a CI

  • Add a CI to test pull requests and commits to check for a stable version of AMBF.
  • Test instance with ros-base only
  • Add tests for learning-based methods and for virtual environments.

Publish joint names/positions will turn off

ObjectCmd seems to default the publish the names/positions to "OFF"
so if I send a cmd to the model without always turning the fields to on I stop getting joint
data.

I think that the default values should be turned on or maybe should be a service request.

build failure

The following error occured while building the ambf simulator from git repository:

/usr/bin/ld: ../libambf_framework.a(CBulletGenericObject.cpp.o): undefined reference to symbol 'ZNK3ros9Publisher7publishERKN5boost8functionIFNS_17SerializedMessageEvEEERS3'
//opt/ros/melodic/lib/libroscpp.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
ambf_simulator/CMakeFiles/ambf_simulator.dir/build.make:135: recipe for target '../bin/lin-x86_64/ambf_simulator' failed
make[2]: *** [../bin/lin-x86_64/ambf_simulator] Error 1
CMakeFiles/Makefile2:1163: recipe for target 'ambf_simulator/CMakeFiles/ambf_simulator.dir/all' failed
make[1]: *** [ambf_simulator/CMakeFiles/ambf_simulator.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2

error while building

I am getting this error while building.

In file included from /home/nagoldfarb/ambf/ambf_ros_modules/ambf_comm/include/ambf_comm/Object.h:49:0,
                 from /home/nagoldfarb/ambf/external/chai3d-bullet/src/CBulletGenericObject.h:56,
                 from /home/nagoldfarb/ambf/ambf_framework/afGripper.h:51,
                 from /home/nagoldfarb/ambf/ambf_framework/afGripper.cpp:46:
/home/nagoldfarb/ambf/ambf_ros_modules/ambf_comm/include/ambf_comm/ObjectRosCom.h:49:10: fatal error: ambf_msgs/ObjectState.h: No such file or directory
 #include "ambf_msgs/ObjectState.h"
          ^~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
CMakeFiles/ambf_framework.dir/build.make:62: recipe for target 'CMakeFiles/ambf_framework.dir/ambf_framework/afGripper.cpp.o' failed
make[2]: *** [CMakeFiles/ambf_framework.dir/ambf_framework/afGripper.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/ambf_framework.dir/all' failed
make[1]: *** [CMakeFiles/ambf_framework.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2

use both vel and velocity(ies)

In rigid body class half the functions use "vel" and the other half use "velocity". Should this be consistent? It would make it easier to have the same names style through out.

No module named 'catkin_pkg'

cmake ..

-- Found gmock sources under '/usr/src/gmock': gmock will be built
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Found gtest sources under '/usr/src/gmock': gtests will be built
-- Using Python nosetests: /usr/bin/nosetests
ImportError: "from catkin_pkg.package import parse_package" failed: No module named 'catkin_pkg'
Make sure that you have installed "catkin_pkg", it is up to date and on the PYTHONPATH.
CMake Error at /opt/ros/kinetic/share/catkin/cmake/safe_execute_process.cmake:11 (message):
execute_process(/home/nvidia/archiconda3/bin/python
"/opt/ros/kinetic/share/catkin/cmake/parse_package_xml.py"
"/opt/ros/kinetic/share/catkin/cmake/../package.xml"
"/home/nvidia/ambf/build/catkin/catkin_generated/version/package.cmake")
returned error code 1
Call Stack (most recent call first):
/opt/ros/kinetic/share/catkin/cmake/catkin_package_xml.cmake:74 (safe_execute_process)
/opt/ros/kinetic/share/catkin/cmake/all.cmake:167 (_catkin_package_xml)
/opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:20 (include)
CMakeLists.txt:102 (find_package)

Soft bodies collisions

Good afternoon,

I am trying to import a soft body in AMBF and make it interact with a PSM. AMBF is used on Ubuntu 18.04 with ROS melodic. I have been facing however some problems with the interaction between soft bodies and the PSM, and in general between soft bodies/rigid bodies and between soft bodies/soft bodies.
To get started with soft bodies I imported the cloth example in the folder ambf/ambf_models/descriptions/multi-bodies/sb into the framework. To make things easier, I constrained the cloth in 4 points at the corners so that it was fixed horizontally.

PSM_cloth_horizontal

Then, I wrote a simple python client code for the PSM to make it collide with the cloth (just moving down the main insertion link). What happens is that:

  1. Changing the value of different parameters in the yaml file of both the cloth and the PSM (like collision margin for example), in some cases collision does not occur at all and the PSM penetrates into the cloth, sometimes collision occur for a certain part of the robotic arm but not for others.

  2. Simulation in any case slows down too much when the collision occurs and the Phx frequency dramatically decreases using a variable time-step.

  3. If the PSM and the cloth are in the same scene and using a variable time-step, and I try to run the python client code for the PSM so that they collide, the PSM does not work properly but has a completely unpredictable behaviour with random movements and thus it is impossible to control.

About points 2 and 3, I noticed that using a fixed physics time-step (with the โ€“t true option) things improve but are anyway not optimal and the Sim time is slower. The Phx frequency increases a little and if I run the python client, the PSM seems to do its job, even if random oscillations are still present and the simulation is not stable.
I also tried to change the position of the cloth for example by constraining it into 2 points only and making then the PSM interact with it. The PSM penetrates sometimes the tissue with certain parts and the simulation is, again, not stable at all.

PSM_through_cloth_vertical

Both the previous images represent a simulation done with fixed time-step for physics, otherwise, as said previously, it would have been impossible to move the PSM with the python client.

I found similar issues in collisions even with other bodies, for instance with a rigid box and a soft sphere (they completely penetrate), or the same with a soft sphere and a soft torus. It is a problem that could be related to the Bullet physics engine behind the framework.
It would be really helpful for me to have some more examples of soft bodies to understand better how these objects work in this simulation environment.

I hope you can help me to solve these issues.

Unable to CMake Ubuntu 18.04 and OSX 15.4

Following the instructions for building outlined in the README I get the following error in both Linux and Unix:

LInux:

root@a89495270a39:/home/ambf/build# cmake ..
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at CMakeLists.txt:92 (find_package):
  By not providing "Findyaml-cpp.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "yaml-cpp",
  but CMake did not find one.

  Could not find a package configuration file provided by "yaml-cpp" with any
  of the following names:

    yaml-cppConfig.cmake
    yaml-cpp-config.cmake

  Add the installation prefix of "yaml-cpp" to CMAKE_PREFIX_PATH or set
  "yaml-cpp_DIR" to a directory containing one of the above files.  If
  "yaml-cpp" provides a separate development package or SDK, be sure it has
  been installed.


-- Configuring incomplete, errors occurred!
See also "/home/ambf/build/CMakeFiles/CMakeOutput.log".
root@a89495270a39:/home/ambf/build# 

Unix:

 build git:(master) cmake ..          
CMake Error at CMakeLists.txt:92 (find_package):
  By not providing "Findyaml-cpp.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "yaml-cpp",
  but CMake did not find one.

  Could not find a package configuration file provided by "yaml-cpp" with any
  of the following names:

    yaml-cppConfig.cmake
    yaml-cpp-config.cmake

  Add the installation prefix of "yaml-cpp" to CMAKE_PREFIX_PATH or set
  "yaml-cpp_DIR" to a directory containing one of the above files.  If
  "yaml-cpp" provides a separate development package or SDK, be sure it has
  been installed.


-- Configuring incomplete, errors occurred!
See also "/Users/admin/Software/ambf/build/CMakeFiles/CMakeOutput.log".

Before I start trying to debug: Has anyone seen this error before?

build failure nvidia TX2 - cpuid.h: No such file or directory

Trying to build in nvidia TX2 and running into below issue. This seems to be a known issue with TX2 but wanted to have it marked to track.

[ 29%] Building C object CMakeFiles/ambf_framework.dir/external/openal/Alc/helpers.c.o
/home/nvidia/ambf/external/openal/Alc/helpers.c:59:19: fatal error: cpuid.h: No such file or directory
compilation terminated.
CMakeFiles/ambf_framework.dir/build.make:3518: recipe for target 'CMakeFiles/ambf_framework.dir/external/openal/Alc/helpers.c.o' failed
make[2]: *** [CMakeFiles/ambf_framework.dir/external/openal/Alc/helpers.c.o] Error 1
CMakeFiles/Makefile2:711: recipe for target 'CMakeFiles/ambf_framework.dir/all' failed
make[1]: *** [CMakeFiles/ambf_framework.dir/all] Error 2
Makefile:138: recipe for target 'all' failed
make: *** [all] Error 2

set_joint_pos to 0 on model blender-kuka.yaml breaks model

I'm using the python client to control the kuka robot example provided.
I'm executing the following code:

# Import the Client from ambf_client package
from ambf_client import Client
import time

# Create a instance of the client
_client = Client()

# Connect the client which in turn creates callable objects from ROS topics
# and initiates a shared pool of threads for bi-directional communication
_client.connect()

print('\n\n----')
raw_input("We can see what objects the client has found. Press Enter to continue...")
# You can print the names of objects found. We should see all the links found
print(_client.get_obj_names())

# Lets get handles to the bodies of miro
arm_base_handle = _client.get_obj_handle('base')

print('\n\n----')
raw_input("Set all joint positions to 0, Press Enter to continue...")

for i in range(0, 7):
    arm_base_handle.set_joint_pos(i,0)
    time.sleep(3)

print('\n\n----')
raw_input("Let's clean up. Press Enter to continue...")
# Lastly to cleanup
_client.clean_up()

Up to joint 6, setting the joint positions to 0 works fine but for joint 7 the model breaks and parts are moving in an unintended way.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.