ROS和ROS2使用

news2025/1/12 13:33:26

ubuntu20.04下安装qt5.12
https://blog.csdn.net/lj19990824/article/details/121013721

Ubuntu 20.04在桌面左侧边栏添加QT creator快捷图标
https://blog.csdn.net/kavieen/article/details/118695038

Qt和ROS:https://github.com/chengyangkj?tab=repositories

官方ROS2教程:https://docs.ros.org/en/foxy/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Cpp-Publisher-And-Subscriber.html

目录

  • 1.ROS的核心概念
  • 2.ROS命令行工具的使用
  • 3.ROS使用
  • 4.ROS2的使用
  • 5.ROS2中通过回调获取每一帧图像信息
  • 6.对ROS2多个节点进行管理
  • 7.解析sensor_msgs::PointCloud2 ROS点云数据
  • 8.OpenCV使用Viz模块3D可视化显示
  • ps: 记录ROS2开发过程中遇到的问题和解决方法
      • 1./opt/ros/foxy/include/rclcpp/subscription_factory.hpp:112: error: undefined reference to `rosidl_message_type_support_t const* rosidl_typesupport_cpp::get_message_type_support_handle<sensor_msgs::msg::Image_<std::allocator<void> > >()'
      • 2.error: use of undeclared identifier 'cv_bridge'
      • 3.error: no matching constructor for initialization of 'image_transport::ImageTransport'

1.ROS的核心概念

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.ROS命令行工具的使用

在这里插入图片描述
在这里插入图片描述
功能包+节点

3.ROS使用

catkin_make编译
https://blog.csdn.net/sinat_16643223/article/details/113935412

1.catkin_make编译流程
mkdir -p catkin_ws/src
将源码拷贝到 catkin_ws/src/目录下
cd catkin_ws/
catkin_make

2.启动ros服务端
第一个窗口运行:
roscore
第二个窗口运行:
cd catkin_ws/
source devel/setup.bash 
rosrun  arm_socket_connect arm_socket_connect_node

rosrun arm_socket_connect arm_connect_server

4.ROS2的使用

首先,您需要安装ROS2和C编译器。ROS2是一个机器人操作系统,它提供了一些工具和库,可以帮助您编写机器人应用程序。C是一种编程语言,它可以用来编写ROS2节点。

接下来,您需要创建一个ROS2工作区。这个工作区是一个文件夹,其中包含您的ROS2项目。您可以使用以下命令创建一个ROS2工作区:

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build

然后,您需要创建一个ROS2节点。节点是ROS2中的一个基本概念,它是一个可以与其他节点通信的进程。您可以使用以下命令创建一个ROS2节点:

cd ~/ros2_ws/src
ros2 pkg create my_node --build-type ament_cmake --node-name my_node

这将创建一个名为“my_node”的ROS2节点,并在“~/ros2_ws/src/my_node”文件夹中生成一些文件。

接下来,您需要在my_node.cpp文件中编写节点代码。这个文件位于~/ros2_ws/src/my_node/src文件夹中。您可以使用以下代码作为起点:

#include "rclcpp/rclcpp.hpp"

int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("my_node");
  RCLCPP_INFO(node->get_logger(), "Hello, world!");
  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}

这个代码创建了一个名为“my_node”的ROS2节点,并在控制台输出“Hello, world!”。您可以根据需要修改这个代码,以实现您的节点功能。

最后,您需要编译和运行您的节点。您可以使用以下命令编译您的节点:

cd ~/ros2_ws
colcon build --packages-select my_node

这将编译您的节点,并将可执行文件放在“~/ros2_ws/install/my_node/bin”文件夹中。

要运行您的节点,请使用以下命令:

cd ~/ros2_ws
source install/setup.bash
ros2 run my_node my_node

这将启动您的节点,并在控制台输出“Hello, world!”。您可以根据需要修改这个命令,以实现您的节点功能。

5.ROS2中通过回调获取每一帧图像信息

以下是在ROS2中通过topic回调获取一帧图像信息的C++实现:

#include <iostream>
#include <string>
#include <memory>

#include "rclcpp/rclcpp.hpp"
#include "sensor_msgs/msg/image.hpp"

class ImageSubscriber : public rclcpp::Node
{
public:
  ImageSubscriber(const std::string & topic_name)
  : Node("image_subscriber_node")
  {
    // Create a subscriber to the image topic
    image_subscriber_ = create_subscription<sensor_msgs::msg::Image>(
      topic_name, 10, std::bind(&ImageSubscriber::image_callback, this, std::placeholders::_1));
  }

private:
  void image_callback(const sensor_msgs::msg::Image::SharedPtr msg)
  {
    // Print the image width and height
    std::cout << "Image width: " << msg->width << std::endl;
    std::cout << "Image height: " << msg->height << std::endl;

    // Convert the image data to OpenCV format
    cv::Mat image = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8)->image;

    // Do some processing on the image
    // ...

    // Display the image
    cv::imshow("Image", image);
    cv::waitKey(1);
  }

  rclcpp::Subscription<sensor_msgs::msg::Image>::SharedPtr image_subscriber_;
};

int main(int argc, char ** argv)
{
  // Initialize the ROS2 node
  rclcpp::init(argc, argv);

  // Create an image subscriber
  std::string topic_name = "/camera/image_raw";
  auto image_subscriber = std::make_shared<ImageSubscriber>(topic_name);

  // Spin the node
  rclcpp::spin(image_subscriber);

  // Shutdown the ROS2 node
  rclcpp::shutdown();

  return 0;
}

在上述代码中,我们创建了一个ImageSubscriber类,该类继承自rclcpp::Node类,用于订阅图像topic并处理接收到的图像数据。在ImageSubscriber类的构造函数中,我们创建了一个subscriber来订阅指定的图像topic,并将回调函数image_callback绑定到该subscriber上。在image_callback函数中,我们首先打印了接收到的图像的宽度和高度,然后将图像数据转换为OpenCV格式,并进行一些图像处理操作。最后,我们将处理后的图像显示出来。
在main函数中,我们首先初始化ROS2节点,然后创建一个ImageSubscriber对象来订阅指定的图像topic。最后,我们调用rclcpp::spin函数来启动ROS2节点,并等待接收到图像数据。当接收到图像数据时,ROS2会自动调用image_callback函数来处理数据。当我们想要停止节点时,可以调用rclcpp::shutdown函数来关闭ROS2节点。

6.对ROS2多个节点进行管理

功能:可以对多个ROS2节点分别进行进行启动和关闭,通过调用相关函数可启动或关闭某个指定节点,不会阻塞主线程,且不需要用户操作来退出某个节点。
以下是一个C++代码示例,可以对多个ROS2节点分别进行启动和关闭,通过调用相关函数可启动或关闭某个指定节点,不会阻塞主线程,且不需要用户操作来退出某个节点。

#include <rclcpp/rclcpp.hpp>
#include <iostream>
#include <vector>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>

class NodeManager
{
public:
  NodeManager() {}

  void add_node(std::shared_ptr<rclcpp::Node> node)
  {
    nodes_.push_back(node);
  }

  void start_all()
  {
    for (auto node : nodes_)
    {
      std::thread t(&NodeManager::start_node, this, node);
      t.detach();
    }
  }

  void stop_all()
  {
    for (auto node : nodes_)
    {
      std::thread t(&NodeManager::stop_node, this, node);
      t.detach();
    }
  }

  void start_node(std::shared_ptr<rclcpp::Node> node)
  {
    std::unique_lock<std::mutex> lock(mutex_);
    cv_.wait(lock, [this] { return !paused_; });
    node->start();
  }

  void stop_node(std::shared_ptr<rclcpp::Node> node)
  {
    node->stop();
  }

  void pause_all()
  {
    std::unique_lock<std::mutex> lock(mutex_);
    paused_ = true;
  }

  void resume_all()
  {
    std::unique_lock<std::mutex> lock(mutex_);
    paused_ = false;
    cv_.notify_all();
  }

private:
  std::vector<std::shared_ptr<rclcpp::Node>> nodes_;
  std::mutex mutex_;
  std::condition_variable cv_;
  bool paused_ = false;
};

int main(int argc, char * argv[])
{
  // 初始化ROS2节点
  rclcpp::init(argc, argv);

  // 创建节点管理器
  NodeManager node_manager;

  // 创建节点1
  auto node1 = std::make_shared<rclcpp::Node>("node1");
  node_manager.add_node(node1);

  // 创建节点2
  auto node2 = std::make_shared<rclcpp::Node>("node2");
  node_manager.add_node(node2);

  // 启动所有节点
  node_manager.start_all();

  // 暂停所有节点
  node_manager.pause_all();

  // 启动节点1
  node_manager.resume_all();

  // 等待一段时间
  std::this_thread::sleep_for(std::chrono::seconds(5));

  // 停止节点1
  node_manager.stop_node(node1);

  // 关闭ROS2节点
  rclcpp::shutdown();

  return 0;
}

在上面的代码中,我们使用了std::thread来启动和停止节点,这样可以避免阻塞主线程。在start_all函数和stop_all函数中,我们使用std::thread来启动和停止每个节点。我们使用t.detach()来分离线程,这样线程可以在后台运行,不会阻塞主线程。

在start_node函数中,我们使用了std::unique_lock和std::condition_variable来实现暂停和恢复节点的功能。当节点被暂停时,线程会等待条件变量cv_,直到被恢复时才会继续执行。

在main函数中,我们初始化ROS2节点,创建NodeManager对象,并向其添加两个节点。然后,我们启动所有节点,并暂停所有节点。接着,我们恢复节点1,并等待5秒钟。最后,我们停止节点1并关闭ROS2节点。

7.解析sensor_msgs::PointCloud2 ROS点云数据

https://www.cnblogs.com/penuel/p/16396655.html

8.OpenCV使用Viz模块3D可视化显示

https://www.cnblogs.com/happyamyhope/p/12487096.html

ps: 记录ROS2开发过程中遇到的问题和解决方法

1./opt/ros/foxy/include/rclcpp/subscription_factory.hpp:112: error: undefined reference to `rosidl_message_type_support_t const* rosidl_typesupport_cpp::get_message_type_support_handle<sensor_msgs::msg::Image_<std::allocator > >()’

