Skip to content

Commit a5a472c

Browse files
authored
Merge pull request #55 from janbruedigam/small_updates2
Small updates 2
2 parents 0788e22 + a4b9578 commit a5a472c

File tree

5 files changed

+374
-49
lines changed

5 files changed

+374
-49
lines changed

src/optional_components/shapes.jl

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,17 @@ mutable struct Mesh{T} <: Shape{T}
2929
color::RGBA
3030

3131
function Mesh(path::String;
32-
scale::AbstractVector = ones(3), color = RGBA(0.75, 0.75, 0.75), xoffset::AbstractVector = zeros(3), qoffset::UnitQuaternion = one(UnitQuaternion)
32+
xoffset::AbstractVector = szeros(3), qoffset::UnitQuaternion = one(UnitQuaternion),
33+
scale::AbstractVector = sones(3), color = RGBA(0.75, 0.75, 0.75)
3334
)
3435
T = promote_type(eltype.((xoffset, qoffset))...)
3536

3637
new{T}(xoffset, qoffset, path, scale, color)
3738
end
3839

3940
function Mesh(path::String, m::Real, J::AbstractMatrix;
40-
scale::AbstractVector = ones(3), name::String="", color = RGBA(0.75, 0.75, 0.75), xoffset::AbstractVector = zeros(3), qoffset::UnitQuaternion = one(UnitQuaternion)
41+
xoffset::AbstractVector = szeros(3), qoffset::UnitQuaternion = one(UnitQuaternion),
42+
scale::AbstractVector = sones(3), name::String="", color = RGBA(0.75, 0.75, 0.75)
4143
)
4244
T = promote_type(eltype.((m, J, xoffset, qoffset))...)
4345

@@ -57,24 +59,27 @@ mutable struct Box{T} <: Shape{T}
5759
qoffset::UnitQuaternion{T}
5860

5961
xyz::SVector{3,T}
62+
scale::SVector{3,T}
6063
color::RGBA
6164

6265

6366
function Box(x::Real, y::Real, z::Real;
64-
color = RGBA(0.75, 0.75, 0.75), xoffset::AbstractVector = zeros(3), qoffset::UnitQuaternion = one(UnitQuaternion)
67+
xoffset::AbstractVector = szeros(3), qoffset::UnitQuaternion = one(UnitQuaternion),
68+
scale::AbstractVector = sones(3), color = RGBA(0.75, 0.75, 0.75)
6569
)
6670
T = promote_type(eltype.((x, y, z, xoffset, qoffset))...)
6771

68-
new{T}(xoffset, qoffset, [x;y;z], color)
72+
new{T}(xoffset, qoffset, [x;y;z], scale, color)
6973
end
7074

7175
function Box(x::Real, y::Real, z::Real, m::Real;
72-
name::String="", color = RGBA(0.75, 0.75, 0.75), xoffset::AbstractVector = zeros(3), qoffset::UnitQuaternion = one(UnitQuaternion)
76+
xoffset::AbstractVector = szeros(3), qoffset::UnitQuaternion = one(UnitQuaternion),
77+
scale::AbstractVector = sones(3), name::String="", color = RGBA(0.75, 0.75, 0.75)
7378
)
7479
T = promote_type(eltype.((x, y, z, m, xoffset, qoffset))...)
7580
J = 1 / 12 * m * diagm([y^2 + z^2;x^2 + z^2;x^2 + y^2])
7681

77-
return Body(m, J; name=name, shape=new{T}(xoffset, qoffset, [x;y;z], color))
82+
return Body(m, J; name=name, shape=new{T}(xoffset, qoffset, [x;y;z], scale, color))
7883
end
7984
end
8085

@@ -90,24 +95,27 @@ mutable struct Cylinder{T} <: Shape{T}
9095
qoffset::UnitQuaternion{T}
9196

9297
rh::SVector{2,T}
98+
scale::SVector{3,T}
9399
color::RGBA
94100

95101
# Cylinder points in the z direction
96102
function Cylinder(r::Real, h::Real;
97-
color = RGBA(0.75, 0.75, 0.75), xoffset::AbstractVector = zeros(3), qoffset::UnitQuaternion = one(UnitQuaternion)
103+
xoffset::AbstractVector = szeros(3), qoffset::UnitQuaternion = one(UnitQuaternion),
104+
scale::AbstractVector = sones(3), color = RGBA(0.75, 0.75, 0.75)
98105
)
99106
T = promote_type(eltype.((r, h, xoffset, qoffset))...)
100107

