1 package com.neuronrobotics.sdk.addons.kinematics;
 
    3 import java.io.BufferedWriter;
 
    5 import java.io.FileInputStream;
 
    6 import java.io.FileWriter;
 
    7 import java.io.InputStream;
 
    8 import java.util.ArrayList;
 
    9 import java.util.HashMap;
 
   12 import org.w3c.dom.Document;
 
   13 import org.w3c.dom.Element;
 
   14 import org.w3c.dom.Node;
 
   15 import org.w3c.dom.NodeList;
 
   17 import com.neuronrobotics.sdk.addons.kinematics.math.RotationNR;
 
   18 import com.neuronrobotics.sdk.addons.kinematics.math.TransformNR;
 
   19 import com.neuronrobotics.sdk.addons.kinematics.parallel.ParallelGroup;
 
   20 import com.neuronrobotics.sdk.addons.kinematics.xml.XmlFactory;
 
   21 import com.neuronrobotics.sdk.common.DeviceManager;
 
   22 import com.neuronrobotics.sdk.common.Log;
 
   32     private final ArrayList<DHParameterKinematics> 
legs = 
new ArrayList<DHParameterKinematics>();
 
   35     private final ArrayList<DHParameterKinematics> 
appendages = 
new ArrayList<DHParameterKinematics>();
 
   38     private final ArrayList<DHParameterKinematics> 
steerable = 
new ArrayList<DHParameterKinematics>();
 
   41     private final ArrayList<DHParameterKinematics> 
drivable = 
new ArrayList<DHParameterKinematics>();
 
   44     private final ArrayList<IOnMobileBaseRenderChange> 
changeListeners = 
new ArrayList<IOnMobileBaseRenderChange>();
 
   50     private String[] 
walkingEngine = 
new String[] { 
"https://github.com/madhephaestus/carl-the-hexapod.git",
 
   51             "WalkingDriveEngine.groovy" };
 
   53     private HashMap<String, String[]> 
vitamins = 
new HashMap<String, String[]>();
 
   54     private HashMap<String, String> 
vitaminVariant = 
new HashMap<String, String>();
 
   64     private HashMap<String, ParallelGroup> 
parallelGroups = 
new HashMap<String, ParallelGroup>();
 
   81         } 
catch (Throwable t) {
 
   88         HashMap<DHParameterKinematics, TransformNR> tipList = 
new HashMap<DHParameterKinematics, TransformNR>();
 
   92             tipList.put(leg, home);
 
   98         HashMap<DHParameterKinematics, TransformNR> tipLocations = 
getTipLocations();
 
  104         HashMap<DHParameterKinematics, TransformNR> tipLocations = 
getTipLocations();
 
  106         return pose(newAbsolutePose, around, tipLocations);
 
  110             HashMap<DHParameterKinematics, TransformNR> tipList) 
