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()