ROS筆記:Python__Python

來源:互聯網
上載者:User
ROS筆記:Python

@(ROS)[ROS|Python|rospy|環境變數]
記錄並分析ROS的整個Python系統體系,爭取搞清楚內部原理。同時深入學習Python編程。

ROS筆記Python rospy Initialization and Shutdown Messages Publishers and Subscribers Services Parameter Server Logging Time Exceptions rospy_tutorials樣本包

1. rospy

http://wiki.ros.org/rospy/Overview Initialization and Shutdown

PYTHONPATH:

可使用 echo $PYTHONPATH 查看。 這個環境變數是bash下的python使用的,根據這個環境變數裡的目錄去搜尋可被import的Python模組。 執行“$ source xxx/setup.bash”命令時自動將當前工作區的python包目錄添加到這個環境變數中。 比如安裝ros時執行過“$ source /opt/ros/indigo/setup.bash”,是在PYTHONPATH中添加了目錄“/opt/ros/indigo/lib/python2.7/dist-packages”。 比如在自己工作區執行“$ source devel/setup.bash”,是在PYTHONPATH中添加了目錄“{YOUR_CATKIN_WS}/devel/lib/python2.7/dist-packages”。 ? 似乎setup.bash 和 setup.py 還有些關係 ?

init and shutdown rospy.init_node(name, anonymous=False, log_level=rospy.INFO, disable_signals=False) rospy.on_shutdown(h)這個函數為Ctrl+C這類shutdown事件建立一個退出之前的回呼函數h,可以在程式退出之前做點什麼。如果在h函數內Publish訊息,不保證能成功發出訊息。在rospy_tutorial樣本中經過驗證。 Messages

Message generation 自訂的msg和srv,在catkin_make時被自動產生為python模組源碼,儲存在“{YOUR_CATKIN_WS}/devel/lib/python2.7/dist-packages”目錄下。 msg檔案和Python模組的對應關係是:package_name/msg/Foo.msg → package_name.msg.Foo srv檔案和Python模組的對應關係是:package_name/srv/Bar.srv → package_name.srv.Bar

Message initialization
遵循Python的文法進行訊息變數的執行個體化。有三種方式:無參數、順序參數、關鍵字參數。

No arguments

msg = std_msgs.msg.ColorRGBA( )
msg.b=255
msg.a=121

In-order arguments (*args)

msg = std_msgs.msg.ColorRGBA(255.0, 255.0, 255.0, 128.0)

Keyword arguments (**kwds)

msg = std_msgs.msg.ColorRGBA(b=255)

三種方式各有利弊。官方推薦用keyword方式,能更好的適應message類型定義的變化。 Publishers and Subscribers

rospy.Publisher initialization

pub = rospy.Publisher(‘topic_name’, std_msgs.msg.String, queue_size=10)

其它參數: subscriber_listener=rospy.SubscribeListener
當有subscriber串連或斷開時的回呼函數。 tcp_nodelay=False
是否使能TCP_NODELAY 功能。傳輸低延遲,也更耗資源。 latch=False
是否使能連結鎖存功能。儲存最後發送的資料,再有新連結時發送鎖存資料。有利於比如map這類改變很小的大資料量訊息。 headers=None (dict)
在建立連結時的header中加入自訂的索引值對(dict類型)。 queue_size=None (int)
這個很重要。。。見下面詳解。

Publisher.publish()
遵循Python文法,有三種方式調用publish()函數:

顯式方法:

pub.publish(std_msgs.msg.ColorRGBA(255, 255, 255, 128))

隱式(順序參數)方法:

pub.publish(255, 255, 255, 128)

隱式(關鍵字參數)方法:

pub.publish(b=255)

queue_size: 發送模式
因為曆史原因向後相容,rospy中的publish()預設是阻塞式同步發送模式。這將導致串連斷開後publish卡死(比如無線串連的publisher和subscriber)。
不過,可以將publish和subscribe的queue_size寫入一個大於0的值使publish成為非同步模式。

queue_size: queue_size: None(不建議)
這將設定為阻塞式同步收發模式。 queue_size: 0(不建議)
這將設定為無限緩衝區模式,很危險。 queue_size: 1,2,3
對於只關心最新資料的sensor訊息,可以設為1;
對於系統負載不高,能及時處理的訊息,可以設為1,2,3. queue_size: 10 or more
一般情況下,設為10 。queue_size太大了會導致資料延遲不同步。

_connection_header
topic串連後,發送的資料中包括header資訊,訂閱者subscriber可以在回呼函數的data中查看header資訊:data._connection_header。內部可能包含的內容為:

{‘callerid’: ‘/talker_38321_1284999593611’,
‘latching’: ‘0’,
‘md5sum’: ‘992ce8a1687cec8c8bd883ec73ca41d1’,
‘message_definition’: ‘string data\n\n’,
‘topic’: ‘/chatter’,
‘type’: ‘std_msgs/String’}

發行者talker可以在建立topic時添加自訂的header內容,樣本為:

pub = rospy.Publisher(‘topic_demo’, String, headers={‘cookies’:’hello’}, queue_size=10) Services

Service definitions 自訂的msg和srv,在catkin_make時被自動產生為python模組源碼,儲存在“{YOUR_CATKIN_WS}/devel/lib/python2.7/dist-packages”目錄下。

