1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
   Copyright 2017 Takashi Ogura

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
 */
use errors::*;
use joints::*;
use na::{Isometry3, Real};

/// Container of links with joints
pub trait JointContainer<T>
where
    T: Real,
{
    /// Set the angles of the joints
    ///
    /// If the angle are out of the limit, it returns error.
    fn set_joint_angles(&mut self, angles: &[T]) -> Result<(), JointError>;

    /// Get the angles of the joints
    fn joint_angles(&self) -> Vec<T>;

    /// Get the limits of the joints, if it exists.
    fn joint_limits(&self) -> Vec<Option<Range<T>>>;

    /// Get the all names of the joints
    fn joint_names(&self) -> Vec<String>;
}

/// Container of links which has a transformation
pub trait LinkContainer<T>
where
    T: Real,
{
    /// Calculate the transforms of all of the links
    fn link_transforms(&self) -> Vec<Isometry3<T>>;

    /// Get the names of the links
    fn link_names(&self) -> Vec<String>;
}

/// `JointContainer` which has an end transform
pub trait KinematicChain<T>: JointContainer<T>
where
    T: Real,
{
    /// Calculate and return the transform of the end of the links
    fn end_transform(&self) -> Isometry3<T>;
}

/// Create KinematicChain
pub trait ChainContainer {
    type Chain;
    fn new_chain(&self, end_link_name: &str) -> Option<Self::Chain>;
}