ROS2筆記2--工作空間、功能包、節點

一、工作空間(Workspace)

ROS工作空間是用於存放ros功能包的一個文件夾,通常以ws結尾。用於存放工程開發相關的所有文件,包括源代碼、編譯生成的文件以及配置我呢見等。在ROS中工作空間是使用Catkin編譯系統來組織和管理代碼的基礎單元。每個工作空間通常包含一個或多個功能包,這些功能包包含了實現特定功能的代碼和資源。

1.1、創建工作空間

# 選擇指定目錄
cd ~
# 創建工作空間
mkdir -p ros_ws/src

1.2、編譯工作空間

colcon build
0
這個ros_ws就是工作空間的根目錄,裏面包含4個子目錄
src:代碼空間,用於後續編寫代碼、腳本等文件
build:編譯空間,保存編譯過程中產生的中間文件
install:安裝空間,放置編譯得到的可執行文件和腳本
log:日誌空間,編譯和運行過程中保存各種警告、錯誤、信息等日誌

1.3、設置環境變量

編譯成功後,需要設置環境變量
方法1:僅當前終端有效
source install/setup.bash
方法2:所有終端均有效
echo "source ~/ros_ws/install/setup.bash" >> ~/.bashrc
 

二、功能包(Package)

功能包是ROS中的一個基礎組織單元,包含了一組實現特定功能的源代碼文件、腳本、數據文件和其他資源。功能包可以獨立存在,也可以依賴於其他功能包。每個功能包都有自己的依賴關係和構建規則,這些信息通常在功能包的package.xml文件中定義。功能包的設計使得代碼複用和維護更加方便。
每個機器人可能有很多功能,比如移動控制、視覺感知、自主導航等,功能包的作用就是把不同的功能劃分到不同的功能包中,儘量降低各個功能模塊之間的耦合關係,當需要以功能包爲單位提供時比較方便,所以功能包是ROS提供軟件複用率的方法。

1、創建功能包

命令格式如下:
ros2 pkg create <package_name> --build-type <build-type> --dependencies <dependencies> --node-name
命令中:
pkg:表示功能包相關的功能
create:表示創建功能包
package_name:自定義功能包名稱
build-type:功能包類似是python還是C++的,如果是C或C++則爲ament_cmake;如果是python就是ament_python
dependencies:表示功能包的依賴項,C++需要包含rclcpp;Python需要包含rclpy,如有需要還有其他依賴
node-name:可執行程序的名稱,會自動生成對應的源文件並生成配置文件
比如在終端中分別創建C++和Python版本的功能包:
cd ~/ros_ws/src
# 創建C++功能包
ros2 pkg create pkg_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld
# 創建Python功能包
ros2 pkg create pkg_helloworld_py --build-type ament_python --dependencies rclpy --node-name helloworld
 

2、編譯功能包

創建好功能包後可以繼續完成代碼編寫,之後需要編譯和配置環境變量即可運行
cd ~/ros_ws/src
# 編譯工作空間所有功能包
colcon build
# 編譯指定1個或多個功能包
colcon build --packages-select 功能包名稱列表
source install/setup.bash
 

三、節點(Node)

節點是ROS中運行的最小執行單元,是一個可執行文件,可以執行一些計算任務,處理數據,或者控制硬件設備。節點之間通過話題(Topic)、服務(Service)或動作(Action)等機制進行通信。節點可以發佈話題提供其他節點訂閱,或者提供服務給其他節點調用。一個完整的機器人系統由許多協同工作的節點組成,ROS2中單個可執行文件可以包含一個或多個節點。
節點創建的流程如下:
1、編程接口初始化
2、創建節點初始化
3、實現節點功能
4、銷燬節點並關閉接口
以Python版本helloworld功能包節點爲例

1、創建功能包

cd ~/ros_ws/src
ros2 pkg create pkg_helloworld_py --build-type ament-python --dependencies rclpy --node-name helloworld
0

2、編寫代碼

創建功能包完成後,會自動創建hello world.py文件用於編寫節點代碼
 
0
 
編寫helloworld.py代碼,邏輯爲定時1秒打印一次Hello World
import rclpy                             # ROS2 Python接口庫
from rclpy.node import Node              # ROS2 節點類
import time

# 定義HelloWorld節點,初始化時定時打印"Hello World"
class HelloWorldNode(Node):
    def __init__(self, name):
        super().__init__(name)                         # ROS2節點父類初始化
        while rclpy.ok():                              # ROS2系統是否正常運行
            self.get_logger().info("Hello World")      # ROS2日誌輸出
            time.sleep(1)
    

def main(args=None):                                  # ROS2節點主入口函數
    rclpy.init(args=args)                             # ROS2 Python接口初始化
    node = HelloWorldNode("helloworld")               # 初始化ROS2節點對象
    rclpy.spin(node)                                  # 循環等待ROS2退出 
    node.destroy_node()                               # 銷燬節點對象
    rclpy.shutdown()                                  # 關閉ROS2 Python接口

代碼編寫完成後需要設置功能包的編譯選項,讓系統知道程序的入口,打開功能包的setup.py文件,加入程序入口的配置: 

0
其中helloworld是可執行文件名稱,pkg_helloworld_py是功能包名稱,helloworld:main是python文件名稱和入口函數名

3、編譯代碼

cd ~/ros_ws
colcon build --packages-select pkg_helloworld_py
source install/setup.bash
0

4、運行節點

ros2 run pkg_helloworld_py helloworld
 運行成功後終端中定時打印“Hello World”字符串
0
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章