本帖看似短小,但是凝结了我这一个月的全部心得体会,日后打算专门出一期视频专门说说ros机器人的代码结构和类设计,今天先在这里简单记录一下
到目前我接触过两种架构,根据多节点式和单节点式(自己发明的名字)。根据功能分多个节点的好处显而易见:结构清晰、便于监听检测数据、简单易懂。然而,它也有其弊端:
- 首先就是太麻烦,想用个什么东西都得转化成msg,通过话题来传递;
- 然后就是内存占用和维护效率问题,如果是小数据还好,就怕那种大数据且高频的更新的,例如在线维护的map,而且需要单独开辟一份空间存储那些收听的数据,内存成本极大;当然,现在也有nodelet可以帮助我们提高数据传输的效率,但这无疑提高了写程序的门槛,到现在我也没用过这个功能。。。
- 最后就是多个节点之间的启动顺序难以控制,启动也麻烦,多个节点我之前都是写个roslaunch 挨个启动的,然后给每个节点设置sleep时间或者triger来大致控制他们的启动时机。。。。
基于这三点,我现在写代码基本不会写一堆节点,然后用roslaunch挨个启动了,相比起来,单节点式的布局则干净清爽!我可以定义多个class来分管功能;设置合适的class嵌套和变量权限来管理内存;将默认构造置空自定义init来实现每个class功能的自定义初始化并把控做他们的时机;共享ros句柄既可以让我利用到ros的参数服务器、话题机制,又不用内部传参;另外我可以借助make_shared将自己定义的数据结构(class, struct等)typedef为Ptr(智能指针),从而可以放心使用他们而不用担心内存泄漏问题。
我爱C++!真的!