首页 > 其他分享 >ROS2小乌龟案例话题通信

ROS2小乌龟案例话题通信

时间:2024-07-17 16:58:46浏览次数:14  
标签:sub launch pub 案例 乌龟 turtlesim 节点 ROS2

1.案例需求

需求:启动两个turtlesim_node节点,节点2中的乌龟自动调头180°,我们可以通过键盘控制节点1中的乌龟运动,但是不能控制节点2的乌龟,需要自实现功能:可以根据乌龟1的速度生成并发布控制乌龟2运动的速度指令,最终两只乌龟做镜像运动。

2.案例分析

在上述案例中,主要需要关注的问题有三个:

  1. 如何创建两个turtlesim_node节点,且需要具有不同的节点名称、话题名称。
  2. 如何控制乌龟掉头?
  3. 核心实现是如何订阅乌龟1的速度并生成发布控制乌龟2运动的速度指令的?

思路:

  1. 问题1我们可以通过为turtlesim_node设置namespace解决;
  2. 问题2可以通过调用turtlesim_node内置的action功能来实现乌龟航向的设置;
  3. 问题3是整个案例的核心,需要编码实现,需要订阅乌龟1的位姿相关话题来获取乌龟1的速度,并且按照“镜像运动”的需求生成乌龟2的速度指令,并且该节点需要在掉头完毕后启动。
  4. 最后,整个案例涉及到多个节点,我们可以通过launch文件集成这些节点。
3.流程简介

主要步骤如下:

  1. 编写速度订阅与发布实现;
  2. 编写launch文件集成多个节点;
  3. 编辑配置文件;
  4. 编译;
  5. 执行。
4.速度订阅与发布

功能包cpp07_exercise的src目录下,新建C++文件exe01_pub_sub.cpp,并编辑文件,输入如下内容:

/*
   需求:订阅窗口1中的乌龟速度,然后生成控制窗口2乌龟运动的指令并发布。
   步骤:
       1.包含头文件;
       2.初始化 ROS2 客户端;
       3.定义节点类;
          3-1.创建控制第二个窗体乌龟运动的发布方;
          3-2.创建订阅第一个窗体乌龟pose的订阅方;
          3-3.根据订阅的乌龟的速度生成控制窗口2乌龟运动的速度消息并发布。
       4.调用spin函数,并传入节点对象指针;
       5.释放资源。
*/
// 1.包含头文件;
#include <rclcpp/rclcpp.hpp>
#include <turtlesim/msg/pose.hpp>
#include <geometry_msgs/msg/twist.hpp>
// 3.定义节点类;
class ExePubSub : public rclcpp::Node
{
public:
  ExePubSub() : rclcpp::Node("demo01_pub_sub")
  {
    // 3-1.创建控制第二个窗体乌龟运动的发布方;
    twist_pub_ = this->create_publisher<geometry_msgs::msg::Twist>("/t2/turtle1/cmd_vel", 1);
    // 3-2.创建订阅第一个窗体乌龟pose的订阅方;
    pose_sub_ = this->create_subscription<turtlesim::msg::Pose>(
      "/turtle1/pose", 1, std::bind(&ExePubSub::poseCallback, this, std::placeholders::_1));
  }

private:
  // 3-3.根据订阅的乌龟的速度生成控制窗口2乌龟运动的速度消息并发布。
  void poseCallback(const turtlesim::msg::Pose::ConstSharedPtr pose)
  {
    geometry_msgs::msg::Twist twist;
    twist.angular.z = -(pose->angular_velocity); //角速度取反
    twist.linear.x = pose->linear_velocity; //线速度不变
    twist_pub_->publish(twist);
  }

  rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr twist_pub_;
  rclcpp::Subscription<turtlesim::msg::Pose>::SharedPtr pose_sub_;
};

int main(int argc, char** argv)
{
  // 2.初始化 ROS2 客户端;
  rclcpp::init(argc, argv);
  // 4.调用spin函数,并传入节点对象指针;
  rclcpp::spin(std::make_shared<ExePubSub>());
  // 5.释放资源。
  rclcpp::shutdown();
}
5.launch文件

功能包cpp07_exercise的launch目录下,新建launch文件exe01_pub_sub.launch.py,并编辑文件,输入如下内容:

from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import ExecuteProcess,RegisterEventHandler
from launch.event_handlers import OnProcessExit

def generate_launch_description():
    # 1.创建两个 turtlesim_node 节点
    t1 = Node(package="turtlesim",executable="turtlesim_node")
    t2 = Node(package="turtlesim",executable="turtlesim_node",namespace="t2")
    # 2.让第二只乌龟掉头
    rotate = ExecuteProcess(
        cmd=["ros2 action send_goal /t2/turtle1/rotate_absolute turtlesim/action/RotateAbsolute \"{'theta': 3.14}\""],
        output="both",
        shell=True
    )
    # 3.自实现的订阅发布实现
    pub_sub = Node(package="cpp07_exercise",executable="exe01_pub_sub")
    # 4.乌龟掉头完毕后,开始执行步骤3
    rotate_exit_event = RegisterEventHandler(
        event_handler=OnProcessExit(
            target_action=rotate,
            on_exit=pub_sub
        )
    )
    return LaunchDescription([t1,t2,rotate,rotate_exit_event])
6.编辑配置文件
1.package.xml

