|
From: <stu...@us...> - 2008-07-29 19:54:11
|
Revision: 2265
http://personalrobots.svn.sourceforge.net/personalrobots/?rev=2265&view=rev
Author: stuglaser
Date: 2008-07-29 19:54:19 +0000 (Tue, 29 Jul 2008)
Log Message:
-----------
Looking up actuators and joints by name is now included in the robot model
(instead of in mechanism control).
Modified Paths:
--------------
pkg/trunk/mechanism/mechanism_control/include/mechanism_control/mechanism_control.h
pkg/trunk/mechanism/mechanism_control/src/mechanism_control.cpp
pkg/trunk/robot_models/robot_mechanism_model/include/mechanism_model/robot.h
Modified: pkg/trunk/mechanism/mechanism_control/include/mechanism_control/mechanism_control.h
===================================================================
--- pkg/trunk/mechanism/mechanism_control/include/mechanism_control/mechanism_control.h 2008-07-29 19:53:34 UTC (rev 2264)
+++ pkg/trunk/mechanism/mechanism_control/include/mechanism_control/mechanism_control.h 2008-07-29 19:54:19 UTC (rev 2265)
@@ -51,12 +51,8 @@
void registerControllerType(const std::string& type, ControllerAllocator f);
bool spawnController(const char* type, TiXmlElement* config);
- Actuator* getActuator(const std::string& name);
-
private:
bool initialized_;
- typedef std::map<std::string,int> ActuatorMap;
- ActuatorMap actuators_;
mechanism::Robot model_;
HardwareInterface *hw_;
Modified: pkg/trunk/mechanism/mechanism_control/src/mechanism_control.cpp
===================================================================
--- pkg/trunk/mechanism/mechanism_control/src/mechanism_control.cpp 2008-07-29 19:53:34 UTC (rev 2264)
+++ pkg/trunk/mechanism/mechanism_control/src/mechanism_control.cpp 2008-07-29 19:54:19 UTC (rev 2265)
@@ -40,22 +40,20 @@
MechanismControl::~MechanismControl() {
}
-bool MechanismControl::registerActuator(const std::string &name, int index) {
+bool MechanismControl::registerActuator(const std::string &name, int index)
+{
if (initialized_)
return false;
- actuators_.insert(ActuatorMap::value_type(name, index));
+ model_.actuators_lookup_.insert(Robot::IndexMap::value_type(name, index));
return true;
}
-bool MechanismControl::init(TiXmlElement* config) {
-
+bool MechanismControl::init(TiXmlElement* config)
+{
bool successful = true;
- // Creates:
- // - joints
- // - transmissions
TiXmlElement *elt;
// Constructs the joints
@@ -64,7 +62,8 @@
{
Joint *j = new Joint;
model_.joints_.push_back(j);
- joint_map[elt->Attribute("name")] = j;
+ model_.joints_lookup_.insert(
+ Robot::IndexMap::value_type(elt->Attribute("name"), model_.joints_.size() - 1));
j->jointLimitMin = atof(elt->FirstChildElement("limitMin")->GetText());
j->jointLimitMax = atof(elt->FirstChildElement("limitMax")->GetText());
j->effortLimit = atof(elt->FirstChildElement("effortLimit")->GetText());
@@ -78,23 +77,23 @@
if (0 == strcmp("SimpleTransmission", elt->Attribute("type")))
{
// Looks up the joint and the actuator used by the transmission.
- std::map<std::string,Joint*>::iterator joint_it =
- joint_map.find(elt->FirstChildElement("joint")->Attribute("name"));
- ActuatorMap::iterator actuator_it =
- actuators_.find(elt->FirstChildElement("actuator")->Attribute("name"));
- if (joint_it == joint_map.end())
+ Robot::IndexMap::iterator joint_it =
+ model_.joints_lookup_.find(elt->FirstChildElement("joint")->Attribute("name"));
+ Robot::IndexMap::iterator actuator_it =
+ model_.actuators_lookup_.find(elt->FirstChildElement("actuator")->Attribute("name"));
+ if (joint_it == model_.joints_lookup_.end())
{
// TODO: report: The joint was not declared in the XML file
continue;
}
- if (actuator_it == actuators_.end())
+ if (actuator_it == model_.actuators_lookup_.end())
{
// TODO: report: The actuator was not registered with mechanism control.
continue;
}
Transmission *tr = new SimpleTransmission
- (joint_it->second, &hw_->actuator[actuator_it->second],
+ (model_.joints_[joint_it->second], &hw_->actuator[actuator_it->second],
atof(elt->FirstChildElement("mechanicalReduction")->Value()),
atof(elt->FirstChildElement("motorTorqueConstant")->Value()),
atof(elt->FirstChildElement("pulsesPerRevolution")->Value()));
Modified: pkg/trunk/robot_models/robot_mechanism_model/include/mechanism_model/robot.h
===================================================================
--- pkg/trunk/robot_models/robot_mechanism_model/include/mechanism_model/robot.h 2008-07-29 19:53:34 UTC (rev 2264)
+++ pkg/trunk/robot_models/robot_mechanism_model/include/mechanism_model/robot.h 2008-07-29 19:54:19 UTC (rev 2265)
@@ -32,38 +32,62 @@
#define ROBOT_H
#include <vector>
+#include <map>
+#include <string>
#include "mechanism_model/link.h"
#include "mechanism_model/joint.h"
#include "mechanism_model/transmission.h"
#include "hw_interface/hardware_interface.h"
namespace mechanism {
- class Robot{
- public:
- Robot(char *ns){}
- ~Robot()
- {
- std::vector<Transmission *>::size_type t;
- for (t = 0; t < transmissions_.size(); ++t)
- delete transmissions_[t];
- std::vector<Joint *>::size_type j;
- for (j = 0; j < joints_.size(); ++j)
- delete joints_[j];
- }
- char *name;
- Link *link;
- int numLinks;
- Joint *joint; // TODO: delete
- int numJoints;
- int numTransmissions;
- SimpleTransmission *transmission; // TODO: delete
+class Robot{
+public:
+ Robot(char *ns){}
+ ~Robot()
+ {
+ std::vector<Transmission *>::size_type t;
+ for (t = 0; t < transmissions_.size(); ++t)
+ delete transmissions_[t];
+ std::vector<Joint *>::size_type j;
+ for (j = 0; j < joints_.size(); ++j)
+ delete joints_[j];
+ }
- std::vector<Joint*> joints_;
- std::vector<Transmission*> transmissions_;
+ char *name;
+ Link *link;
+ int numLinks;
+ Joint *joint; // TODO: delete
+ int numJoints;
+ int numTransmissions;
+ SimpleTransmission *transmission; // TODO: delete
- HardwareInterface *hw_;
- };
+ std::vector<Joint*> joints_;
+ std::vector<Transmission*> transmissions_;
+
+ // Supports looking up joints and actuators by name. The IndexMap
+ // structure maps the name of the item to its index in the vectors.
+ typedef std::map<std::string,int> IndexMap;
+ IndexMap joints_lookup_;
+ IndexMap actuators_lookup_;
+ Joint* getJoint(const std::string &name)
+ {
+ IndexMap::iterator it = joints_lookup_.find(name);
+ if (it == joints_lookup_.end())
+ return NULL;
+ return joints_[it->second];
+ }
+ Actuator* getActuator(const std::string &name)
+ {
+ IndexMap::iterator it = actuators_lookup_.find(name);
+ if (it == actuators_lookup_.end())
+ return NULL;
+ return &hw_->actuator[it->second];
+ }
+
+ HardwareInterface *hw_;
+};
+
}
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|