101-
new{T}(xoffset, qoffset, [r;h], color)
108+
new{T}(xoffset, qoffset, [r;h], scale, color)
102109
end
103110

104111
function Cylinder(r::Real, h::Real, m::Real;
105-
name::String="", color = RGBA(0.75, 0.75, 0.75), xoffset::AbstractVector = zeros(3), qoffset::UnitQuaternion = one(UnitQuaternion)
112+
xoffset::AbstractVector = szeros(3), qoffset::UnitQuaternion = one(UnitQuaternion),
113+
scale::AbstractVector = sones(3), name::String="", color = RGBA(0.75, 0.75, 0.75)
106114
)
107115
T = promote_type(eltype.((r, h, m, xoffset, qoffset))...)
108116
J = 1 / 2 * m * diagm([r^2 + 1 / 6 * h^2;r^2 + 1 / 6 * h^2;r^2])
109117

110-
return Body(m, J; name=name, shape=new{T}(xoffset, qoffset, [r;h], color))
118+
return Body(m, J; name=name, shape=new{T}(xoffset, qoffset, [r;h], scale, color))
111119
end
112120
end
113121

@@ -123,23 +131,26 @@ mutable struct Sphere{T} <: Shape{T}
123131
qoffset::UnitQuaternion{T}
124132

125133
r::T
134+
scale::SVector{3,T}
126135
color::RGBA
127136

128137
function Sphere(r::Real;
129-
color = RGBA(0.75, 0.75, 0.75), xoffset::AbstractVector = zeros(3), qoffset::UnitQuaternion = one(UnitQuaternion)
138+
xoffset::AbstractVector = szeros(3), qoffset::UnitQuaternion = one(UnitQuaternion),
139+
scale::AbstractVector = sones(3), color = RGBA(0.75, 0.75, 0.75)
130140
)
131141
T = promote_type(eltype.((r, xoffset, qoffset))...)
132142

133-
new{T}(xoffset, qoffset, r, color)
143+
new{T}(xoffset, qoffset, r, scale, color)
134144
end
135145

136146
function Sphere(r::Real, m::Real;
137-
name::String="", color = RGBA(0.75, 0.75, 0.75), xoffset::AbstractVector = zeros(3), qoffset::UnitQuaternion = one(UnitQuaternion)
147+
xoffset::AbstractVector = szeros(3), qoffset::UnitQuaternion = one(UnitQuaternion),
148+
scale::AbstractVector = sones(3), name::String="", color = RGBA(0.75, 0.75, 0.75)
138149
)
139150
T = promote_type(eltype.((r, m, xoffset, qoffset))...)
140151
J = 2 / 5 * m * diagm([r^2 for i = 1:3])
141152

142-
return Body(m, J; name=name, shape=new{T}(xoffset, qoffset, r, color))
153+
return Body(m, J; name=name, shape=new{T}(xoffset, qoffset, r, scale, color))
143154
end
144155
end
145156

@@ -154,24 +165,27 @@ mutable struct Pyramid{T} <: Shape{T}
154165
qoffset::UnitQuaternion{T}
155166

156167
wh::SVector{2,T}
168+
scale::SVector{3,T}
157169
color::RGBA
158170

159171
# Pyramid points in the z direction, Center of mass at 1/4 h
160172
function Pyramid(w::Real, h::Real;
161-
color = RGBA(0.75, 0.75, 0.75), xoffset::AbstractVector = zeros(3), qoffset::UnitQuaternion = one(UnitQuaternion)
173+
xoffset::AbstractVector = szeros(3), qoffset::UnitQuaternion = one(UnitQuaternion),
174+
scale::AbstractVector = sones(3), color = RGBA(0.75, 0.75, 0.75)
162175
)
163176
T = promote_type(eltype.((w, h, xoffset, qoffset))...)
164177

165-
new{T}(xoffset, qoffset, [w;h], color)
178+
new{T}(xoffset, qoffset, [w;h], scale, color)
166179
end
167180

