From 2878d80109c17e41c628e7b38cc11d51e781b6b9 Mon Sep 17 00:00:00 2001 From: yewuya Date: Thu, 13 May 2021 18:26:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=BA=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 出题.md | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 出题.md diff --git a/出题.md b/出题.md new file mode 100644 index 0000000..8123594 --- /dev/null +++ b/出题.md @@ -0,0 +1,126 @@ +# 面试题 + +* 在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) + +进程间通信消息队列 + + + + +