Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include "kinfamproperties.hpp"
00041 #include "motionproperties.hpp"
00042 #include <boost/lexical_cast.hpp>
00043 #include <string>
00044
00045 namespace RTT
00046 {
00047 void decomposeProperty(const Joint& joint, PropertyBag& targetbag)
00048 {
00049 targetbag.setType("KDL.Joint");
00050 targetbag.add( new Property<std::string>("Type", "Type of Joint",joint.getTypeName()));
00051 }
00052
00053 bool composeProperty(const PropertyBag& bag, Joint& joint)
00054 {
00055 if ( bag.getType() == "KDL.Joint" ){
00056 Property<std::string> type_name = bag.getPropertyType<std::string>("Type");
00057 if ( !type_name.ready() )
00058 return false;
00059 if (type_name.value()=="RotX"){
00060 joint=Joint(Joint::RotX);
00061 return true;
00062 }else if(type_name.value()=="RotY"){
00063 joint=Joint(Joint::RotY);
00064 return true;
00065 }else if(type_name.value()=="RotZ"){
00066 joint=Joint(Joint::RotZ);
00067 return true;
00068 }else if(type_name.value()=="TransX"){
00069 joint=Joint(Joint::TransX);
00070 return true;
00071 }else if(type_name.value()=="TransY"){
00072 joint=Joint(Joint::TransY);
00073 return true;
00074 }else if(type_name.value()=="TransZ"){
00075 joint=Joint(Joint::TransZ);
00076 return true;
00077 }else if(type_name.value()=="None"){
00078 joint=Joint(Joint::None);
00079 return true;
00080 }
00081 else
00082 return false;
00083 }
00084 return false;
00085 }
00086
00087 void decomposeProperty(const Segment& segment, PropertyBag& targetbag)
00088 {
00089 PropertyBag frame_bag;
00090 PropertyBag joint_bag;
00091 targetbag.setType("KDL.Segment");
00092 decomposeProperty(segment.getJoint(), joint_bag);
00093 targetbag.add(new Property<PropertyBag>("joint","The joint at the base of this segment",joint_bag));
00094 decomposeProperty(segment.getFrameToTip(), frame_bag);
00095 targetbag.add(new Property<PropertyBag>("frame","The offset frame from the joint at the base to the end of the link",frame_bag));
00096 }
00097
00098 bool composeProperty(const PropertyBag& bag, Segment& segment)
00099 {
00100 if ( bag.getType() == "KDL.Segment" ){
00101 Property<PropertyBag> joint_bag = bag.getPropertyType<PropertyBag>("joint");
00102 Property<PropertyBag> frame_bag = bag.getPropertyType<PropertyBag>("frame");
00103 if(!(frame_bag.ready()&&joint_bag.ready()))
00104 return false;
00105 Property<Joint> joint_prop(joint_bag.getName(),joint_bag.getDescription());
00106 joint_prop.getTypeInfo()->composeType(joint_bag.getDataSource(),
00107 joint_prop.getDataSource());
00108 Property<Frame> frame_prop(frame_bag.getName(),frame_bag.getDescription());
00109 frame_prop.getTypeInfo()->composeType(frame_bag.getDataSource(),
00110 frame_prop.getDataSource());
00111 segment=Segment(joint_prop.value(),frame_prop.value());
00112 return true;
00113 }
00114 else
00115 return false;
00116 }
00117
00118 void decomposeProperty(const Chain& chain, PropertyBag& targetbag)
00119 {
00120 targetbag.setType("KDL.Chain");
00121 PropertyBag segment_bag;
00122 for(unsigned int i=0;i<chain.getNrOfSegments();i++){
00123 decomposeProperty(chain.getSegment(i),segment_bag);
00124 targetbag.add(new Property<PropertyBag>("Segment","Segment of the chain",segment_bag));
00125 }
00126 }
00127
00128 bool composeProperty(const PropertyBag& bag, Chain& chain)
00129 {
00130 Chain chain_new;
00131 if( bag.getType() =="KDL.Chain"){
00132 for(unsigned int i=0;i<bag.size();i++){
00133 RTT::base::PropertyBase* segment_bag = bag.getItem(i);
00134 if(!segment_bag->ready())
00135 return false;
00136 Property<Segment> segment_prop(segment_bag->getName(),
00137 segment_bag->getDescription());
00138 segment_prop.getTypeInfo()->composeType(segment_bag->getDataSource(),
00139 segment_prop.getDataSource());
00140 chain_new.addSegment(segment_prop.value());
00141 }
00142 chain = chain_new;
00143 return true;
00144 }else
00145 return false;
00146 }
00147
00148 void decomposeProperty(const JntArray& jntarray, PropertyBag& targetbag)
00149 {
00150 targetbag.setType("KDL.JntArray");
00151 for(int i = 0; i < jntarray.data.rows(); i++)
00152 {
00153 std::string rindx = boost::lexical_cast<std::string>( i );
00154 targetbag.add(new Property<double>("Element" + rindx,"JntArray element",jntarray.data(i)));
00155 }
00156 }
00157
00158 bool composeProperty(const PropertyBag& bag, JntArray& jntarray)
00159 {
00160 JntArray jntarray_new(bag.size());
00161 if( bag.getType() =="KDL.JntArray"){
00162 for(unsigned int i = 0; i < bag.size(); i++){
00163 RTT::base::PropertyBase* jntarray_bag = bag.getItem(i);
00164 if(!jntarray_bag->ready())
00165 return false;
00166 Property<double> jntarray_prop(jntarray_bag->getName(), jntarray_bag->getDescription());
00167 jntarray_prop.getTypeInfo()->composeType(jntarray_bag->getDataSource(), jntarray_prop.getDataSource());
00168 jntarray_new.data(i) = jntarray_prop.value();
00169 }
00170 jntarray = jntarray_new;
00171 return true;
00172 } else
00173 return false;
00174 }
00175
00176 void decomposeProperty(const Jacobian& jacobian, PropertyBag& targetbag)
00177 {
00178 targetbag.setType("KDL.Jacobian");
00179 for(int i = 0; i < jacobian.data.rows(); i++){
00180 for(int j = 0; j < jacobian.data.cols(); j++){
00181 std::string rindx = boost::lexical_cast<std::string>( i );
00182 std::string cindx = boost::lexical_cast<std::string>( j );
00183 targetbag.add(new Property<double>("Element (" + rindx + "," + cindx + ")","Jacobian element",jacobian.data(i,j)));
00184 }
00185 }
00186 }
00187
00188 bool composeProperty(const PropertyBag& bag, Jacobian& jacobian)
00189 {
00190 Jacobian jacobian_new((bag.size() / 6));
00191
00192 if( bag.getType() =="KDL.Jacobian"){
00193 for(unsigned int i = 0; i < 6; i++){
00194 for(unsigned int j = 0; j < bag.size() / 6; j++){
00195 RTT::base::PropertyBase* data_bag = bag.getItem((bag.size() / 6) * i + j);
00196 if(!data_bag->ready())
00197 return false;
00198 Property<double> data_prop(data_bag->getName(), data_bag->getDescription());
00199 data_prop.getTypeInfo()->composeType(data_bag->getDataSource(), data_prop.getDataSource());
00200 jacobian_new.data(i,j) = data_prop.value();
00201 }
00202 }
00203 jacobian = jacobian_new;
00204 return true;
00205 }
00206 else
00207 return false;
00208 }
00209 }