168181
function Pyramid(w::Real, h::Real, m::Real;
169-
name::String="", color = RGBA(0.75, 0.75, 0.75), xoffset::AbstractVector = zeros(3), qoffset::UnitQuaternion = one(UnitQuaternion)
182+
xoffset::AbstractVector = szeros(3), qoffset::UnitQuaternion = one(UnitQuaternion),
183+
scale::AbstractVector = sones(3), name::String="", color = RGBA(0.75, 0.75, 0.75)
170184
)
171185
T = promote_type(eltype.((w, h, m, xoffset, qoffset))...)
172186
J = 1/80 * m * diagm([4*w^2+3*h^2;4*w^2+3*h^2;8*w^2])
173187

174-
return Body(m, J; name=name, shape=new{T}(xoffset, qoffset, [w;h], color))
188+
return Body(m, J; name=name, shape=new{T}(xoffset, qoffset, [w;h], scale, color))
175189
end
176190
end
177191

@@ -181,6 +195,7 @@ function Base.show(io::IO, mime::MIME{Symbol("text/plain")}, shape::Shape{T}) wh
181195
println(io," xoffset: "*string(shape.xoffset))
182196
println(io," qoffset: "*string(shape.qoffset))
183197
println(io," color: "*string(shape.color))
198+
println(io," scale: "*string(shape.scale))
184199
end
185200

186201
function Base.show(io::IO, mime::MIME{Symbol("text/plain")}, shape::EmptyShape{T}) where {T}

src/ui/urdf.jl

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ function parse_shape(xvisual, materialdict, T)
138138
r = parse_scalar(shapenode, "radius", T, default = "0.5")
139139
l = parse_scalar(shapenode, "length", T, default = "1")
140140
shape = Cylinder(r, l, zero(T), color = color, xoffset = x, qoffset = q)
141+
elseif name(shapenode) == "pyramid"
142+
w = parse_scalar(shapenode, "width", T, default = "1")
143+
h = parse_scalar(shapenode, "height", T, default = "1")
144+
shape = Cylinder(w, h, zero(T), color = color, xoffset = x, qoffset = q)
141145
elseif name(shapenode) == "sphere"
142146
r = parse_scalar(shapenode, "radius", T, default = "0.5")
143147
shape = Sphere(r, zero(T), color = color, xoffset = x, qoffset = q)
@@ -191,33 +195,50 @@ function parse_links(xlinks, materialdict, T)
191195
return ldict
192196
end
193197

194-
function parse_joint(xjoint, plink, clink, T)
195-
jointtype = attribute(xjoint, "type")
196-
x, q = parse_pose(find_element(xjoint, "origin"), T)
197-
axis = parse_vector(find_element(xjoint, "axis"), "xyz", T, default = "1 0 0")
198-
p1 = x
199-
name = attribute(xjoint, "name")
200-
198+
function joint_selector(jointtype, link1, link2, T;
199+
axis = SA{T}[1;0;0], p1 = szeros(T,3), p2 = szeros(T,3), qoffset = one(UnitQuaternion{T}), name = ""
200+
)
201+
201202
# TODO limits for revolute joint?
202203
if jointtype == "revolute" || jointtype == "continuous"
203-
joint = EqualityConstraint(Revolute(plink, clink, axis; p1=p1, qoffset = q), name=name)
204+
joint = EqualityConstraint(Revolute(link1, link2, axis; p1=p1, p2=p2, qoffset = qoffset), name=name)
204205
elseif jointtype == "prismatic"
205-
joint = EqualityConstraint(Prismatic(plink, clink, axis; p1=p1, qoffset = q), name=name)
206+
joint = EqualityConstraint(Prismatic(link1, link2, axis; p1=p1, p2=p2, qoffset = qoffset), name=name)
206207
elseif jointtype == "planar"
207-
joint = EqualityConstraint(Planar(plink, clink, axis; p1=p1, qoffset = q), name=name)
208+
joint = EqualityConstraint(Planar(link1, link2, axis; p1=p1, p2=p2, qoffset = qoffset), name=name)
209+
elseif jointtype == "planarfree"
210+
joint = EqualityConstraint(PlanarFree(link1, link2, axis; p1=p1, p2=p2), name=name)
208211
elseif jointtype == "fixed"
209-
joint = EqualityConstraint(Fixed(plink, clink; p1=p1, qoffset = q), name=name)
212+
joint = EqualityConstraint(Fixed(link1, link2; p1=p1, p2=p2, qoffset = qoffset), name=name)
210213
elseif jointtype == "floating"
211-
joint = EqualityConstraint(Floating(plink, clink), name=name)
214+
joint = EqualityConstraint(Floating(link1, link2), name=name)
212215
elseif jointtype == "ball"
213-
joint = EqualityConstraint(Spherical(plink, clink; p1=p1, qoffset = q), name=name)
216+
joint = EqualityConstraint(Spherical(link1, link2; p1=p1, p2=p2, qoffset = qoffset), name=name)
217+
elseif jointtype == "fixedorientation"
218+
joint = EqualityConstraint(FixedOrientation(link1, link2; qoffset = qoffset), name=name)
219+
elseif jointtype == "cylindrical"
220+
joint = EqualityConstraint(Cylindrical(link1, link2, axis; p1=p1, p2=p2, qoffset = qoffset), name=name)
221+
elseif jointtype == "cylindricalfree"
222+
joint = EqualityConstraint(CylindricalFree(link1, link2, axis; p1=p1, p2=p2), name=name)
223+
elseif jointtype == "planaraxis"
224+
joint = EqualityConstraint(PlanarAxis(link1, link2, axis; p1=p1, p2=p2, qoffset = qoffset), name=name)
214225
else
215226
@error "Unknown joint type"
216227
end
217228

