- 这里的测试代码,都是跨平台的,即windows、android一样。但为有好的调试环境,着重用windows下的visual studio。
- 进入测试前,一定要先编译出launcher.exe。
一、Ros通信机制:topic、service、action等
1.1 进程内不复制(nocopy-intra = true)
这种方式下,不须要运行roscore。
步骤1:修改<apps-src>/apps/launcher/map_controller.hpp
class map_controller : public base_controller, public events::mouse_handler_base, public tros_instance::tslot { private: std::unique_ptr<net::tworker> node1_; std::unique_ptr<net::tworker> node2_; };
在map_controller.hpp增加以上代码。
步骤2:修改<apps-src>/apps/launcher/map_controller.cpp
void map_controller::click_insert() { const bool test = true; if (test) { if (node1_.get() == nullptr) { node1_.reset(new net::tworker(std::bind(test__talker, _1), NULL, NULL, NULL, "talker")); node2_.reset(new net::tworker(std::bind(test__listener, _1), NULL, NULL, NULL, "listener")); run_widget_->set_label("misc/stop96.png"); } else { run_widget_->set_label("misc/start.png"); node1_.reset(); node2_.reset(); } return; } ...... }
在map_controller::click_insert增加以上代码。让在test = true时,第一次click_insert,运行两个线程,每个线程对应一个node,第二次click_insert,则销毁这两个线程,即退出这两个node。
步骤3:运行launcher、测试结果

- Debug——Start Debugging,运行launcher.exe。
- 进入“地图”。
- 单击右上角“Run”按钮,触发执行click_insert,启动两node。在Visual Studio的output会看到test__talker、test__listener中的相关日志。
- 再次单击右上角“Run”按钮,让再次触发执行click_insert,退出两node。
以上测试成功后,便可深入看Rose-Ros代码。1)nocopy-intra = true时的ros master机制。2)让node1_、node2_运行其它node,像service、action机制的。3)可定义更多net::tworker,让同时运行更多node。
1.2 Ros原有的一node一进程模式(nocopy-intra = false)
步骤1:启动cmd,运行roscore。
步骤2:参考“1.1 进程内不复制(nocopy-intra = true)”,测试相关功能。要是在这之前没有运行过roscore,launcher会阻塞在master.cpp的bool execute(const std::string& method, ...),要看具体哪语句可执行“Debug——Break All”。
步骤3:启动另一个cmd,此时launcher就是个标准ros node,rosnode命令可看到这个node。在node1_、node2_未销毁时,运行rostopic、rosservice,可看到launcher中创建的话题等。