解决方法:缺少头文件

#include "sensor_msgs/msg/image.hpp"

CMakeList.txt中增加sensor_msgs库的依赖

find_package(sensor_msgs REQUIRED)

ament_target_dependencies(yourprojectname sensor_msgs)

2.error: use of undeclared identifier ‘cv_bridge’

解决方法:缺少头文件

#include <cv_bridge/cv_bridge.h>

CMakeList.txt中增加sensor_msgs库的依赖

find_package(cv_bridge REQUIRED)

ament_target_dependencies(yourprojectname cv_bridge)

3.error: no matching constructor for initialization of ‘image_transport::ImageTransport’

解决方法:缺少头文件

#include <image_transport/image_transport.h>

CMakeList.txt中增加sensor_msgs库的依赖

find_package(image_transport REQUIRED)

ament_target_dependencies(yourprojectname image_transport)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/615889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统原理 —— 内存覆盖与交换(十九)

什么情况下需要覆盖与交换 要弄清楚什么是覆盖与交换的概念&#xff0c;首先我们要知道在什么情况下才会使用到覆盖与交换。 在早期的计算机内存很小的时候&#xff0c;比如 IBM 推出的第一台 PC 机最大只支持 1 MB 大小的内存&#xff0c;因此会经常出现内存大小不够的情况&…