218229
return joint
219230
end
220231

232+
function parse_joint(xjoint, plink, clink, T)
233+
jointtype = attribute(xjoint, "type")
234+
x, q = parse_pose(find_element(xjoint, "origin"), T)
235+
axis = parse_vector(find_element(xjoint, "axis"), "xyz", T, default = "1 0 0")
236+
p1 = x
237+
name = attribute(xjoint, "name")
238+
239+
return joint_selector(jointtype, plink, clink, T, axis = axis, p1 = p1, qoffset = q, name = name)
240+
end
241+
221242
function parse_loop_joint(xjoint, link1, link2, T)
222243
find_element(xjoint, "link1")
223244
find_element(xjoint, "link2")
@@ -230,24 +251,7 @@ function parse_loop_joint(xjoint, link1, link2, T)
230251
p2 = x2
231252
name = attribute(xjoint, "name")
232253

233-
# TODO limits for revolute joint?
234-
if jointtype == "revolute" || jointtype == "continuous"
235-
joint = EqualityConstraint(Revolute(link1, link2, axis; p1=p1, p2=p2, qoffset = q1), name=name)
236-
elseif jointtype == "prismatic"
237-
joint = EqualityConstraint(Prismatic(link1, link2, axis; p1=p1, p2=p2, qoffset = q1), name=name)
238-
elseif jointtype == "planar"
239-
joint = EqualityConstraint(Planar(link1, link2, axis; p1=p1, p2=p2, qoffset = q1), name=name)
240-
elseif jointtype == "fixed"
241-
joint = EqualityConstraint(Fixed(link1, link2; p1=p1, p2=p2, qoffset = q1), name=name)
242-
elseif jointtype == "floating"
243-
joint = EqualityConstraint(Floating(link1, link2), name=name)
244-
elseif jointtype == "ball"
245-
joint = EqualityConstraint(Spherical(plink, clink; p1=p1, p2=p2, qoffset = q), name=name)
246-
else
247-
@error "Unknown joint type"
248-
end
249-
250-
return joint
254+
return joint_selector(jointtype, link1, link2, T, axis = axis, p1 = p1, p2 = p2, qoffset = q1, name = name)
251255
end
252256

253257
function parse_joints(xjoints, ldict, floating, T)

test/runtests.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ include("initialization/initialization_test.jl")
1818
include("ui_test.jl")
1919
end
2020

21+
@safetestset "URDF Tests" begin
22+
include("urdf_test.jl")
23+
end
24+
2125
@safetestset "Optionals Tests" begin
2226
include("optionals_test.jl")
2327
end

test/urdf_test.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using ConstrainedDynamics
2+
3+
Mechanism("urdf_test.urdf", floating=false)
4+
@test true
5+
6+
Mechanism("urdf_test.urdf", floating=true)
7+
@test true

0 commit comments

Comments
 (0)