3
\author Shin'ichiro Nakaoka
6
#include "Controller_impl.h"
10
#include <rtm/Manager.h>
11
#include <rtm/RTObject.h>
12
#include <rtm/NVUtil.h>
16
#include "VirtualRobotRTC.h"
19
using namespace boost;
20
using namespace OpenHRP;
21
using namespace OpenHRP::ControllerBridge;
24
const bool CONTROLLER_BRIDGE_DEBUG = false;
28
Controller_impl::Controller_impl(BridgeConf* bridgeConf, const char* robotName, VirtualRobotRTC* virtualRobotRTC)
29
: bridgeConf(bridgeConf),
31
virtualRobotRTC(virtualRobotRTC)
33
if(CONTROLLER_BRIDGE_DEBUG){
34
cout << "Controller_impl::Controller_impl" << endl;
37
virtualRobotRTC->isOwnedByController = true;
40
setupRtcConnections();
44
Controller_impl::~Controller_impl()
46
if(CONTROLLER_BRIDGE_DEBUG){
47
cout << "Controller_impl::~Controller_impl" << endl;
52
virtualRobotRTC->isOwnedByController = false;
53
//virtualRobotRTC->exit();
57
void Controller_impl::makePortMap(PortMap& portMap, RTC::RTObject_ptr rtc)
59
RTC::PortList_var ports = rtc->get_ports();
60
for(CORBA::ULong i=0; i < ports->length(); ++i){
61
RTC::PortProfile_var profile = ports[i]->get_port_profile();
62
portMap[string(profile->name)] = ports[i];
67
void Controller_impl::setupRtcs()
69
RTC::Manager& rtcManager = RTC::Manager::instance();
71
string nameServer = rtcManager.getConfig()["corba.nameservers"];
72
cout << "setting naming" << endl;
73
int comPos = nameServer.find(",");
75
comPos = nameServer.length();
77
nameServer = nameServer.substr(0, comPos);
78
naming = new RTC::CorbaNaming(rtcManager.getORB(), nameServer.c_str());
80
cout << "setup RT components" << endl;
82
for(size_t i=0; i < bridgeConf->portConnections.size(); ++i){
84
PortConnection& connection = bridgeConf->portConnections[i];
86
CORBA::Object_ptr rtcRef = 0;
89
if(connection.controllerInstanceName.empty()){
90
if(!bridgeConf->moduleInfoList.empty()){
91
RTC::RtcBase* rtcServant = bridgeConf->moduleInfoList.front().rtcServant;
92
rtcName = rtcServant->getInstanceName();
93
rtcRef = rtcServant->getObjRef();
96
rtcName = connection.controllerInstanceName;
97
rtcRef = naming->resolve(rtcName.c_str());
100
if(!rtcRef || CORBA::is_nil(rtcRef)){
101
cout << rtcName << " is not found." << endl;
104
RtcInfoMap::iterator p = rtcInfoMap.find(rtcName);
105
if(p == rtcInfoMap.end()){
107
cout << rtcName << " is found." << endl;
109
RtcInfoPtr rtcInfo(new RtcInfo());
110
rtcInfo->rtcRef.setObject(rtcRef);
111
makePortMap(rtcInfo->portMap, rtcInfo->rtcRef._ptr());
112
rtcInfo->timeRate = 1.0;
114
rtcInfoMap.insert(make_pair(rtcName, rtcInfo));
116
RTC::ExecutionContextServiceList_var eclist = rtcInfo->rtcRef->get_execution_context_services();
117
for(CORBA::ULong i=0; i < eclist->length(); ++i){
118
if(!CORBA::is_nil(eclist[i])){
119
rtcInfo->execContext.setObject(eclist[i]);
120
cout << "The execution context of " << rtcName << " is detected" << endl;
130
void Controller_impl::setupRtcConnections()
132
for(size_t i=0; i < bridgeConf->portConnections.size(); ++i){
134
const PortConnection& connection = bridgeConf->portConnections[i];
136
string controllerInstanceName = connection.controllerInstanceName;
137
if(controllerInstanceName.empty()){
138
if(!bridgeConf->moduleInfoList.empty()){
139
RTC::RtcBase* rtcServant = bridgeConf->moduleInfoList.front().rtcServant;
140
controllerInstanceName = rtcServant->getInstanceName();
144
RtcInfoMap::iterator p = rtcInfoMap.find(controllerInstanceName);
145
if(p != rtcInfoMap.end()){
147
RtcInfoPtr rtcInfo = p->second;
149
cout << "connect " << virtualRobotRTC->getInstanceName() << ":" << connection.robotPortName;
150
cout << " <--> " << controllerInstanceName << ":" << connection.controllerPortName << endl;
152
PortMap::iterator q = rtcInfo->portMap.find(connection.controllerPortName);
153
if(q == rtcInfo->portMap.end()){
154
cout << controllerInstanceName << " does not have a port ";
155
cout << connection.controllerPortName << endl;
157
RTC::Port_ptr controllerPortRef = q->second;
159
PortHandlerPtr robotPortHandler = virtualRobotRTC->getPortHandler(connection.robotPortName);
160
if(!robotPortHandler){
161
cout << "The robot does not have a port named " << connection.robotPortName << endl;
163
bool connected = false;
164
RTC::Port_ptr robotPortRef = robotPortHandler->portRef;
166
if(!CORBA::is_nil(robotPortRef)){
167
if(dynamic_pointer_cast<OutPortHandler>(robotPortHandler)){
168
connected = connectPorts(robotPortRef, controllerPortRef);
170
connected = connectPorts(controllerPortRef, robotPortRef);
174
cout << " ... ok" << endl;
176
cout << " ... failed." << endl;
185
bool Controller_impl::connectPorts(RTC::Port_ptr outPort, RTC::Port_ptr inPort)
188
RTC::ConnectorProfile cprof;
189
cprof.connector_id = "";
190
cprof.name = CORBA::string_dup("connector0");
191
cprof.ports.length(2);
192
cprof.ports[0] = RTC::Port::_duplicate(inPort);
193
cprof.ports[1] = RTC::Port::_duplicate(outPort);
195
CORBA_SeqUtil::push_back(cprof.properties,
196
NVUtil::newNV("dataport.interface_type",
198
CORBA_SeqUtil::push_back(cprof.properties,
199
NVUtil::newNV("dataport.dataflow_type",
201
CORBA_SeqUtil::push_back(cprof.properties,
202
NVUtil::newNV("dataport.subscription_type",
204
cout << "set " << endl;
205
RTC::ReturnCode_t result = inPort->connect(cprof);
207
return (result == RTC::RTC_OK);
211
void Controller_impl::setDynamicsSimulator(DynamicsSimulator_ptr dynamicsSimulator)
213
this->dynamicsSimulator = DynamicsSimulator::_duplicate(dynamicsSimulator);
217
void Controller_impl::setViewSimulator(ViewSimulator_ptr viewSimulator)
219
this->viewSimulator = ViewSimulator::_duplicate(viewSimulator);
223
void Controller_impl::start()
225
if(CONTROLLER_BRIDGE_DEBUG){
226
cout << "Controller_impl::onStart" << endl;
229
if(!CORBA::is_nil(viewSimulator)) {
230
viewSimulator->getCameraSequenceOf(robotName.c_str(), cameras);
233
for(RtcInfoMap::iterator p = rtcInfoMap.begin(); p != rtcInfoMap.end(); ++p){
234
RtcInfoPtr& rtcInfo = p->second;
235
rtcInfo->timeRateCounter = 1.0;
236
rtcInfo->execContext->activate_component(rtcInfo->rtcRef._ptr());
241
SensorState& Controller_impl::getCurrentSensorState()
243
if(!sensorStateUpdated){
244
dynamicsSimulator->getCharacterSensorState(robotName.c_str(), sensorState);
245
sensorStateUpdated = true;
252
DblSequence* Controller_impl::getLinkDataFromSimulator
253
(const std::string& linkName, DynamicsSimulator::LinkDataType linkDataType)
255
DblSequence_var data;
256
dynamicsSimulator->getCharacterLinkData(robotName.c_str(), linkName.c_str(), linkDataType, data.out());
261
DblSequence* Controller_impl::getSensorDataFromSimulator(const std::string& sensorName)
263
DblSequence_var data;
264
dynamicsSimulator->getCharacterSensorValues(robotName.c_str(), sensorName.c_str(), data.out());
269
ImageData* Controller_impl::getCameraImageFromSimulator(int cameraId)
271
ImageData_var imageData = cameras[cameraId]->getImageData();
272
return imageData._retn();
276
void Controller_impl::input()
278
if(CONTROLLER_BRIDGE_DEBUG){
279
cout << "Controller_impl::onInput" << endl;
282
sensorStateUpdated = false;
284
virtualRobotRTC->inputDataFromSimulator(this);
288
DblSequence& Controller_impl::getJointDataSeqRef(DynamicsSimulator::LinkDataType linkDataType)
290
return outputJointValueSeqInfos[linkDataType].values;
294
void Controller_impl::flushJointDataSeqToSimulator(DynamicsSimulator::LinkDataType linkDataType)
296
JointValueSeqInfoMap::iterator p = outputJointValueSeqInfos.find(linkDataType);
297
if(p != outputJointValueSeqInfos.end()){
298
JointValueSeqInfo& info = p->second;
300
dynamicsSimulator->setCharacterAllLinkData(robotName.c_str(), linkDataType, info.values);
307
void Controller_impl::output()
309
if(CONTROLLER_BRIDGE_DEBUG){
310
cout << "Controller_impl::output" << endl;
313
for(JointValueSeqInfoMap::iterator p = outputJointValueSeqInfos.begin();
314
p != outputJointValueSeqInfos.end(); ++p){
315
JointValueSeqInfo& info = p->second;
316
info.flushed = false;
319
virtualRobotRTC->outputDataToSimulator(this);
323
void Controller_impl::control()
325
if(CONTROLLER_BRIDGE_DEBUG){
326
cout << "Controller_impl::control" << endl;
329
virtualRobotRTC->writeDataToOutPorts();
331
for(RtcInfoMap::iterator p = rtcInfoMap.begin(); p != rtcInfoMap.end(); ++p){
332
RtcInfoPtr& rtcInfo = p->second;
333
rtcInfo->timeRateCounter += rtcInfo->timeRate;
334
if(rtcInfo->timeRateCounter >= 1.0){
335
rtcInfo->execContext->tick();
336
rtcInfo->timeRateCounter -= 1.0;
340
virtualRobotRTC->readDataFromInPorts(this);
344
void Controller_impl::stop()
350
void Controller_impl::destroy()
352
if(CONTROLLER_BRIDGE_DEBUG){
353
cout << "Controller_impl::destroy()" << endl;
356
PortableServer::POA_var poa = _default_POA();
357
PortableServer::ObjectId_var id = poa->servant_to_id(this);
358
poa->deactivate_object(id);
362
ControllerFactory_impl::ControllerFactory_impl(RTC::Manager* rtcManager, BridgeConf* bridgeConf)
363
: rtcManager(rtcManager),
364
bridgeConf(bridgeConf)
366
if(CONTROLLER_BRIDGE_DEBUG){
367
cout << "ControllerFactory_impl::ControllerFactory_impl()" << endl;
370
VirtualRobotRTC::registerFactory(rtcManager, bridgeConf->getVirtualRobotRtcTypeName());
372
currentVirtualRobotRTC = createVirtualRobotRTC();
376
ControllerFactory_impl::~ControllerFactory_impl()
378
if(CONTROLLER_BRIDGE_DEBUG){
379
cout << "ControllerFactory_impl::~ControllerFactory_impl()" << endl;
382
PortableServer::POA_var poa = _default_POA();
383
PortableServer::ObjectId_var id = poa->servant_to_id(this);
384
poa->deactivate_object(id);
388
Controller_ptr ControllerFactory_impl::create(const char* robotName)
390
if(CONTROLLER_BRIDGE_DEBUG){
391
cout << "ControllerFactory_impl::createController()" << endl;
394
Controller_impl* controller = 0;
396
if(!currentVirtualRobotRTC || currentVirtualRobotRTC->isOwnedByController){
397
currentVirtualRobotRTC = createVirtualRobotRTC();
400
if(currentVirtualRobotRTC){
402
controller = new Controller_impl(bridgeConf, robotName, currentVirtualRobotRTC);
403
_default_POA()->activate_object(controller);
405
} catch(CORBA_SystemException& ex){
406
cerr << ex._rep_id() << endl;
407
cerr << "exception in createController" << endl;
408
} catch(std::invalid_argument& ex){
409
cerr << "invalid argument : " << ex.what() << endl;
411
cerr << "unknown exception in ControllerFactory_impl::create()" << endl;
415
return controller->_this();
419
VirtualRobotRTC* ControllerFactory_impl::createVirtualRobotRTC()
421
RTC::RtcBase* rtc = rtcManager->createComponent(bridgeConf->getVirtualRobotRtcTypeName());
422
return dynamic_cast<VirtualRobotRTC*>(rtc);
426
void ControllerFactory_impl::shutdown()
428
if(CONTROLLER_BRIDGE_DEBUG){
429
cout << "ControllerFactory_impl::shutdown()" << endl;
432
rtcManager->terminate();