在创建功能包时,所依赖的功能包已经自动配置了,配置内容如下:

<depend>rclcpp</depend>
<depend>turtlesim</depend>
<depend>base_interfaces_demo</depend>
<depend>geometry_msgs</depend>
<depend>rclcpp_action</depend>
2.CMakeLists.txt

CMakeLists.txt 中发布和订阅程序核心配置如下:

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(turtlesim REQUIRED)
find_package(base_interfaces_demo REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(rclcpp_action REQUIRED)

add_executable(exe01_pub_sub src/exe01_pub_sub.cpp)
ament_target_dependencies(
  exe01_pub_sub
  "rclcpp"
  "turtlesim"
  "geometry_msgs"
)
install(TARGETS 
  exe01_pub_sub
  DESTINATION lib/${PROJECT_NAME})

install(DIRECTORY launch DESTINATION share/${PROJECT_NAME})
7.编译

终端中进入当前工作空间,编译功能包:

colcon build --packages-select cpp07_exercise
8.执行

当前工作空间下,启动终端输入如下指令:

. install/setup.bash
ros2 launch cpp07_exercise exe01_pub_sub.launch.py

指令执行后,将生成两个turtlesim_node节点对应的窗口,并且其中一个窗口的乌龟开始调头。

再启动一个终端,输入如下指令:

ros2 run turtlesim turtle_teleop_key

待乌龟调头完毕,就可以通过键盘控制乌龟运动了,最终运行结果与演示案例类似。

标签:sub,launch,pub,案例,乌龟,turtlesim,节点,ROS2
From: https://blog.csdn.net/weixin_47378530/article/details/140499882

相关文章

  • qcow2恢复案例
    确认文件和进程信息:使用lsof命令确认虚拟机进程正在使用已删除的qcow2文件,并记录文件描述符和虚拟机进程ID(例如3914和11u)。sudolsof|grepdeleted复制文件内容:使用文件描述符路径复制已删除的qcow2文件到一个新的目标位置。例如,假设文件描述符路径为/proc/3914/fd/11,将文件......
  • Python turtle 无图 25行 天地良心 大乌龟吃小乌龟
    """家人们太给力了20分钟250阅读10赞但是想憋波大的所以更新更晚了一天 今天要求降低一半本期新规矩:七步成诗12h5赞花絮7.5赞Python15赞c++ 都没到不更新"""发明人:苦瓜想干飞日本发明项目:大乌龟吃小乌龟银河系10后小伙发明了一种大乌龟吃小乌龟的程序爱赚钱......
  • 瑞幸私域运营案例拆解【深度分析】
    1.私域运营概述私域运营是一种以用户为中心的运营模式,通过建立和维护与用户之间的直接联系,实现品牌与用户之间的深度互动和长期价值挖掘。1.1私域流量定义私域流量指的是企业通过自有渠道,如微信公众号、小程序、社群等,直接与用户建立联系并进行运营的流量。这种流量具有......
  • 研发管理案例-项目管理平台-需求任务变更历史分析
    研发管理过程案例分析-项目管理平台-需求任务变更历史分析背景    软件项目管理平台在研发过程中扮演着至关重要的角色,其意义主要体现在以下几个方面:提高效率:通过自动化工具和流程管理,减少手动操作和重复工作,从而提高研发团队的工作效率。确保质量:通过严格的测试管理、代码审......
  • Tita的OKR:产品经理的23个OKR案例(下)
    让我们把产品管理和产品负责人的活动分为4个大的领域,有时是一个人垂直地处理所有的问题,有时是战略和战术的责任分工,所以要相应地选择。愿景和战略构思、调整、验证、优先级确定构建、衡量、学习发布和增长接下来我们继续讨论,让我们把这4个大的领域分解成小的领域,让我们看看......
  • 白山云荣获信通院“算网安全行业应用优秀案例”奖
    日前,在由中国通信标准化协会算网融合产业及标准推进委员会与信通院共同组织召开的“2024年算网融合产业发展大会”上,白山云凭借创新的SD-WAN算网融合方案,荣获“算网安全行业应用优秀案例”奖。算网融合是多元异构、海量泛在的算力设施,通过网络连接形成一体化算网技术与服务......
  • Docker---最详细的服务部署案例
    提供python服务的docker一键部署,示例已配置负载均衡,不需要的在nginx.conf和docker-compose注释相关代码即可文件结构1、dockerfile#服务的dockerfile#服务依赖的镜像FROMpython:3.7#设置容器内服务的工作目录WORKDIR/app#复制当前文件夹所有文件到容器的工作......
  • 类模板案例——数组类封装(vector<>的逻辑代码)
    .hpp文件#pragma#include<iostream>usingnamespacestd;template<classT>classMy_arry{public: My_arry(intcapacity)//赋初值 { this->m_capacity=capacity;//容量 this->m_Arry_size=0;//大小 this->m_Arry_Addres=newT[capacity];......
  • 铝基板散热设计规范及应用案例
     ......
  • 基于matlab的深度学习案例及基础知识专栏前言
    专栏简介内容涵盖深度学习基础知识、深度学习典型案例、深度学习工程文件、信号处理等相关内容,博客由基于matlab的深度学习案例、matlab基础知识、matlab图像基础知识和matlab信号处理基础知识四部分组成。一、  基于matlab的深度学习案例1.1、matlab:基于模板匹配的车牌......