Skip to content

Commit a9193bc

Browse files
Supporting Ignore Collision tag in URDF (#4)
* Adding Ignore Collision Tag in URDF * Supporting damping in controller * Adding exception for two links having the same name
1 parent d0720c5 commit a9193bc

File tree

6 files changed

+110
-5
lines changed

6 files changed

+110
-5
lines changed

Editor/NeedsRuntimeConversion/Extensions/UrdfRobotExtensions.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace RosSharp.Urdf.Editor
1010
public static class UrdfRobotExtensions
1111
{
1212
static string tagName = "robot";
13+
static string collisionObjectName = "Collisions";
1314
public static ImportSettings importsettings;
1415

1516
public static void Create()
@@ -63,6 +64,7 @@ public static void Create(string filename, ImportSettings settings)
6364
Selection.activeObject = robotGameObject;
6465

6566
CorrectAxis(robotGameObject, settings.choosenAxis);
67+
//CreateCollisionExceptions(robot, robotGameObject);
6668
}
6769

6870
public static void CorrectAxis(GameObject robot, ImportSettings.axisType axis = ImportSettings.axisType.yAxis)
@@ -90,6 +92,23 @@ public static void CorrectAxis(GameObject robot, ImportSettings.axisType axis =
9092
}
9193

9294
}
95+
96+
private static void CreateCollisionExceptions(Robot robot, GameObject robotGameObject)
97+
{
98+
List<CollisionIgnore> ColliisonList = new List<CollisionIgnore>();
99+
if (robot.ignoreCollisionPair.Count > 0)
100+
{
101+
foreach(System.Tuple<string,string> ignoreCollision in robot.ignoreCollisionPair)
102+
{
103+
Transform colliisonObject1 = GameObject.Find(ignoreCollision.Item1).transform.Find(collisionObjectName);
104+
Transform collisionObject2 = GameObject.Find(ignoreCollision.Item2).transform.Find(collisionObjectName);
105+
106+
ColliisonList.Add(new CollisionIgnore(colliisonObject1, collisionObject2));
107+
}
108+
}
109+
robotGameObject.GetComponent<UrdfRobot>().collisionExceptions = ColliisonList;
110+
}
111+
93112
#endregion
94113

95114
#region Export

Runtime/Controller/Controller.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public void UpdateControlType(JointControl joint)
166166
{
167167
ArticulationDrive drive = joint.joint.xDrive;
168168
drive.stiffness = stiffness;
169-
drive.damping = 0;
169+
drive.damping = damping;
170170
joint.joint.xDrive = drive;
171171
}
172172
}

Runtime/RosSharpDefinitions/Robot.cs

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class Robot
2121
public List<Link> links;
2222
public List<Joint> joints;
2323
public List<Plugin> plugins;
24+
public List<Tuple<string, string>> ignoreCollisionPair;
2425

2526
public Robot(string filename)
2627
{
@@ -35,6 +36,7 @@ public Robot(string filename)
3536
links = ReadLinks(node);
3637
joints = ReadJoints(node);
3738
plugins = ReadPlugins(node);
39+
ignoreCollisionPair = ReadDisableCollision(node);
3840

3941

4042
// build tree structure from link and joint lists:
@@ -69,10 +71,20 @@ from child in node.Elements("material")
6971

7072
private static List<Link> ReadLinks(XElement node)
7173
{
72-
var links =
73-
from child in node.Elements("link")
74-
select new Link(child);
75-
return links.ToList();
74+
List<String> importedLinks = new List<String>();
75+
List<Link> links = new List<Link>();
76+
foreach (XElement child in node.Elements("link"))
77+
{
78+
string name = (String)child.Attribute("name");
79+
if (importedLinks.Find(p => name == p ? true : false) == null)
80+
{
81+
links.Add(new Link(child));
82+
importedLinks.Add(name);
83+
}
84+
else
85+
throw new InvalidNameException("Two links cannot have the same name");
86+
}
87+
return links;
7688
}
7789

7890
private static List<Joint> ReadJoints(XElement node)
@@ -92,6 +104,14 @@ from child in node.Elements()
92104
return plugins.ToList();
93105
}
94106

107+
private List<Tuple<string,string>> ReadDisableCollision(XElement node)
108+
{
109+
var disable_collisions =
110+
from child in node.Elements("disable_collision")
111+
select new Tuple<string,string>(child.Attribute("joint1").Value,child.Attribute("joint2").Value);
112+
return disable_collisions.ToList();
113+
}
114+
95115
private static Link FindRootLink(List<Link> links, List<Joint> joints)
96116
{
97117
if (joints.Count == 0)
@@ -143,4 +163,15 @@ private void writeToUrdf()
143163
}
144164
}
145165
}
166+
public class InvalidNameException : System.Exception
167+
{
168+
public InvalidNameException() : base() { }
169+
public InvalidNameException(string message) : base(message) { }
170+
public InvalidNameException(string message, System.Exception inner) : base(message, inner) { }
171+
172+
// A constructor is needed for serialization when an
173+
// exception propagates from a remoting server to the client.
174+
protected InvalidNameException(System.Runtime.Serialization.SerializationInfo info,
175+
System.Runtime.Serialization.StreamingContext context) : base(info, context) { }
176+
}
146177
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using UnityEngine;
4+
5+
namespace RosSharp.Urdf
6+
{
7+
[System.Serializable]
8+
public class CollisionIgnore {
9+
public Transform Link1;
10+
public Transform Link2;
11+
12+
public CollisionIgnore(Transform l1, Transform l2)
13+
{
14+
Link1 = l1;
15+
Link2 = l2;
16+
}
17+
}
18+
}

Runtime/UrdfComponents/CollisionIgnore.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Runtime/UrdfComponents/UrdfRobot.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using UnityEngine;
2+
using System;
3+
using System.Collections.Generic;
24

35
namespace RosSharp.Urdf
46
{
@@ -8,6 +10,7 @@ public class UrdfRobot : MonoBehaviour
810
{
911
public string FilePath;
1012
public ImportSettings.axisType choosenAxis;
13+
public List<CollisionIgnore> collisionExceptions;
1114
#region Configure Robot
1215

1316
public void SetCollidersConvex(bool convex)
@@ -79,6 +82,29 @@ public void SetAxis(ImportSettings.axisType setAxis)
7982
this.choosenAxis = setAxis;
8083
}
8184

85+
void Start()
86+
{
87+
CreateCollisionExceptions();
88+
}
89+
90+
public void CreateCollisionExceptions()
91+
{
92+
if (collisionExceptions != null)
93+
{
94+
foreach (CollisionIgnore ignoreCollision in collisionExceptions)
95+
{
96+
Collider[] collidersObject1 = ignoreCollision.Link1.GetComponentsInChildren<Collider>();
97+
Collider[] collidersObject2 = ignoreCollision.Link2.GetComponentsInChildren<Collider>();
98+
foreach (Collider colliderMesh1 in collidersObject1)
99+
{
100+
foreach (Collider colliderMesh2 in collidersObject2)
101+
{
102+
Physics.IgnoreCollision(colliderMesh1, colliderMesh2);
103+
}
104+
}
105+
}
106+
}
107+
}
82108
#endregion
83109
}
84110
}

0 commit comments

Comments
 (0)