Using InMoov service
The integratedMovement service have been add to the inMoov service and will load default setting.
the command to start the service is
InMoov.startIntegratedMovement()
If the range of your servo do not correspond to the default setting, you can adjust the limits using
InMoov.IntegratedMovement.setMinMaxAngle(partName, minAngle, maxAngle)... partName is the same name as the servo that move a part.
Using IntegratedMovement as standalone service
The IntegratedMovement can be use for any robot. You will need to define the DH parameters for each joints before you can use it.
The first thing you must do is to declare a new DHRobotArm with setNewDHRobotArm(armName). This will create a new thread class that will command the arm or the robot.
Then you must setup the DHLinks for each joints of the arm. The DHLinks will define how a joints moves relatively to the previous joints. The DH parameters are explained in this video
https://www.youtube.com/watch?v=rA9tm0gTln8
If you want the same coordinated for all of your arms, they must start all your arms with a common link originated at the same point
To set the DHLinks, you must use one of those methods
-
setDHLink(armName, linkName, d, theta, r, alpha)
-
setDHLink(armName, servo, d, theta, r, alpha)
-
d, theta, r and alpha are the DH parameters (see the video)
-
the first version use a string as linkName. It will make a static link that don't rotate, but still take in account for the inverse kinetic algorythm
-
the second version initialize the link with information found in the servo class, like the min/max limits. It will also establish communication between the DHRobotArm and the Servo so when the servo moves the DHRobotArm get updated about the movement.
Finally, you start the DHRobotArm thread with startEngine(armName)
You can also setup physicals objects that will be taken in account by the inverse kinetic engine to avoid collision between the defined objects.
To add an virtual object in the environnement of your robot, you must use
-
addObject(OriginX, OriginY, OriginZ, EndX, EndY, EndZ, objectName, radius, jmeRender)
-
Object are all considered as a cylinder, so you must define a Origin and a End point relative to your first DHLink origin and a radius. Units must be the same as use for defining the DH parameters
-
jmeRender is a boolean (True/False) that will make the object appear (render) into the JmeApp if you are using it
-
the objects set are static and cannot be moved
To set your DHLink as objects you must use
-
addObject(objectName, radius, jmeRender)
-
Object name must be the same name as the DHLink it's link to
-
jmeRender is a boolean (True/False) that will make the object appear (render) into the JmeApp if you are using it
-
the inverse kinetic engine will update the position of the object, so you dont have to give an Origin and End point
the method objectAddIgnored(objectName1, objectName2) will make the inverse kinetic engine ignore collision between the two object defined. This may be necessary if two objects are too close that the engine detect them as colliding.
The kinect can be use to 'see' the objects in front of the robot. You can start the kinect with startOpenNI(). the kinect is not reading the environment in real time yet, you must ask it to take a snapshot with processKinectData()