# 面试题 * 在ROS中,通过捕捉按键输入完成飞机的模式切换,该方式比较适合多机一键起飞或者其他模式切换操作。 简单说明:采用的是C++标准库提供的cin函数,但是这种方式为阻塞等待键盘按下,所以需要采用多线程或者多进程的方式,又采用了的是共享变量(标志位)的想法,故在一个进程中采用多线程即可。下面的示例给出一个简单的实现模板。在ROS中可以直接编译执行,在单C++函数中,需要在g++ -lpthread完成编译。join的作用为主函数运行结束后,子线程仍然可以一直运行,而不是一起结束 ```c++ #include #include int count = 0; void thr_fun1(void) {     while(1)     {         if(count == 1)         {             std::cout<<"here!"<>str;         if(str=="arm")         {             std::cout<<"quadrotor armed!"< releaseHydrogen) { unique_lock l(m); cv.wait(l, [this]() { // 氢气最大是2 return this->cntH < 2; }); // releaseHydrogen() outputs "H". Do not change or remove this line. releaseHydrogen(); ++cntH; // 已经构成 H2O ,重置计数器 if (cntH + cntO == 3) { cntH = 0; cntO = 0; } cv.notify_one(); } void oxygen(function releaseOxygen) { unique_lock l(m); cv.wait(l, [this]() { // 氧气最大是1 return this->cntO < 1; }); // releaseOxygen() outputs "O". Do not change or remove this line. releaseOxygen(); ++cntO; // 已经构成 H2O ,重置计数器 if (cntH + cntO == 3) { cntH = 0; cntO = 0; } cv.notify_one(); } }; ``` 用图画出无人机姿态控制的串级反馈控制系统 ![image-20210513172820775](C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210513172820775.png) 进程间通信消息队列