目錄
系列文章目錄
前言
一、配置相關環境
二、創建工作空間
1.創建工作空間并初始化
2.進入 src 創建 ros 包并添加依賴
三、HelloWorld(C++版)
1.進入 ros 包的 src 目錄編輯源文件
2.編輯 ros 包下的 Cmakelist.txt文件
3.進入工作空間目錄并編譯
四 運行程序
五 總結問題
系列文章目錄
第一章 Ros入門 創建工作空間和運行ros包
前言
當你開始學習ROS(機器人操作系統)時,第一步通常是創建一個工作空間(workspace),它是你進行ROS開發的主要目錄。在工作空間中,你可以組織和管理ROS軟件包,構建和運行ROS節點,以及進行ROS相關的開發工作。我們的大致流程為
- 先創建一個工作空間;
- 再創建一個功能包;
- 編輯源文件;
- 編輯配置文件;
- 編譯并執行。
這篇教程會手把手帶你進行一次簡單的項目構建。先可以配合視頻使用https://www.bilibili.com/video/BV14642137Hn/?share_source=copy_web&vd_source=dc09b5f7d6dca9fee62fb97cb8d83044那么現在讓我們開始吧
一、配置相關環境
1. 確定是否安裝ros和cmake,打開終端輸入
rosversion -d
cmake --version
會顯示類似于這樣的界面
如果沒有安裝ros和ubantu,ros推薦魚香ros一鍵安裝
wget http://fishros.com/install -O fishros && . fishros
cmake安裝:
sudo apt update
sudo apt install cmake
二、創建工作空間
1.創建工作空間并初始化
首先,我們將創建一個ROS工作空間,并在其中創建一個名為 "src" 的子目錄。
在終端中執行以下命令:
mkdir -p 自定義空間名/src
cd 自定義空間名稱
catkin_make
這將在你的主目錄下創建一個名為 "catkin_ws" 的ROS工作空間,并在其中創建 "src" 目錄。接著,執行 "catkin_make" 命令來編譯工作空間。(我這里的工作空間命名為test_ws。)
編譯完成后,將在工作空間中生成兩個文件夾:
-
"build" 目錄:該目錄用于存放構建過程中生成的中間文件和最終生成的目標文件。這些文件包括編譯器生成的目標二進制文件、庫文件和其他構建過程中生成的臨時文件。
-
"devel" 目錄:該目錄用于存放配置文件,其中包含構建系統需要的環境變量和路徑信息。這些配置文件用于后續編譯和運行ROS軟件包。例如,"devel/setup.bash" 文件包含了設置ROS環境變量的命令,你可以在每次新打開的終端中執行該文件以設置正確的ROS環境。
2.進入 src 創建 ros 包并添加依賴
進入 "src" 目錄,并使用?catkin_create_pkg
?命令創建一個ROS包。在終端中執行以下命令:
cd src
catkin_create_pkg 自定義ROS包名 roscpp rospy std_msgs
這些命令將在工作空間下生成一個功能包,該功能包依賴于 "roscpp"、"rospy" 和 "std_msgs"。其中,"roscpp" 是使用C++實現的庫,"rospy" 是使用Python實現的庫,"std_msgs" 是標準消息庫。創建ROS功能包時,一般都會依賴這三個庫實現基本的功能。
三、HelloWorld(C++版)
1.進入 ros 包的 src 目錄編輯源文件
cd 自定義的包
cpp原文件
#include <ros/ros.h>
#include <std_msgs/String.h>int main(int argc, char **argv)
{// 初始化ROS節點ros::init(argc, argv, "hello_world_node");// 創建ROS節點句柄ros::NodeHandle nh;// 創建一個發布者,發布類型為String的主題ros::Publisher pub = nh.advertise<std_msgs::String>("hello_world_topic", 10);// 設置循環的頻率ros::Rate rate(1); // 發布頻率為1Hzwhile (ros::ok()){// 創建一個String類型的消息std_msgs::String msg;msg.data = "Hello World";// 發布消息pub.publish(msg);// 輸出消息到控制臺ROS_INFO("Published: %s", msg.data.c_str());// 按照頻率休眠rate.sleep();}return 0;
}
2.編輯 ros 包下的 Cmakelist.txt文件
根據視頻的講解尋找到相關的cmake源代碼 并且反注釋
add_executable(步驟3的源文件名src/步驟3的源文件名.cpp
)
target_link_libraries(步驟3的源文件名${catkin_LIBRARIES}
)
這里我們來詳細的討論下這兩行代碼的含義:
- add_executable(步驟3的源文件名 src/步驟3的源文件名.cpp)
- 這個命令的作用是告訴CMake要將一個可執行文件添加到構建過程中。
add_executable
?是一個CMake的函數,它接受兩個參數。- 第一個參數是可執行文件的名稱,這里使用了"步驟3的源文件名"作為示例。
- 第二個參數是源文件的路徑,這里假設源文件位于"src"目錄下,并使用了"步驟3的源文件名.cpp"作為示例文件名。
- 這個命令會將源文件編譯成一個可執行文件,并將其添加到構建過程中,以便在構建時生成該可執行文件。
-
target_link_libraries(步驟3的源文件名 ${catkin_LIBRARIES})
- 這個命令的作用是將目標文件與指定的庫進行鏈接。
target_link_libraries
?是另一個CMake的函數,它接受兩個參數。- 第一個參數是目標文件的名稱,這里使用了"步驟3的源文件名"作為示例。
- 第二個參數是要鏈接的庫,這里使用了
${catkin_LIBRARIES}
作為示例。 ${catkin_LIBRARIES}
是一個變量,它包含了構建過程中所需的ROS相關庫。- 通過將目標文件與指定的庫進行鏈接,可以確保在運行可執行文件時,所需的庫能夠正確加載和使用。
通俗的來說:當我們編寫ROS節點時,需要將源代碼編譯成可執行文件,并將所需的庫與該可執行文件進行鏈接。這兩行CMake代碼就是用來完成這個任務的。
3.進入工作空間目錄并編譯
cd 自定義空間名稱
catkin_make
這會生成上面提到的?build devel .... 可執行文件就在build文件里面
四 運行程序
1. 打開一個新的終端 輸入
roscore
2. 在打開一個終端 cd到你對應的工作空間然后輸入
source ./devel/setup.bash
rosrun 包名 C++節點
source后,在我們輸入rosrun后可以按tab鍵快速補充。這是為什么呢?
source ./devel/setup.bash?的含義是在當前終端會話中加載ROS工作空間的環境設置。
具體來說,這段代碼的作用是:
source
?是一個Shell命令,用于執行指定腳本文件中的命令,使其在當前終端會話中生效。./devel/setup.bash
?是一個腳本文件的路徑,它位于ROS工作空間的?devel
?目錄下。devel/setup.bash
?是ROS構建系統生成的一個腳本文件,其中包含了設置ROS環境變量的命令。
當你運行這段代碼時,它會執行?devel/setup.bash
?腳本文件中的命令,設置當前終端會話的環境變量,以便正確地使用ROS工具和功能。
具體來說,devel/setup.bash
?腳本文件中的命令會完成以下操作:
- 設置?
ROS_PACKAGE_PATH
?環境變量,指定ROS工作空間的包路徑。 - 設置?
ROS_MASTER_URI
?環境變量,指定ROS主節點的URI。 - 設置?
ROS_IP
?或?ROS_HOSTNAME
?環境變量,指定當前主機的IP地址或主機名。 - 將ROS工作空間的?
bin
?和?lib
?目錄添加到?PATH
?和?LD_LIBRARY_PATH
?環境變量中,以確保能夠正確找到和加載ROS工具和庫文件。
通過運行?source ./devel/setup.bash
,你可以將ROS工作空間的環境設置加載到當前終端會話中,使得你可以在該終端中使用ROS工具和運行ROS節點。
需要注意的是,每次打開一個新的終端時,都需要運行這段代碼,以確保每個終端會話都能正確地加載ROS工作空間的環境設置。
然后我們就可以在終端看到我們發布的 hellowrld!了
五 總結問題
1.問題一:工作空間與軟件包的關系與區別 ?
在ROS(機器人操作系統)中,工作空間(workspace)是一個包含多個軟件包(packages)的目錄。工作空間是一個用于組織和構建ROS項目的容器,它提供了一種管理和編譯多個軟件包的機制。每個軟件包代表著一個獨立的功能單元,可以包含節點(nodes)、消息(messages)、服務(services)、動作(actions)以及其他相關文件。
工作空間可以包含多個軟件包,這些軟件包可以是你自己編寫的或者是從其他人或團隊獲取的。通過將這些軟件包組織在一個工作空間中,你可以方便地進行編譯、構建和管理。
問題二:成功編譯所需的CMake指令 ?
在ROS中,CMake是用于構建和編譯ROS軟件包的工具。下面是一些常用的CMake指令:
1. cmake_minimum_required(VERSION x.x.x):指定所需的最低CMake版本。
2. project(project_name):指定項目名稱。
3. find_package(package_name):查找指定的依賴包。
4. add_executable(executable_name source_files):添加一個可執行文件。
5. add_library(library_name source_files):添加一個庫文件。
6. target_link_libraries(target_name library_names):將目標文件與指定的庫文件進行鏈接。
7. add_dependencies(target_name dependency_names):添加目標文件的依賴。
8. catkin_package():用于構建Catkin軟件包時,用于指定包的依賴關系和其他Catkin特定的配置。
這只是一些常用的CMake指令,具體使用取決于你的項目需求。
問題三:rosrun的實質和devel/lib下的可執行文件 ?
rosrun是ROS中一個常用的命令行工具,用于運行ROS軟件包中的節點。它的基本語法是:
``rosrun package_name node_name
其中,package_name是要運行的節點所在的軟件包的名稱,node_name是要運行的節點的名稱。
當你使用rosrun命令運行一個節點時,ROS會在工作空間的devel/lib目錄下查找對應的可執行文件。該目錄是在你執行catkin_make或catkin build等構建命令后自動生成的,其中包含了已編譯的節點可執行文件。
問題四:為什么有多個cmake文件
在ROS項目中通常會出現多個CMake文件,這是因為ROS項目的結構和功能較復雜,需要分別管理不同的部分和依賴項。以下是常見的幾種CMake文件:
-
CMakeLists.txt
:這是ROS項目中最常見的CMake文件,位于ROS包的根目錄。它用于定義整個ROS包的構建規則、依賴項和其他配置選項。該文件會告訴CMake如何構建該ROS包,包括編譯可執行文件、創建庫、生成消息和服務文件等。 -
package.xml
:雖然不是CMake文件,但它是ROS項目中必不可少的配置文件之一。package.xml
?文件位于ROS包的根目錄,用于定義ROS包的元數據、依賴項和其他信息。它描述了ROS包的名稱、版本、作者、許可證等重要信息,同時也列出了ROS和其他軟件包的依賴關系。 -
CMakeLists.txt
(子目錄):在ROS包中的子目錄中,可能會有額外的CMake文件。這些文件用于定義子目錄中特定部分的構建規則和依賴項。例如,如果ROS包有一個獨立的節點或庫在子目錄中,可以在該子目錄中創建一個獨立的CMake文件來管理該部分的構建過程。 -
Find<package>.cmake
:這些是用于查找和配置其他非ROS軟件包的CMake模塊文件。這些文件通常用于在ROS項目中使用外部庫或工具,它們提供了與這些庫和工具的集成方法。
每個CMake文件都有其特定的作用和范圍,它們共同協同工作以構建和管理一個完整的ROS項目。這種分離的方式使得項目的組織和維護更加清晰,并允許不同部分的獨立管理和配置。