SMACH专题(一)----安装与初探
最近使用ROS進行任務(wù)(Task)執(zhí)行,深切體會用傳統(tǒng)的方法實現(xiàn)是極其繁雜的。比如人臉錄入工作,包含人臉檢測,識別,語音提示,運動控制,這些子部分基本都是通過訂閱話題的回調(diào)函數(shù)中處理,之間的切換,如人臉識別,語音提示之間的切換,需要用信號量進行控制切換,當(dāng)多數(shù)據(jù)融合的時候,邏輯是極其的混亂的,也容易導(dǎo)致冗余代碼,后期的維護也是不易于維護的。深切體會到一個好的實現(xiàn)框架有多么的重要。正如自己的體會,PR2開發(fā)中,發(fā)現(xiàn)如果不用一套完整的框架去執(zhí)行任務(wù),會導(dǎo)致代碼的維護特別的繁雜,所以大佬們才開發(fā)這套smach狀態(tài)機功能包。而狀態(tài)機的思想也正符合機器人的這種多數(shù)據(jù)融合,多子任務(wù)執(zhí)行的問題。狀態(tài)機的優(yōu)點是:實現(xiàn)簡單,易于維護,重構(gòu)任務(wù)順序容易。最近的實現(xiàn)證明,smach正是為任務(wù)執(zhí)行量身定做的。經(jīng)檢索也發(fā)現(xiàn),國內(nèi)介紹關(guān)于smach狀態(tài)機的介紹和比較少,從這篇開始,我們將連續(xù)的介紹在ROS-Indigo版本下的smach使用。
1、安裝
學(xué)習(xí)smach之前需要安裝這個軟件,安裝smach有兩種方式:
a、使用apt-get直接安裝(推薦),只需要執(zhí)行如下代碼:
$ sudo apt-get install ros-indigo-executive-smach? b、使用源碼安裝,只需要在相應(yīng)的工作空間的src下,通過git clone拉取下來,比如在catkin_ws/src的目錄下執(zhí)行如下代碼:
$ git clone http://wiki.ros.org/smach/Tutorials?
2、smach介紹
smach[1]是ros中的一個實現(xiàn)有限狀態(tài)機的開發(fā)包,在ROS任務(wù)執(zhí)行中使用得比較多。一提到狀態(tài)機,大家可能會想起圖靈而望而生畏,別緊張,其實沒那么的難。smach使用了python實現(xiàn),所以要使用smach只能在python環(huán)境中使用,python使用起來很簡單,如果有編程基礎(chǔ),看幾個小時就可以上手,沒編程基礎(chǔ)的看幾天也可以很容易上手。
smach提供了actionlib整合和smach viewer兩大組件。smach viewer可以實時地查看任務(wù)執(zhí)行當(dāng)前的狀態(tài)節(jié)點位置,是調(diào)試開發(fā)的必備工具。smach還整合了動作狀態(tài),例如定點導(dǎo)航??梢园言掝}topic,服務(wù)service轉(zhuǎn)化為狀態(tài),也可以把一個類轉(zhuǎn)化為狀態(tài)節(jié)點。smach可以實現(xiàn)狀態(tài)的并發(fā)執(zhí)行,任務(wù)的重復(fù)執(zhí)行,層次嵌套復(fù)雜的狀態(tài)機(狀態(tài)機也可以作為一個狀態(tài))。
學(xué)習(xí)smach需要有兩個基礎(chǔ):狀態(tài)機和python知識。
a、狀態(tài)機
狀態(tài)機就是表示有限個狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的數(shù)學(xué)模型。參考資料[3],最簡單的例子就是燈的開燈和關(guān)燈的例子。用開燈狀態(tài)和關(guān)燈狀態(tài)描述燈的狀態(tài),狀態(tài)之間的轉(zhuǎn)換,通過開燈動作和關(guān)燈的動作來完成,基于smach打?qū)崿F(xiàn)如下:?
#!/usr/bin/env pythonimport roslib; roslib.load_manifest('smach_sample_node') import rospy import smach import smach_ros import time # define state Foo # define state Bar class Open(smach.State):def __init__(self):smach.State.__init__(self, outcomes=['closed'])def execute(self, userdata):rospy.loginfo('Opened')time.sleep(2)rospy.loginfo('Closeing')return 'closed' #define state close light class Close(smach.State):def __init__(self):smach.State.__init__(self, outcomes=['opened'])def execute(self, userdata):rospy.loginfo('Closed')time.sleep(2)rospy.loginfo('Closing')return 'opened'# main def main():rospy.init_node('smach_example_state_machine')# Create a SMACH state machinesm_light = smach.StateMachine(outcomes=['stop', 'succee'])# Open the container with sm_light:# Add states to the containersmach.StateMachine.add('OPEN', Open(), transitions={'closed':'CLOSE'})smach.StateMachine.add('CLOSE', Close(), transitions={'opened':'OPEN'})# Execute SMACH plansis = smach_ros.IntrospectionServer('sm_light', sm_light, '/SM_ROOT')sis.start()# Execute SMACH planoutcome = sm_light.execute()# Wait for ctrl-c to stop the application rospy.spin()sis.stop()if __name__ == '__main__':main()
?? 輸出結(jié)果:
[INFO] [WallTime: 1453689512.106141] Closed [INFO] [WallTime: 1453689514.108995] Closing [INFO] [WallTime: 1453689514.109447] State machine transitioning 'CLOSE':'opened'-->'OPEN' [INFO] [WallTime: 1453689514.109942] Opened [INFO] [WallTime: 1453689514.420038] Closeing [INFO] [WallTime: 1453689514.420271] State machine transitioning 'OPEN':'closed'-->'CLOSE'? 相應(yīng)的狀態(tài)機實時狀態(tài),如下圖所示:
大家發(fā)現(xiàn),基于smach實現(xiàn)狀態(tài)機器是如此打簡單,所以大膽打去弄熟它吧。
下面貼出兩張ros smach viewer生成的圖,直觀感受下狀態(tài)機的魅力。
簡單有限狀態(tài)機:
(來自:ros wiki)
較為復(fù)雜的有限狀態(tài)機:
(來自ros wiki)
b、python知識
網(wǎng)上資源特別多,這里不展開介紹了。請參考[2]
?
參考資料:
[1].?http://wiki.ros.org/smach/Tutorials
[2]. Python菜鳥教程
[3]. 有限狀態(tài)機
轉(zhuǎn)載于:https://www.cnblogs.com/cv-pr/p/5155828.html
總結(jié)
以上是生活随笔為你收集整理的SMACH专题(一)----安装与初探的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 添加指纹识别功能
- 下一篇: CADisplayLink的简单使用