ros学习#3 节点和功能包

节点(学习鱼香ros大佬的教程)

作用:节点就是可以进行话题订阅或发布的可执行程序,还可以使用服务配置参数执行动作等。

一、运行一个C++节点

首先我开始学习写一个简单的C++节点,这个代码我是写在了上一篇文章配过的功能包里ros学习#2-优快云博客,路径是/home/hcd/dev_ws/src/learning_pkg_c/src里,代码如下:

文件名: cpp_node.cpp

#include "rclcpp/rclcpp.hpp"//导入所需要的rclcpp头文件

int main(int argc, char **argv)//main函数括号里的内容可以省略,但是为了程序安全性还是加上比较好
{
    //先进行init初始化
    rclcpp::init(argc, argv);
    //传入节点名参数“cpp_node”来构造一个rclcpp::Node的对象,并返回该对象的智能指针,“auto”会根据返回值推导node类型
    auto node = std::make_shared<rclcpp::Node>("cpp_node");
    //RCLCPP_INFO是一个打印日志的函数
    RCLCPP_INFO(node->get_logger(), "你好,你吃了吗");
    //rclcpp::spin函数是用来启动节点并循环检测处理事件
    rclcpp::spin(node);
    //清理资源
    rclcpp::shutdown();
    return 0;
}

写完代码之后我这里提示没有找到rclcpp.hpp头文件,出现红色波浪线,我用vscode里的快速修复把路径改到了/opt/ros/humble/include/**之后红色波浪线就消失了,另外我不知道为什么我的ros2包含的include库里没有rclcpp库,所以我先使用下面这个命令下载了一个

git clone https://github.com/ros2/rclcpp

然后使用“mv”命令把这个下载的库移动到 /opt/ros/humble/include目录下

然后改一下CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.8)
project(learning_pkg_c)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)

#-------------这行代码之上是自带的,我没改过----------------
#查找rclcpp头文件和库
find_package(rclcpp REQUIRED)
#添加可执行文件 cpp_node
add_executable(cpp_node src/cpp_node.cpp)
#为cpp_node添加依赖
ament_target_dependencies(cpp_node rclcpp)
#将cpp_node复制到 install 目录
install(TARGETS
  cpp_node
  DESTINATION lib/${PROJECT_NAME}
)
#-------------这行代码之下是自带的,我没改过-----------------

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # comment the line when a copyright and license is added to all source files
  set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # comment the line when this package is in a git repo and when
  # a copyright and license is added to all source files
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

然后在package.xml文件里添加一行 <depend>rclcpp</depend>用来声明依赖关系

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>learning_pkg_c</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="hcd@todo.todo">hcd</maintainer>
  <license>TODO: License declaration</license>
  <depend>rclcpp</depend>
  <buildtool_depend>ament_cmake</buildtool_depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

所有工作都完成后就可以构建功能包,使用colcon build命令(其实colcon build也是利用cmake和make完成对代码的编译的),然后声明环境变量

(myros) hcd@hcd-Dell-G15-5511:~/dev_ws$ colcon build
(myros) hcd@hcd-Dell-G15-5511:~/dev_ws$ source install/setup.sh

再运行一下:

(myros) hcd@hcd-Dell-G15-5511:~/dev_ws/src/learning_pkg_c$ ros2 run learning_pkg_c cpp_node

learning_pkg_c是功能包的名字,cpp_node是节点的名字 ,运行结果如下:

成功运行完第一个c++节点!

二、功能包介绍

ros2节点的开发是在功能包中进行的,C++功能包的内容主要是以下几个文件:

1. include

用于存放C++的头文件,如果要编写头文件都放在这个文件夹下

2.src

用来放置节点的代码和其他相关代码

3.CMakeLists.txt和package.xml

CMakeLists.txt是C/C++构建系统CMake的配置文件,在该文件中添加指令,即可完成依赖查找,可执行文件添加,安装等工作,package.xml是功能包的清单文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值