c++函数重载与运算符重载基础

什么是重载 重载&#xff0c;简单说&#xff0c;就是函数或者方法有相同的名称&#xff0c;但是参数列表不相同的情形&#xff0c;这样的同名不同参数的函数或者方法之间&#xff0c;互相称之为重载函数或者方法。 重载的作用&#xff1a;重载函数常用来实现功能类似而所处理的…

【C语言】数组和字符串

目录 数组和字符串 概述 一维数组 一维数组的定义和使用 一维数组的初始化 数组名 二维数组 字符数组与字符串 字符数组与字符串区别 数组和字符串 概述 在程序设计中&#xff0c;为了方便处理数据把具有相同类型的若干变量按有序形式组织起来——称为数组。 数组就…

紧接上文,基于轻量级yolov5s模型开发构建手写甲骨文检测识别系统

在我之前的文章中&#xff0c;关于手写文字、手写数字、手写字母的检测识别相关的项目都有了不少的实践了&#xff0c;这里就不在赘述了&#xff0c;感兴趣的话可以自行移步阅读即可。 《基于轻量级目标检测模型实现手写汉字检测识别计数》 《python开发构建基于机器学习模型…

【ICEM CFD】导入模型后,即使勾选point和curve也看不到几何模型上的点和线

一、问题背景 导入模型后&#xff0c;即使勾选point和curve也看不到几何模型上的点和线。 二、解决办法 原来导入模型后&#xff0c;往往第一步最需要操作的是&#xff01;&#xff01;&#xff01; 构建拓扑&#xff01;&#xff01;&#xff01; Build Diagnostic Topolo…

完美解决safari、微信浏览器下拉回弹效果、包含微信小程序 webview 套H5页面下拉效果。

如题&#xff0c;解决微信小程序、公众号 下拉回弹橡皮筋效果&#xff0c; 屏蔽掉 “此网页由XXXXX提供”; // 禁止页面上下整体滑动 document.body.style.overflow "hidden"

基于Jmeter+ant+Jenkins+钉钉机器人群通知的接口自动化测试

前言 搭建jmeterantjenkins环境有些前提条件&#xff0c;那就是要先配置好java环境&#xff0c;本地java环境至少是JDK8及以上版本&#xff0c;最好是JAVA11或者JAVA17等较高的java环境&#xff0c;像jenkins这种持续构建工具基本都在向上兼容JAVA的环境&#xff0c;以前的JAV…

为什么网络安全人口很稀缺,招聘人数却很少?

2020年我国网络空间安全人才数量缺口超过了140万&#xff0c;就业人数却只有10多万&#xff0c;缺口高达了93%。这里就有人会问了&#xff1a; 1、网络安全行业为什么这么缺人&#xff1f; 2、明明人才那么稀缺&#xff0c;为什么招聘时招安全的人员却没有那么多呢&#xff1…

