官术网_书友最值得收藏!

2.1.1 Python示例

ROS 2提供了豐富的Python版本的客戶端接口庫,讓你通過簡單的調(diào)用即可完成節(jié)點的創(chuàng)建。

在主目錄下創(chuàng)建chapt2/文件夾,并用VS Code打開該文件夾,接著創(chuàng)建ros2_python_node.py文件,在文件中編寫代碼清單2-1的內(nèi)容。

代碼清單2-1 一個最簡單的Python節(jié)點

如代碼清單2-1所示,首先導入ROS 2提供的Python版本客戶端庫rclpy,從rclpy庫的node模塊中導入Node類。然后定義了一個main函數(shù),在函數(shù)里調(diào)用rclpy的init方法為接下來的通信分配資源,接著創(chuàng)建一個名為python_node的Node類實例,有了node實例,就可以通過它來訂閱或者發(fā)布話題了,通信并不是本節(jié)的重點,所以這里沒有進行任何操作。

創(chuàng)建完節(jié)點后,使用spin方法啟動該節(jié)點,spin方法恰如其名,它會不斷地循環(huán)檢查被其運行的節(jié)點是否收到新的話題數(shù)據(jù)等事件,直到該節(jié)點被關(guān)閉為止。之后,rclpy.shutdown()方法用于清理分配的資源并確認節(jié)點是否被關(guān)閉。

在了解了每一行代碼的作用后,運行代碼,按Ctrl+Shift+~鍵可以快速地在VS Code內(nèi)打開集成終端,輸入代碼清單2-2中的命令運行代碼。

代碼清單2-2 使用Python執(zhí)行節(jié)點

運行后會發(fā)現(xiàn)終端并沒有任何輸出和提示,此時不要懷疑代碼有問題,節(jié)點其實已經(jīng)運行起來了。按Ctrl+Shift+5鍵可以在VS Code原有的終端旁添加一個新的終端,在終端中輸入代碼清單2-3所示的命令。

代碼清單2-3 使用命令行查詢節(jié)點列表

代碼清單2-3中的ros2 node list是ROS 2命令行工具的節(jié)點模塊下的命令之一,用于查看當前的節(jié)點列表,看到/python_node就代表我們的第一個ROS 2節(jié)點啟動成功了。但啟動后沒有一點提示顯然不太友好,所以修改代碼清單2-1中的main函數(shù),加一句輸出,如代碼清單2-4所示。

代碼清單2-4 添加輸出的節(jié)點代碼

這里我們加了一句輸出指令,但并沒有使用你所熟悉的print函數(shù),而是先通過node實例調(diào)用get_logger()獲取日志記錄器,接著調(diào)用日志記錄器的info方法輸出了一句話。

接著來運行測試一下,在剛剛運行節(jié)點的終端里,按Ctrl+C鍵,該命令可以打斷當前終端運行的程序,輸入代碼清單2-5所示的命令并運行。

代碼清單2-5 運行帶日志輸出的Python節(jié)點

可以看到這里不僅輸出了我們想要的內(nèi)容,還輸出了日志的級別、時間和節(jié)點信息。如果你想查看更多日志信息,可以通過環(huán)境變量RCUTILS_CONSOLE_OUTPUT_FORMAT修改輸出的日志格式,使用如代碼清單2-6所示的設(shè)置就可以在輸出消息的同時輸出代碼所在的函數(shù)和行號。

代碼清單2-6 使用環(huán)境變量輸出更多的信息

使用{}包含特定單詞就可以表示對應(yīng)的消息,除了上面代碼使用的三個外,還有表示日志級別的severity、表示日志記錄器名的name、表示文件名字的file_name、表示時間戳的time以及表示納秒時間戳的time_as_nanoseconds。

第一個Python節(jié)點到這里就算寫完了,但在寫代碼的時候好像沒有提示,這是因為沒有安裝Python插件。如圖2-1所示,打開VS Code的擴展,搜索Python,安裝第一個插件即可。

圖2-1 安裝插件

再次編輯代碼時你會發(fā)現(xiàn)如圖2-2所示的提示。把鼠標指針長時間懸停在某個函數(shù)上,函數(shù)注釋就會隨之跳出,如圖2-3所示。

圖2-2 代碼提示

圖2-3 函數(shù)注釋

主站蜘蛛池模板: 海晏县| 东乌| 时尚| 黄山市| 营山县| 嵩明县| 濉溪县| 七台河市| 浦江县| 古交市| 忻城县| 保靖县| 浏阳市| 东兰县| 万州区| 上蔡县| 许昌县| 专栏| 英吉沙县| 昌乐县| 五指山市| 墨脱县| 苍南县| 新竹县| 万州区| 延长县| 青州市| 新泰市| 祁门县| 孟津县| 高州市| 牡丹江市| 佛冈县| 贡嘎县| 南康市| 裕民县| 建宁县| 铜陵市| 吐鲁番市| 封开县| 林芝县|