創(chuàng)建工作區(qū)目錄
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
我們創(chuàng)建了兩個(gè)目錄,ros2_ws和在他下面的子目錄,運(yùn)行編譯的目錄在ros2_ws目錄下,src目錄下是我們生成的ros的包,我們自己編寫的代碼也都早src目錄下,colcon build編譯之后會在ros2_ws目錄下生成一下文件,運(yùn)行程序也是在ros2_ws這個(gè)目錄下。
創(chuàng)建包和節(jié)點(diǎn)
使用ros2 pkg create
來創(chuàng)建包和節(jié)點(diǎn),該命令是在src目錄下執(zhí)行。
- 只創(chuàng)建包
ros2 pkg create <package_name> --build-type ament_cmake
2.創(chuàng)建包并添加依賴
ros2 pkg create my_package --build-type ament_cmake --dependencies std_msgs rclcpp
- ament_cmake,適用于c++,是cmake的增強(qiáng)版
- ament_python,適用于Python
- 創(chuàng)建包的同時(shí)添加
std_msgs
和rclcpp
的依賴
- 創(chuàng)建包的同時(shí)添加節(jié)點(diǎn)
ros2 pkg create <package_name> --build-type ament_cmake --node-name <node_name> --dependencies std_msgs rclcpp
- 創(chuàng)建包名填入package_name
- 創(chuàng)建節(jié)點(diǎn)名填入node_name
- 這里添加了
std_msgs
和rclcpp
兩個(gè)依賴,需要的依賴填在在后面
運(yùn)行節(jié)點(diǎn)的命令
ros2 run 包名 可執(zhí)行文件名
ros2 run package_name exectable_name
- 列出所有的包
ros2 pkg list
- 輸出某個(gè)包的路徑前綴
ros2 pkg prefix <package_name>
- 列出摸個(gè)包的清單信息
ros2 pkg xml <package_name>
colcon build編譯
我們在有src文件夾的目錄下,也就是執(zhí)行文件的目錄
編譯所有的包
colcon build
指定單獨(dú)編譯某個(gè)包:
colcon build --packages-select <package_name>
CMakeLists.txt文件
該文件是告訴編譯器,想要找某個(gè)節(jié)點(diǎn)去哪里找。
cmake_minimum_required(VERSION 3.5)
project(ros_learn) //包的名稱
find_package
如果是添加了某些依賴,需要再find_package中添加
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(std_msga REQUIRED)
find_package(rclcpp REQUIRED)
add_executable
添加節(jié)點(diǎn),表示如果編譯器要找那個(gè)節(jié)點(diǎn)到那個(gè)目錄下去找
// 表示告訴編輯器想要找infor_publish這個(gè)節(jié)點(diǎn)去src目錄下的infor_publish.cpp去找
add_executable(infor_publish src/infor_publish.cpp)
然后加上ament_target_dependencies這項(xiàng),該項(xiàng)里記錄者余姚的依賴和運(yùn)行節(jié)點(diǎn)
ament_target_dependencies(
infor_publish
"std_msga"
"rclcpp"
)
//rclcpp和std_msga也可以不加雙引號
然后還需要安裝一下,安裝一下我們的可執(zhí)行節(jié)點(diǎn)
install(TARGETS
infor_publish
DESTINATION lib/${PROJECT_NAME})
package.xml
該文件中需要添加一下我們手動(dòng)添加的依賴文章來源:http://www.zghlxwxcb.cn/news/detail-432141.html
<?xml version="1.0"?>
<?xml-model schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>ros_learn</name> <!-- 包的名稱 -->
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="aywq@todo.todo">aywq</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<depend>std_msgs</depend>
<depend>rclcpp</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
面相過程的方式生命一個(gè)節(jié)點(diǎn)
- 要繼承rclcpp::Node的節(jié)點(diǎn)(
auto node = std::make_shared<rclcpp::Node>("ros_1"
)),然后打印一條消息
// 1. 導(dǎo)入庫文件
# include "rclcpp/rclcpp.hpp"
int main(int argc,char **argv)
{
//2.初始化客戶端庫
rclcpp::init(argc,argv);
//3.使用智能指針創(chuàng)建新的節(jié)點(diǎn)對象
auto node = std::make_shared<rclcpp::Node>("ros_1");// 當(dāng)我們初始化節(jié)點(diǎn)的時(shí)候要給他一個(gè)參數(shù),給節(jié)點(diǎn)起一個(gè)名字
// ros的打印
RCLCPP_INFO(node->get_logger(),"打印內(nèi)容");
//4.使用spin循環(huán)節(jié)點(diǎn)
rclcpp::spin(node);
//5. 關(guān)閉客戶端庫
rclcpp::shutdown();
}
以面向?qū)ο蟮姆绞絼?chuàng)建一個(gè)節(jié)點(diǎn)
- 在面相對象的節(jié)點(diǎn)的創(chuàng)建過程中,我們要聲明一個(gè)類,該類要繼承rclcpp::Node(
:public rclcpp::Node
),否則該類無法擁有擁有日志打印,創(chuàng)建服務(wù)話題的能力。 - 構(gòu)造函數(shù)要給在初始化列表給父類的Node傳節(jié)點(diǎn)的名字
// 1. 導(dǎo)入庫文件
# include "rclcpp/rclcpp.hpp"
# include <string>
// 定義一個(gè)類
// 先要讓這個(gè)類繼承rclcpp::Node,只有繼承了這個(gè) 才能擁有日志打印,創(chuàng)建服務(wù)話題的能力
class infor_publish :public rclcpp::Node
{
private:
/* data */
public:
infor_publish(std::string name); //構(gòu)造函數(shù)在定義是不用繼承初始化列表
~infor_publish();
};
// 我們在聲明構(gòu)造函數(shù)是要調(diào)用父類的構(gòu)造函數(shù),給他傳一個(gè)參數(shù),參數(shù)為節(jié)點(diǎn)的名字
infor_publish::infor_publish(std::string name):Node(name)
{
RCLCPP_INFO(this->get_logger(),"hahaha:%s",name.c_str()); // name是一個(gè)string類型的,我們需要把他c的字符串打印
}
infor_publish::~infor_publish()
{
RCLCPP_INFO(this->get_logger(),"bye!!!");
}
int main(int argc,char **argv)
{
//2.初始化客戶端庫
rclcpp::init(argc,argv);
//3.使用智能指針創(chuàng)建新的節(jié)點(diǎn)對象,在面相對象的這節(jié)點(diǎn)聲明,智能指針就要輸入類的類型,而不是rclcpp::Node
auto node = std::make_shared<infor_publish>("ros2");
//4.使用spin循環(huán)節(jié)點(diǎn)
rclcpp::spin(node);
//5. 關(guān)閉客戶端庫
rclcpp::shutdown();
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-432141.html
到了這里,關(guān)于ros2 foxy創(chuàng)建一個(gè)包和節(jié)點(diǎn)-ubuntu20.04的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!