我正在为XPLANE10编写一个插件,从ROS中获取MSG。 我的IDE是基于QTcreator 4.1.0的基于QT 5.7.0的Ubuntu 64位。我想使用C ++ 11标准
我的代码解释
主要初始化ROS并创建地图 - >容器。 ROS循环旋转,直到我的GUI发送一个MSG,我的AirPlane应该飞行。
MSG包含3个浮点数(phi,theta,psi),其中“phi”是AirPlane ID,theta包含我的ETA的ID(预计到达时间) psi包含我姿势的ID所有ID都保存在ParameterServer(lookuptable)中。 所以在开始时我查找返回向量的activeAirplanes。我想将它们存储在一个映射中,其中键是AirCraft ID,第二个参数是Object的一个实例。
所以我初始化了例子(在调试时查看容器):
[0] first = 1 // Airplane ID1
[0] second = new CObject(freq)
[1] first = 2 // Airplane ID2
[1] second = new CObject(freq)
如果我从GUI获得MSG
phi = 1
theta=2
psi=3
, ROS将回调
MSG(....std::map<i32, CObject> &container)
//如果phi为1,那么使用mapkey 1并从CObject
触发方法do_stuffdo_stuff(phi, theta, psi,freq)
我想在main
中调用函数int getPlanes(std::map<i32,CObject>& container)
{
...
getActiveAirplanesFromServer(activePlanes);
}
第一个问题: 如何将容器传递给我的回调?
第二个问题: 我如何并行化do_stuff()以便我的回调将返回main并且我可以命令更多的飞机而其他的计算机?
第三个问题: 如何通过引用传递容器的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->)...
}
Container仍为空。
答案 0 :(得分:0)
所以我读了一些关于指针的东西,我看到了我的错误..
我困惑*和&amp; 如果我想传递一个变量的地址我必须像
一样写int main()
{
int a = 0;
AddTwo(&a)
cout<<a<<endl; // Output: 2
}
void AddTwo(int* a)
{
a+=2;
}