Я кодирую плагин для XPLANE10, который получает MSG из ROS. My IDE - QTcreator 4.1.0, основанный на QT 5.7.0 для 64-битного Ubuntu. Я хотел бы использовать C++ 11 Стандартыstd :: map pass by reference Указатель на объект
Мой код объяснил
Основной инициализирует ROS и создает карту -> контейнер. ROS вращается в цикле, пока мой графический интерфейс не отправит MSG, где должен летать мой AirPlane.
ГЗС содержит 3 поплавки (фи, тета, пси), где «фи» является аэроплан ID, тета содержит идентификатор для моего ETA (расчетное время прибытия) и пси содержит идентификатор для моей позе Все из Идентификаторы сохраняются в ParameterServer (lookuptable). Итак, в начале я просматриваю активные объекты, которые возвращают вектор. Я хотел бы сохранить их на карте, где ключ - это идентификатор AirCraft, а второй параметр - экземпляр объекта.
Так я инициализирован, например, (смотрел в контейнер во время отладки):
[0] first = 1 // Airplane ID1
[0] second = new CObject(freq)
[1] first = 2 // Airplane ID2
[1] second = new CObject(freq)
Если я получаю MSG из GUI
phi = 1
theta=2
psi=3
, ROS будет обратный вызов
MSG(....std::map<i32, CObject> &container)
// если phi равно 1, используйте mapkey 1 и запускайте метод do_stuff из CObject
do_stuff(phi, theta, psi,freq)
Я хотел бы вызвать в функции от главного
int getPlanes(std::map<i32,CObject>& container)
{
...
getActiveAirplanesFromServer(activePlanes);
}
Первый вопрос: Как я передать контейнер в мой обратный вызов?
Второй вопрос: Как я распараллеливание do_stuff(), поэтому мой обратный вызов возвращается к основной и я в состоянии командовать больше самолетов, а остальные рассчитываются?
Третий вопрос: Как бы правильный синтаксис для getPlanes передать контейнер по ссылке так getPlanes() может изменить его?
Четвертый вопрос: Есть ли разница между
std::map<i32,CObject*> map
std::map<i32,CObject>* map
и
std::map<i32,CObject*>::iterator it=container->begin();
std::map<i32,CObject*>::iterator* it=container->begin();
Если да, то, что я хочу?# 4Solved
// I have to edit stuff 'cause of some restrictions in my company.
#include "Header.h"
int main()
{
f64 freq = 10;
std::map<i32, CObject>* container;
std::map<i32,CObject>::iterator* it=container->begin();
// ROS
if(!ros::isInitialized())
{
int rosargc = 0;
char** rosargv = NULL;
ros::init(rosargc, rosargv, "MainNode");//), ros::init_options::AnonymousName);
}
else
{
printf("Ros has already been initialized.....\n");
}
ros::NodeHandle* mainNodeHandle=new ros::NodeHandle;
ros::AsyncSpinner spinner(2);
ParameterServer * ptrParam= new ParameterServer(mainNodeHandle);
ros::Subscriber airSub=mainNodeHandle->subscribe<own_msgs::ownStruct>("/MSG",
1000,
boost::bind(MSG,
_1,
freq,
container));
std::vector<i32> activePlanes;
i32 retVal=0;
retVal += ptrParam-> ParameterServer::getActiveAirplanesFromServer(activePlanes);
if (retVal == 0 && activePlanes.size()>0)
{
for (u32 j =0; j <activePlanes.size(); j++)
{
container->insert (std::pair<i32,CObject> (activePlanes[j] , new CObject(freq)));
}
}
while (ros::ok())
{
spinner.start(); //spinnt sehr viel :-)
ros::waitForShutdown();
}
std::cout<<"ENDE"<<std::endl;
int retval = 1;
return retval;
}
void MSG(const own_msgs::ownStruct<std::allocator<void> >::ConstPtr &guiMSG,
f64 freq,
std::map<i32, CObject> &container)
{
if ((guiMSG->phi != 0) && (guiMSG->theta != 0) && (guiMSG->psi != 0))
{
std::string alpha = std::to_string(guiMSG->phi)+std::to_string(guiMSG->theta)+to_string(guiMSG->psi);
container.at(guiMSG->phi) -> do_stuff(guiMSG->phi,guiMSG->theta,guiMSG->psi, freq);
}
else
{
std::cout<<" Did not receive anything\n"<<endl;
}
}
void do_stuff(...)
{
//copy the IDs to private Member of this single Object
//setROS() for this single Object
//callback the current AC pose via ID from XPLANE
//callback the wished AC pose via ID from ParamServer
// do some calculations for optimum flight path
// publish the Route to XPlane
}
EDIT :: Проблема я получаю это скомпилировать сейчас, и если отладить его и установить точку останова:
void MSG(const own_msgs::ownStruct<std::allocator<void> >::ConstPtr &guiMSG,f64 freq,std::map<i32, CObject*> &container)
{
..
/*->*/ container.at(guiMSG->)...
}
Контейнер остается пустым.
Первых из всего, что я предлагаю вам [найти книгу для начинающих] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list), потому что у вас много ошибок начинающих в вашем коде. Чтение книги научит вас разнице между «std :: map» и «std :: map *». –
Зачем вам нужна 'std :: map *'? – CinCout
Я что-то пробовал. Не удалось получить пропущенную ссылку с работающей картой. И iam не разрешено объявлять глобальную карту. – MightyMirko