常见数据库(MSSQL,Mysql,PostgreSQL,Oracle)安装注意事项

常见数据库安装注意事项 &#xff08;原标题: DataWindowHTTP数据库安装&#xff09; 转载请保留版权消息勿删除&#xff1a;&#xff08;谢绝转载到任何文档网站&#xff01;&#xff09; blog.csdn.net/chengg0769 http://www.powerbuilder.ltd http://www.haojiaocheng.…

设计模式(行为型模式)之:Observer(观察者模式)

文章目录 动机使用场景代码实现类图结构模式分析&#xff1a; 动机 在软件构建过程中&#xff0c;我们需要为某些对象建立一种“通知依赖关系” - 一个对象&#xff08;目标对象&#xff09;的状态改变&#xff0c;所有的依赖对象&#xff08;观察者对象&#xff09;都将得到通…

绝不能错过!8款AI文案神器,让你轻松写出优质文案

无论你是否准备好&#xff0c;它们都已经来了。如果你知道如何使用它们&#xff0c;AI文案工具可以成为你的新朋友。 现在AI文案工具无处不在&#xff0c;眼花缭乱&#xff0c;从内容生成器到电子商务聊天机器人。原因很简单&#xff1a;AI可以节省大量时间和金钱。这是我们都喜…

markdown 编辑器使用

在博客开头加上 [TOC](这是你的目录标题)就可以根据博客内容自动生成如下所示的目录&#xff1a; 这是你的目录标题 Markdown 编辑器功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表无序…

智慧城市的建设需要数字孪生技术吗?

智慧城市建设需要依靠多种技术来实现数字化、智能化和可持续发展的目标。其中&#xff0c;数字孪生技术在智慧城市建设中起着重要的作用。 首先&#xff0c;数字孪生技术可以提供高度精确的城市建筑和基础设施的数字模型。通过对城市的建筑、道路、水系等要素进行数字化建模&a…

vue.set this.$set的作用

Vue.set 的作用就是在构造器外部操作构造器内部的数据、属性或者方法 当一个对象在vue中是响应式的&#xff0c;如果仅仅使用普通的方式向这个对象添加或修改这个属性的值&#xff0c;是不会触发视图更新的 但是使用 vue.set 或者 this.$set 的方式可以使得新添加的属性也是响…

【ARM AMBA AXI 入门 2 - AXI协议中的BURST】

文章目录 1.1 突发传输简介1.1.1 AXI4 突发传输控制信号1.1.1.1 AxLEN 突发传输长度1.1.1.2 AxSIZE 突发传输宽度1.1.1.3 AxBURST 突发传输类型 1.1.2 AXI 传输实例 1.1 突发传输简介 在地址总线上进行一次地址传输后&#xff0c;进行多次数据传输( data transfer&#xff09;…

GPT4 在医学任务表现-Capabilities of GPT-4 on Medical Challenge Problems

微软和openai在2023年4月的论文。 Capabilities of GPT-4 on Medical Challenge Problems 数据集介绍 USMLE Self Assessments&#xff1a;问题&#xff0c;有表格 USMLE Sample Exam&#xff1a;pdf&#xff0c;有图片 MedQA&#xff1a;多语种多选&#xff0c; PubMedQA…

基于Python的接口自动化-pymysql模块操作数据库

目录 引言 一、PyMySQL安装 二、Python操作数据库 写在最后 引言 在进行功能或者接口测试时常常需要通过连接数据库&#xff0c;操作和查看相关的数据表数据&#xff0c;用于构建测试数据、核对功能、验证数据一致性&#xff0c;接口的数据库操作是否正确等。 因此&#x…

MES系统选择指南:企业如何选择适合需求的MES管理系统?

MES&#xff08;Manufacturing Execution System&#xff09;管理系统是一种用于生产管理的软件系统&#xff0c;可以帮助企业提高生产效率、降低成本和提高质量。然而&#xff0c;不同类型的MES管理系统适用于不同类型的企业需求&#xff0c;因此选择适合自己企业需求的MES管理…

基于瑞芯微芯片RK3399学习

同是soc&#xff0c;参加新星计划学习下大佬的思路 sys系统 针对&#xff1a;&#xff08;内核&#xff09;1.1、通过sysfs清楚了解设备的系统状况的学习 通过了解sys目录和文件了解嵌入式设备的系统状况。 sysfs把连接在系统上的设备和总线组织成为一个分级的文件&#xff0c…

全国职业院校技能大赛信息安全管理与评估赛题一

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 赛题一 模块一 网络平台搭建与设备安全防护 赛项时间 共计180分钟。 赛项信息 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段 网络平台搭建与设备安全防护 任务1 网络平台搭建 XX:XX- XX:XX 50 任务…