- ROS 2機器人開發(fā):從入門到實踐
- 桑欣
- 1113字
- 2024-10-14 16:11:41
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ù)注釋