throws Exception {
 
  111         TransformNR newPoseTransformedToIMUCenter = newAbsolutePose.
times(around.inverse());
 
  112         TransformNR newPoseAdjustedBacktoRobotCenterFrame = around.
times(newPoseTransformedToIMUCenter);
 
  119             if (leg.checkTaskSpaceTransform(
pose))
 
  120                 leg.setDesiredTaskSpaceTransform(
pose, 0);
 
  125                     l.setDesiredTaskSpaceTransform(p, 0);
 
  141         NodeList nodListofLinks = doc.getElementsByTagName(
"root");
 
  143         if (nodListofLinks.getLength() != 1) {
 
  145             throw new RuntimeException(
"one mobile base is needed per level");
 
  147         NodeList rootNode = nodListofLinks.item(0).getChildNodes();
 
  149         for (
int i = 0; i < rootNode.getLength(); i++) {
 
  151             Node linkNode = rootNode.item(i);
 
  152             if (linkNode.getNodeType() == Node.ELEMENT_NODE && linkNode.getNodeName().contains(
"mobilebase")) {
 
  153                 Element e = (Element) linkNode;
 
  173             throw new RuntimeException(
"No groups named null allowed");
 
  185         ArrayList<DHParameterKinematics> list = 
new ArrayList<DHParameterKinematics>();
 
  207         g.
addLimb(limb, tipOffset, relativeLimb, relativeIndex);
 
  231             String[] paralellCad = 
getGitCodes(doc, 
"parallelCadEngine");
 
  233         } 
catch (Exception e) {
 
  243             String massString = 
getTag(doc, 
"mass");
 
  244             setMassKg(Double.parseDouble(massString));
 
  245         } 
catch (Exception e) {
 
  250         if (cmcenter != 
null)
 
  253         if (IMUcenter != 
null)
 
  271                     } 
catch (Exception e) {
 
  282             NodeList nodListofLinks = e.getChildNodes();
 
  284             for (
int i = 0; i < nodListofLinks.getLength(); i++) {
 
  285                 Node linkNode = nodListofLinks.item(i);
 
  286                 if (linkNode.getNodeType() == Node.ELEMENT_NODE && linkNode.getNodeName().contentEquals(tagname)) {
 
  287                     Element cntr = (Element) linkNode;
 
  298         } 
catch (Exception ex) {
 
  299             ex.printStackTrace();
 
  313         String name = 
getTag(e, 
"name");
 
  315             name = 
"nonamespecified";
 
  327         return getTag(e, 
"parallelGroup");
 
  337     private String 
getTag(Element e, String tagname) {
 
  339             NodeList nodListofLinks = e.getElementsByTagName(tagname);
 
  341             for (
int i = 0; i < nodListofLinks.getLength(); i++) {
 
  342                 Node linkNode = nodListofLinks.item(i);
 
  343                 String nameParent = linkNode.getParentNode().getNodeName();
 
  344                 boolean isMobileBase = !nameParent.contains(
"link");
 
  345                 if (linkNode.getNodeType() == Node.ELEMENT_NODE && linkNode.getNodeName().contentEquals(tagname)
 
  347                     String value = linkNode.getChildNodes().item(0).getNodeValue();
 
  353         } 
catch (Exception ex) {
 
  354             ex.printStackTrace();
 
  366     private void loadLimb(Element doc, String tag, ArrayList<DHParameterKinematics> list) {
 
  367         NodeList nodListofLinks = doc.getChildNodes();
 
  368         for (
int i = 0; i < nodListofLinks.getLength(); i++) {
 
  369             Node linkNode = nodListofLinks.item(i);
 
  370             if (linkNode.getNodeType() == Node.ELEMENT_NODE && linkNode.getNodeName().contentEquals(tag)) {
 
  371                 Element e = (Element) linkNode;
 
  372                 final String name = 
getname(e);
 
  383                 if (parallel != 
null) {
 
  384                     System.out.println(
"Loading Paralell group " + parallel + 
" limb " + name);
 
  386                     String relativeName = 
getTag(e, 
"relativeTo");
 
  389                         index = Integer.parseInt(
getTag(e, 
"relativeToLink"));
 
  390                     } 
catch (Exception ex) {
 
  430             if (!kin.connect()) {
 
  467     public ArrayList<DHParameterKinematics> 
getLegs() {
 
  486         ArrayList<DHParameterKinematics> copy = 
new ArrayList<DHParameterKinematics>();
 
  511         NodeList nodListofLinks = doc.getChildNodes();
 
  512         for (
int i = 0; i < nodListofLinks.getLength(); i++) {
 
  513             Node linkNode = nodListofLinks.item(i);
 
  515                 if (linkNode.getNodeType() == Node.ELEMENT_NODE && linkNode.getNodeName().contentEquals(
"vitamins")) {
 
  518             } 
catch (Exception e) {
 
  536             NodeList nodListofLinks = doc.getChildNodes();
 
  537             for (
int i = 0; i < nodListofLinks.getLength(); i++) {
 
  538                 Node linkNode = nodListofLinks.item(i);
 
  539                 if (linkNode.getNodeType() == Node.ELEMENT_NODE && linkNode.getNodeName().contentEquals(
"vitamin")) {
 
  540                     Element e = (Element) linkNode;
 
  545                     } 
catch (Exception ex) {
 
  550         } 
catch (Exception e) {
 
  564     public void setVitamin(String name, String type, String 
id) {
 
  602         String xml = 
"<root>\n";
 
  620         String allVitamins = 
"";
 
  622             String v = 
"\t\t<vitamin>\n";
 
  623             v += 
"\t\t\t<name>" + key + 
"</name>\n" + 
"\t\t\t<type>" + 
getVitamins().get(key)[0] + 
"</type>\n" 
  624                     + 
"\t\t\t<id>" + 
getVitamins().get(key)[1] + 
"</id>\n";
 
  626                 v += 
"\t\t\t<variant>" + 
getVitamins().get(key)[1] + 
"</variant>\n";
 
  628             v += 
"\t\t</vitamin>\n";
 
  631         String xml = 
"<mobilebase>\n";
 
  633         xml += 
"\t<cadEngine>\n";
 
  636         xml += 
"\t</cadEngine>\n";
 
  638         xml += 
"\t<driveEngine>\n";
 
  641         xml += 
"\t</driveEngine>\n";
 
  646                 xml += 
"\t<parallelCadEngine>\n";
 
  647                 xml += 
"\t\t<parallelGroup>" + key + 
"</parallelGroup>\n";
 
  650                 xml += 
"\t</parallelCadEngine>\n";
 
  661             xml += 
"<appendage>\n";
 
  663             xml += 
"\n</appendage>\n";
 
  667             xml += 
"<steerable>\n";
 
  668             xml += 
"\n<name>" + l.getScriptingName() + 
"</name>\n";
 
  669             xml += l.getEmbedableXml();
 
  670             xml += 
"\n</steerable>\n";
 
  673             xml += 
"<drivable>\n";
 
  674             xml += 
"\n<name>" + l.getScriptingName() + 
"</name>\n";
 
  675             xml += l.getEmbedableXml();
 
  676             xml += 
"\n</drivable>\n";
 
  679         xml += 
"\n<ZframeToRAS>\n";
 
  681         xml += 
"\n</ZframeToRAS>\n";
 
  683         xml += 
"\n<baseToZframe>\n";
 
  685         xml += 
"\n</baseToZframe>\n" + 
"\t<mass>" + 
getMassKg() + 
"</mass>\n" + 
"\t<centerOfMassFromCentroid>" 
  688         xml += 
"\n<vitamins>\n" + allVitamins + 
"\n</vitamins>\n";
 
  689         xml += 
"\n</mobilebase>\n";
 
  701                     xml += 
"\n<parallelGroup>" + key + 
"</parallelGroup>\n";
 
  703                         xml += 
"\n<parallelGroupTipOffset>\n" + parallelGroup.
getTipOffset(l).getXml()
 
  706                                 + 
"</relativeToLink>\n" + 
"\n</parallelGroupTipOffset>\n";
 
  866             l.setGlobalToFiducialTransform(frameToBase);
 
  884             for (
int i = 0; i < kin.getNumberOfLinks(); i++) {
 
  885                 MobileBase m = kin.getDhLink(i).getSlaveMobileBase();
 
  922     public static void main(String[] args) 
throws Exception {
 
  923         File f = 
new File(
"paralleloutput.xml");
 
  931         String xmlParsed = pArm.
getXml();
 
  932         BufferedWriter writer = 
null;
 
  934         writer = 
new BufferedWriter(
new FileWriter(
"paralleloutput2.xml"));
 
  935         writer.write(xmlParsed);
 
  949             System.out.println(
"Expected tip to be " + Tip.
getX() + 
" and got: " + newTip.
getX());
 
String[] getGitCodes(Element doc, String tag)
TransformNR getFiducialToGlobalTransform()
void addChangeListener(int linkIndex, ILinkConfigurationChangeListener l)
void addJointSpaceListener(IJointSpaceUpdateListenerNR l)
void addRegistrationListener(IRegistrationListenerNR l)
TransformNR getRobotToFiducialTransform()
void setGlobalToFiducialTransform(TransformNR frameToBase, boolean fireUpdate)
void setGitCadEngine(String[] cadEngine)
void setRobotToFiducialTransform(TransformNR baseToFiducial)
TransformNR getCurrentTaskSpaceTransform()
String[] getGitCadEngine()
TransformNR forwardOffset(TransformNR t)
double[] setDesiredTaskSpaceTransform(TransformNR taskSpaceTransform, double seconds)
MobileBase getSlaveMobileBase()
TransformNR getIMUFromCentroid()
TransformNR getCenterOfMassFromCentroid()
void onJointSpaceTargetUpdate(AbstractKinematicsNR source, double[] joints)
void loadVitamins(Element doc)
ArrayList< DHParameterKinematics > getDrivable()
String makeLimbTag(String xml, DHParameterKinematics l)
void setVitaminVariant(String name, String tagValue2)
void loadLimb(Element doc, String tag, ArrayList< DHParameterKinematics > list)
void DriveVelocityStraight(double cmPerSecond)
void clearIOnMobileBaseRenderChange()
void setWalkingDriveEngine(IDriveEngine walkingDriveEngine)
void setGitWalkingEngine(String[] walkingEngine)
void setIMUFromCentroid(TransformNR centerOfMassFromCentroid)
ArrayList< DHParameterKinematics > getAppendages()
void onIOnMobileBaseRenderChange()
TransformNR centerOfMassFromCentroid
HashMap< String, String[]> getVitamins()
void initializeParalellGroups()
final ArrayList< DHParameterKinematics > appendages
String[] getGitSelfSource()
IDriveEngine walkingDriveEngine
String getname(Element e)
void setCenterOfMassFromCentroid(TransformNR centerOfMassFromCentroid)
String getVitaminVariant(String name)
void setGitSelfSource(String[] selfSource)
void addIOnMobileBaseRenderChange(IOnMobileBaseRenderChange l)
ArrayList< DHParameterKinematics > getAllDHChains()
IDriveEngine getWalkingDriveEngine()
ICalcLimbHomeProvider homeProvider
ArrayList< DHParameterKinematics > getLegs()
TransformNR forwardKinematics(double[] jointSpaceVector)
void getVitamins(Element doc)
TransformNR IMUFromCentroid
void addLimbToParallel(DHParameterKinematics limb, TransformNR tipOffset, String name, String relativeLimb, int relativeIndex)
void fireIOnMobileBaseRenderChange()
HashMap< String, String[]> vitamins
void event(LinkConfiguration newConf)
HashMap< String, ParallelGroup > parallelGroups
void onJointSpaceUpdate(AbstractKinematicsNR source, double[] joints)
void setMassKg(double mass)
String[] getGitWalkingEngine()
void loadConfigs(Element doc)
boolean pose(TransformNR newAbsolutePose, TransformNR around, HashMap< DHParameterKinematics, TransformNR > tipList)
void removeLimFromParallel(DHParameterKinematics limb)
void setHomeProvider(ICalcLimbHomeProvider homeProvider)
final ArrayList< DHParameterKinematics > drivable
static void main(String[] args)
String getTag(Element e, String tagname)
HashMap< DHParameterKinematics, TransformNR > getTipLocations()
void setFiducialToGlobalTransform(TransformNR globe)
void shutDownParallel(ParallelGroup group)
boolean poseAroundPoint(TransformNR newAbsolutePose, TransformNR around)
HashMap< String, String > vitaminVariant
MobileBase(InputStream configFile)
ParallelGroup getParallelGroup(DHParameterKinematics limb)
void onJointSpaceLimit(AbstractKinematicsNR source, int axis, JointLimit event)
ParallelGroup getParallelGroup(String name)
final ArrayList< DHParameterKinematics > legs
double[] inverseKinematics(TransformNR taskSpaceTransform)
void DriveVelocityArc(double degreesPerSecond, double cmRadius)
HashMap< String, ParallelGroup > getParallelGroups()
ArrayList< DHParameterKinematics > getSteerable()
String getParallelGroup(Element e)
final ArrayList< IOnMobileBaseRenderChange > changeListeners
void setVitamin(String name, String type, String id)
boolean pose(TransformNR newAbsolutePose)
TransformNR loadTransform(String tagname, Element e)
TransformNR calcHome(DHParameterKinematics limb)
Set< String > getParallelGroupNames()
ArrayList< DHParameterKinematics > getAllParallelGroups()
void addListeners(DHParameterKinematics kin)
final ArrayList< DHParameterKinematics > steerable
void removeIOnMobileBaseRenderChange(IOnMobileBaseRenderChange l)
void DriveArc(TransformNR newPose, double seconds)
HashMap< DHParameterKinematics, TransformNR > getTipOffset()
String getTipOffsetRelativeName(DHParameterKinematics l)
String[] getGitCadToolEngine()
int getTipOffsetRelativeIndex(DHParameterKinematics l)
void removeLimb(DHParameterKinematics limb)
void setGitCadToolEngine(String[] cadEngine)
String getNameOfParallelGroup()
void addLimb(DHParameterKinematics limb, TransformNR tip, String name, int index)
void setupReferencedLimbStartup(DHParameterKinematics limb, TransformNR tip, String name, int index)
ArrayList< DHParameterKinematics > getConstituantLimbs()
static String getTagValue(String sTag, Element eElement)
static Document getAllNodesDocument(InputStream config)
String getScriptingName()
void setScriptingName(String scriptingName)
static void error(String message)
TransformNR calcHome(DHParameterKinematics limb)
default void DriveVelocityStraight(MobileBase source, double cmPerSecond)
default void DriveVelocityArc(MobileBase source, double degreesPerSecond, double cmRadius)
abstract void DriveArc(MobileBase source, TransformNR newPose, double seconds)
default void addIHardwareSyncPulseReciver(IHardwareSyncPulseReciver r)
void onIOnMobileBaseRenderChange()