srv檔案和Python模組的對應關係如下:

my_package/srv/Foo.srv → my_package.srv.Foo
my_package/srv/Foo.srv → my_package.srv.FooRequest
my_package/srv/Foo.srv → my_package.srv.FooResponse

需要source {YOUR_CATKIN_WS}/devel/setup.bash將模組目錄添加到PYTHONPATH環境變數中,才能在python代碼中用from x.srv import * 的形式引入srv模組。

Service proxy

client端用proxy代理建立同service的通訊:

add_two_ints = rospy.ServiceProxy(‘add_two_ints’, AddTwoInts)

可以用rospy.wait_for_service()阻塞等待service存在。 構建Request執行個體的方式同樣有三種:顯示方法、隱式(順序參數)方法、隱式(關鍵字參數)方法。

exceptions
service可能拋出3種異常: TypeError
Request類型不正確。 ServiceException
與遠程service串連失敗。 ROSSerializationException
資料異常。

Persistent connections
client設定ServiceProxy()參數persistent=True將建立持久串連,否則預設為每次都是串連-通訊-斷開。
持久串連比較脆弱,不推薦。

Service connection headers
service的server和client通訊資料中也帶有header資訊,client端可自訂添加其它資訊到header中。

h = { ‘cookies’ : ‘peanut butter’ }
s = rospy.ServiceProxy(‘foo’, Foo, headers=h)

在request和response中都可以查看header資料:

request._connection_header
response._connection_header Parameter Server

Getting parameters

global_name = rospy.get_param(“/global_name”)
relative_name = rospy.get_param(“relative_name”)
private_param = rospy.get_param(‘~private_name’)
default_param = rospy.get_param(‘default_param’, ‘default_value’)
# fetch a group (dictionary) of parameters
gains = rospy.get_param(‘gains’)
p, i, d = gains[‘P’], gains[‘I’], gains[‘D’]

Setting parameters

rospy.set_param(‘a_string’, ‘baz’)
rospy.set_param(‘~private_int’, 2)
rospy.set_param(‘list_of_floats’, [1., 2., 3., 4.])
rospy.set_param(‘bool_True’, True)
rospy.set_param(‘gains’, {‘p’: 1, ‘i’: 2, ‘d’: 3})

Deleting parameters

rospy.delete_param(param_name)

Parameter existence
執行get_param()和delete_param()前,最好檢查一下參數名是否存在。否則會引發KeyError異常。

rospy.has_param(param_name) Logging Reading log messages
每個node都可以發送log,可以在4的地方讀取這些logs:

Debug Info Warn Error Fatal
stdout X
stderr X X X
log file X X X X X
/rosout o X X X X
Time

time和duration是rospy中兩個重要的時間概念。
兩者單位一樣,直接print則是納秒。數值形式一樣:

int32 secs
int32 nsecs

time時刻,類型是rospy.Time。
duration時段,類型是rospy.Duration。

時刻和時段之間的計算關係:

two_hours = rospy.Duration(60*60) + rospy.Duration(60*60)
one_hour = rospy.Duration(2*60*60) - rospy.Duration(60*60)
tomorrow = rospy.Time.now() + rospy.Duration(24*60*60)
negative_one_day = rospy.Time.now() - tomorrow

timer

rospy.Timer(period, callback, oneshot=False)

在callback函數中參數為event:rospy.TimerEvent。TimerEvent的內部屬性包括: current_expected: 理想值,這次callback的被調用時刻。 current_real: 現實值,這次callback的被調用時刻。 last_expected: 上次的理想值。 last_real: 上次的現實值。 last_duration: 上次callback的持續時段。 Exceptions

除了python體系內的異常類型,rospy還有下面幾種exception異常類型:
- ROSException: ROS相關異常的基類。
- ROSSerializationException: ROS訊息序列化異常。
- ROSInitException: ROS初始化異常。
- ROSInterruptException:ROS中斷異常。
- ROSInternalException:ROS內部異常。
- ServiceException:Service通訊異常。 2. rospy_tutorials樣本包

首頁:http://wiki.ros.org/rospy_tutorials
源碼:https://github.com/ros/ros_tutorials/tree/indigo-devel/rospy_tutorials

rospy_tutorial是ros_tutorial組中的一個package,提供了基本程式碼範例,便於初學者學習。ros_tutorial在安裝desktop-full完整版ros時一併安裝了。但是為了便於從源碼學習理解,建議刪除卸載掉ros_tutorial包及相關依賴包(roscpp_tutorial和rospy_tutorial)

sudo apt-get remove ros-indigo-ros-tutorial

rospy_tutorial包中包括了rospy的大部分常用概念和樣本。可以將這個包下載到自己的catkin_workspace下,運行catkin_make編譯。

catkin_make將在devel/lib/python2.7/dist-packages/目錄下產生msg和srv的模組py檔案。

然後,source devel/setup.bash後,就可以用roslaunch或rosrun運行了。也可以直接用python方式運行py檔案,和rosrun一樣的效果。

注意:自己建立的python檔案需要 chmod +x YOUR.py增加執行許可權,才能被rosrun補全tab識別。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.