你們好,我是小魚。很早以前關注小魚的同窗都知道小魚寫的《ROS鎮長和豔娘傳奇》的故事(詳解ROS通訊機制),不知道的能夠點下面的連接。node
ROS學習系列:村長說給我來一本豔娘傳奇!一文搞懂話題和服務mp.weixin.qq.compython
原本這只是小魚寫的一個故事,但小魚如今正好在寫ROS2教程,因而打算把他們用代碼給實現出來。git
因此今天小魚就帶你們動手來建立ROS鎮、王家村和鄉村做家李四。github
節點須要存在於功能包當中、功能包須要存在於工做空間當中。因此咱們要先建立一個工做空間,再建立功能包。算法
工做空間就是文件夾,因此很簡單bash
mkdir -p town_ws/srccd town_ws/src
複製代碼
這個小魚不打算單獨講,遇到一個命令說一個。markdown
咱們先講一下如何建立一個名字叫作village_li
(李家村)python版本的功能包。函數
ros2 pkg create village_li --build-type ament_python --dependencies rclpy
複製代碼
你們能夠手寫一下這個代碼,感覺一下。如今小魚來說一講這條命令的含義和參數。oop
ament_python
、ament_cmake
、cmake
rclpy
若是build_type什麼都不寫,ros2會默認類型爲ament_cmake.學習
最後你能夠獲得這樣一個目錄結構。
接下來咱們開始編寫一個python節點,首先在__init__.py
同級別目錄下建立一個叫作lisi.py
的文件(在vscode中右擊新建就行)。
建立完成後的目錄結構長這樣子
打開lisi.py,接着咱們開始編寫代碼。跟着小魚一塊兒邊理解輸入下面的代碼,註釋不用輸。
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
class LisiNode(Node):
"""
建立一個李四節點,並在初始化時輸出一個話
"""
def __init__(self):
super().__init__("lisi") #給節點一個名字 lisi
self.get_logger().info("你們好,我是豔娘傳奇做者李四!") #來個自我介紹
def main(args=None):
"""
ros2運行該節點的入口函數,可配置函數名稱
"""
rclpy.init(args=args) # 初始化rclpy
node = LisiNode() # 新建一個節點
rclpy.spin(node) # 保持節點運行,檢測是否收到退出指令(Ctrl+C)
rclpy.shutdown() # rcl關閉
複製代碼
輸完代碼Crtl+S進行保存。接着修改setup.py
增長一句話,告訴ros2村莊來了一位新村民李四,要找到這位村民去village_li.lisi:main
。
entry_points={'console_scripts': ["lisi_node = village_li.lisi:main" ],},)
複製代碼
完成上面的工做後,接下來就能夠編譯運行了。
打開終端,進入town_ws
colcon build
複製代碼
source install/setup.bash
複製代碼
ros2 run village_li lisi_node
複製代碼
4.總結
當節點運行起來後,能夠嘗試使用ros2 node list
指令來查看現有的節點。這個時候你應該能看到:
這說明你的節點已經運行起來了,而且被其餘節點感知到了。
這一節,小魚帶你一塊兒使用Python完成了python節點的編寫,成功建立出來一個lisi的節點。下一節小魚帶你一塊兒去王家村,來建立單身漢王二。
我是小魚,一名在職機器人算法工程師
目前在作輸出
機器人算法註解、學習教程、工做經驗等
歡迎你們關注
原文連接: