首页 > 编程语言 >ROS2学习--POP方法编写C++节点 debug过程

ROS2学习--POP方法编写C++节点 debug过程

时间:2024-04-26 12:57:13浏览次数:26  
标签:node wang -- rclcpp C++ wang2 POP village 节点

一、编写C++节点并测试 

1.创建功能包

C++功能包使用ament-camke作为编译基础,依赖为rclcpp。打开终端,进入town_ws/src运行下面的指令,目录结构如下

ros2 pkg create village_wang --build-type ament_cmake --dependencies rclcpp

2.创建节点

village_wang/src下创建一个wang2.cpp文件,创建完成后的目录结构如下:

(这里犯了一个错,我将wang2.cpp放到了village_wang文件夹下,导致后面会出错)

3.编写代码

#include "rclcpp/rclcpp.hpp"


int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    /*产生一个Wang2的节点*/
    auto node = std::make_shared<rclcpp::Node>("wang2");
    // 打印一句自我介绍
    RCLCPP_INFO(node->get_logger(), "大家好,我是单身狗wang2.");
    /* 运行节点,并检测退出信号*/
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

主函数中首先初始化rclcpp,然后新建了一个Node节点的对象,命名为wang2,接着使用rclcpp让这个节点暴露在外面,并检测退出信号(Ctrl+C),检测到退出信号后,就会执行rcl.shutdown()关闭节点。

这里#include "rclcpp/rclcpp.hpp" 也会报错,如下

解决流程:

1、ctrl+shift+p

按下打开ctrl+shift+p,选择vscode的编辑配置选项:

2、修改编辑设置(注意网上有些解决方法是humble版本)

添加到CmakeLists

在wang2.cpp中输入上面的内容后,还需要修改一下CmakeLists.txt。

在CmakeLists.txt最后一行加入下面两行代码。

add_executable(wang2_node src/wang2.cpp)
ament_target_dependencies(wang2_node rclcpp)

(造成上面的问题后,会报错Cannot find source file: src/wang2.cpp,将代码所在位置顺利改成功后如下图)

add_executable(wang2_node ~/colcon_test/town_ws/src/village_wang/village_wang/wang2.cpp)
ament_target_dependencies(wang2_node rclcpp)

(仍然会报错catkin_make出现 “Cannot find source file:” 这种情况可能是第一次执行catkin_make发现源文件中有错误,在修改了源文件内容的同时,也修改了源文件的名字,导致再次执行catkin_make的时候,就找不到上次的那个文件了,所以解决方法时将原来的文件的内容复制到一个新文件中,然后在CMakeList中添加这个文件,再次编译。)

(成功)

添加这两行代码的目的是让编译器编译wang2.cpp这个文件,不然不会主动编译。接着在上面两行代码下面添加下面的代码。

install(TARGETS
  wang2_node
  DESTINATION lib/${PROJECT_NAME}
)

这个是C++比Python要麻烦的地方,需要手动将编译好的文件安装到install/village_wang/lib/village_wang

4.编译运行节点

打开vscode终端,进入town_ws

编译节点:

colcon build

source环境:

source install/setup.bash

运行节点:

ros2 run village_wang wang2_node

成功:

 

 

标签:node,wang,--,rclcpp,C++,wang2,POP,village,节点
From: https://www.cnblogs.com/lei-bao/p/18159796

相关文章

  • C#同步方法中如何调用异步方法
    最近看了个关于同步方法中调用异步方法的文章,有感而发,先把代码放在这里,有时间再补充理解namespace同步方法中调用异步方法{internalclassProgram{//staticvoidMain(string[]args)//{//Console.WriteLine("start"+DateTim......
  • python闭包 - 理解与应用
    闭包定义闭包是指在一个函数内部定义的函数,并且这个内部函数可以访问外部函数的局部变量。当外部函数执行完毕后,内部函数仍然可以访问外部函数的局部变量,这种函数就称为闭包。在Python中,闭包通常用来保存一些状态信息,可以在外部函数执行完毕后继续使用这些状态信息。闭包可以帮......
  • uni-app的POST请求和GET请求
    uni-app就像一个盗版的Vue,和Vue很想,又不完全像//微信小程序post请求uni.request({url:'http://127.0.0.1:8000/api/test_post/',//Django后端API地址method:'POST',//指定请求类型(POST还是GET)data:{//数据都要放在这里,以键值对的方式......
  • 常用设计模式-单例模式
    单例模式(保证只有一个实例,并只提供一个访问实例的访问点)单例模式的创建方式:饿汉模式-静态变量packagecom.pattern;//饿汉模式-静态变量publicclassSingleton{//类初始化时,会立即加载该对象,线程天生安全,调用效率高privatestaticfinalSingletons......
  • golang之json.RawMessage
    RawMessage具体来讲是json库中定义的一个类型。它实现了Marshaler接口以及Unmarshaler接口,以此来支持序列化的能力。注意上面我们引用 官方doc 的说明。 使用场景设想一下,我们给某种业务场景定义了一个通用的model,其中部分数据需要在不同场景下对应不同的结构体......
  • 马斯克的 xAI 融资 60 亿美元;英伟达收购两家 AI 创企丨 RTE 开发者日报 Vol.193
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • 工作半年多的感想
    工作半年多的感想写在前面898字|成长|经历|感触|想法正文先上结论。思考模式从“我的诉求”转变为“对方的诉求”,行为从“单方渴求”转变为“价值交换”。永远不要在利益中考验感情或人性。所以不要和朋友一起共事,最后大概率血崩。这两个道理初高中生都......
  • 多进程编程:原理、技术与应用
    title:多进程编程:原理、技术与应用date:2024/4/2612:14:47updated:2024/4/2612:14:47categories:后端开发tags:多进程并发编程网络服务分布式系统任务处理进程池线程对比第一章:进程与线程进程与线程的概念及区别:进程:进程是操作系统中的一个程序执行......
  • 社区发现之标签传播算法(LPA)python实现
    社区发现在图领域中备受关注,其根源可以追溯到子图分割问题。在真实的社交网络中,用户之间的联系紧密度不尽相同,导致形成了不同的社区结构。社区发现问题主要分为两类:非重叠和重叠社区。非重叠社区发现指的是每个节点仅属于一个社区,社区之间没有交集。在非重叠社区发现中,有多种解决......
  • sql相关
    在学习redis时牵扯到一些sql的基础知识,发现有很多遗忘的地方,这里重新复习一下事务--开始事务STARTTRANSACTION;--执行一些SQL语句UPDATEaccountsSETbalance=balance-100WHEREuser_id=1;UPDATEaccountsSETbalance=balance+100WHEREuser_id=2;--判断......