ROS学习日志:话题的方式统一控制5台机器人

2023-05-16

在gazebo环境中搭建一个尽量美观的场景、启动5台 turtlebot3 机器人 ,以话题的方式统一控制5台机器人的运动速度

(1)原有文件基础上添加多个机器人

(2)统一话题控制五个机器人(三种方式)

(3)演示视频

(4)gazebo环境中搭建场景

一、原有文件基础上添加多个机器人

1)查找该文件的路径

find -name multi_turtlebot3.launch 

2)打开编辑该文件(以已有路径为例)

gedit ~/catkin_ws/src/turtlebot3_simulations/turtlebot3_gazebo/launch/multi_turtlebot3.launch

3)增加两机器人(以加一个为例)

<arg name="forth_tb3"  default="tb3_3"/>

  <arg name="forth_tb3_x_pos" default=" 2.0"/>
  <arg name="forth_tb3_y_pos" default=" -1.0"/>
  <arg name="forth_tb3_z_pos" default=" 0.0"/>
  <arg name="forth_tb3_yaw"   default=" 0.0"/>

  <group ns = "$(arg forth_tb3)">
    <param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />

    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen">
      <param name="publish_frequency" type="double" value="50.0" />
      <param name="tf_prefix" value="$(arg forth_tb3)" />
    </node>
    <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model $(arg forth_tb3) -x $(arg forth_tb3_x_pos) -y $(arg forth_tb3_y_pos) -z $(arg forth_tb3_z_pos) -Y $(arg forth_tb3_yaw) -param robot_description" />
  </group>

二、统一话题控制五个机器人(三种方式)

1、第一种:修改控制驱动插件代码

1)打开编辑该文件

gedit ~/catkin_ws/src/turtlebot3/turtlebot3_description/urdf/turtlebot3_burger.gazebo.xacro

2)在机器人配置文件控制驱动插件代码中设置全局名称**/cmd_vel**

  <gazebo>
    <plugin name="mecanum_controller" filename="libgazebo_ros_planar_move.so">
      <commandTopic>/cmd_vel</commandTopic>
      <odometryTopic>/odom</odometryTopic>
      <odometryFrame>odom</odometryFrame> 	<leftFrontJoint>wheel_lf_joint</leftFrontJoint>
      <rightFrontJoint>wheel_rf_joint</rightFrontJoint>
      <leftRearJoint>wheel_lb_joint</leftRearJoint>
      <rightRearJoint>wheel_rb_joint</rightRearJoint>
      <odometryRate>20.0</odometryRate>
      <robotBaseFrame>base_link</robotBaseFrame>
    </plugin>
  </gazebo> 

3)在键盘控制节点中发布全局名称/cmd_vel,打开编译该文件

gedit ~/catkin_ws/src/turtlebot3/turtlebot3_teleop/nodes/turtlebot3_teleop_key

打开文件后更改为

pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10)

4)仿真运行

##新终端

roslaunch turtlebot3_gazebo multi_turtlebot3.launch

##新终端

rosrun turtlebot3_teleop turtlebot3_teleop_key

2、第二种:键盘发布器同时发布五个话题

1)在键盘控制节点中发布全局名称/cmd_vel,打开编译该文件

gedit ~/catkin_ws/src/turtlebot3/turtlebot3_teleop/nodes/turtlebot3_teleop_key

2)修改如下

pub = rospy.Publisher('cmd_vel', Twist, queue_size=10)
pub0 = rospy.Publisher('/tb3_0/cmd_vel', Twist, queue_size=10)
pub1 = rospy.Publisher('/tb3_1/cmd_vel', Twist, queue_size=10)
pub2 = rospy.Publisher('/tb3_2/cmd_vel', Twist, queue_size=10)
pub3 = rospy.Publisher('/tb3_3/cmd_vel', Twist, queue_size=10)
pub4 = rospy.Publisher('/tb3_4/cmd_vel', Twist, queue_size=10)

pub.publish(twist)
pub0.publish(twist)
pub1.publish(twist)
pub2.publish(twist)
pub3.publish(twist)
pub4.publish(twist)

3)仿真运行

##新终端

roslaunch turtlebot3_gazebo multi_turtlebot3.launch

##新终端

rosrun turtlebot3_teleop turtlebot3_teleop_key

3、第三种:新建测试节点(最实用)

原理如下:
在这里插入图片描述

1)创建功能包

cd ~/catkin_ws/src
catkin_create_pkg learning_four roscpp rospy std_msgs turtlesim

2)配置CMakeLists.txt中的编译规则

在CMakeLists.txt中第153行后添加编译规则

add_executable(four_subscriber src/four_subscriber.cpp)
target_link_libraries(four_subscriber ${catkin_LIBRARIES})

3)在src文件夹中创建cpp文件

在learing_four功能包下的src文件夹中打开终端输入以下命令

touch four_subscriber.cpp

4)编写代码

/**
* 该例程将订阅/cmd_vel话题,消息类型geometry_msgs::Twist
*/

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
  
ros::Publisher pub0;
ros::Publisher pub1;
ros::Publisher pub2;
ros::Publisher pub3;
ros::Publisher pub4;

// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const geometry_msgs::Twist& twist)
{
   pub0.publish(twist);
   pub1.publish(twist);
   pub2.publish(twist);
   pub3.publish(twist);
   pub4.publish(twist);
}

int main(int argc, char **argv)
{ 
   // 初始化ROS节点
   ros::init(argc, argv, "four_subscriber");

   // 创建节点句柄
   ros::NodeHandle n;
   // 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
   ros::Subscriber four_sub = n.subscribe("cmd_vel", 10 , poseCallback);

   // 将接收到的消息打印出来
   pub0 = n.advertise<geometry_msgs::Twist>("/tb3_0/cmd_vel", 10);
   pub1 = n.advertise<geometry_msgs::Twist>("/tb3_1/cmd_vel", 10);
   pub2 = n.advertise<geometry_msgs::Twist>("/tb3_2/cmd_vel", 10);
   pub3 = n.advertise<geometry_msgs::Twist>("/tb3_3/cmd_vel", 10);
   pub4 = n.advertise<geometry_msgs::Twist>("/tb3_4/cmd_vel", 10);

   // 循环等待回调函数
   ros::spin();
   return 0;

5)编译功能包

cd ~/catkin_ws
catkin_make

6)仿真运行

##新终端

roslaunch turtlebot3_gazebo multi_turtlebot3.launch

##新终端

rosrun learning_four four_subscriber

##新终端

rosrun turtlebot3_teleop turtlebot3_teleop_key

三、演示视频

图片中5个机器人正在以相同的线速度、角速度进行运动,任务完成。

统一话题控制机器人

四、gazebo环境中搭建场景

1)打开编辑该文件(以已有路径为例)

gedit ~/catkin_ws/src/turtlebot3_simulations/turtlebot3_gazebo/launch/multi_turtlebot3.launch

2)将所创建的gazebo环境的文件夹如图所示的路径

在这里插入图片描述

3)修改如下代码中第二行的world名称,即完成gazebo环境中的场景搭建

 <include file="$(find gazebo_ros)/launch/empty_world.launch">
   <arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/test/test.world"/>
   <arg name="paused" value="false"/>
   <arg name="use_sim_time" value="true"/>
   <arg name="gui" value="true"/>
   <arg name="headless" value="false"/>
   <arg name="debug" value="false"/>
 </include>  

4)效果如图

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS学习日志:话题的方式统一控制5台机器人 的相关文章

随机推荐

  • linux进程间通信-共享内存

    linux进程间通信 共享内存 一 共享内存介绍 共享内存可以从字面上去理解 xff0c 就把一片逻辑内存共享出来 xff0c 让不同的进程去访问它 xff0c 修改它 共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式
  • Linux ipcs命令与ipcrm命令的用法详解

    以下是对Linux中的ipcs命令与ipcrm命令的用法进行了介绍 xff0c 需要的朋友可以过来参考下 是linux uinx上提供关于一些进程间通信方式的信息 xff0c 包括共享内存 xff0c 消息队列 xff0c 信号 ipcs用
  • c++11多线程编程 condition_variable wait notify_one notify_all 第八讲

    1 条件变量std condition variable wait notify one notify all wait 用来等一个东西 1 如果第二个参数返回值是true xff0c 那么这一行就继续往下运行 2 如果第二个参数返回值是f
  • c++11多线程 async、future、packaged_task、promise 第九讲

    1 std async std future创建后台任务并返回 2 std packaged task 3 std promise 4 小结 一 std async std future创建后台任务并返回 希望线程返回一个结果 xff1b
  • c++11多线程 windows临界区、其他各种mutex互斥量 第十二讲

    1 windows临界区 2 多次进入临界区实验 3 自动析构技术 4 recursive mutex递归的独占互斥量 5 带超时的互斥量std timed mutex和std recursive timed mutex include l
  • python 入门 第一讲 9种数据类型

    python语言简洁 计算1 100的整数和 result 61 0 for in range 1 100 result 43 61 i print s 计算并输出n xff01 def fact n if n 61 61 1 return
  • python 入门 第二讲 读取日志文件分析

    https www bilibili com video av77410524 p 61 29 计算传感器日志文件中温度数据的平均值 日志文件包含1万条数据温度数据在文件的第3列输入 xff1a 日志文件 sensor data txt输出
  • python 入门 第三讲 读取中文分析

    统计中文词语出现的次数 以政府一号文件为例 xff0c 统计出现的中文词语数量按照一定标准输出 xff0c 如出现次数等需要解决中文分词问题 xff0c 如 xff1a 这是一门好课 gt 这是 一门 好课 输入 xff1a 2018年一号
  • docker命令

    1 docker version docker version 显示 Docker 版本信息 docker version 例如 xff1a span class token comment docker version span Clie
  • python 入门 第四讲 基本数据类型

    python主要包括9中基本数据类型 数值类型 xff1a 整数 浮点数 复数字节类型 xff1a 字符串 字节串组合类型 xff1a 集合 元祖 列表 字典 为什么会出现不确定尾数 xff1f 计算机 不确定尾数问题来源于浮点数在计算机中
  • Linux - Shell - 在多个文件中查找关键字

    https www cnblogs com xy14 p 11735343 html 1 概述 在多个文件中 查找内容 2 想干啥 目的 在 多个文件 中 查找内容准备 之前在 单个文件里 查找过内容 工具 awk 前提 文件有固定格式查找
  • protobuf repeated数组类型的使用

    http www cppblog com API archive 2014 12 09 209070 aspx protobuf是Google开发的一个序列化框架 xff0c 类似XML xff0c JSON xff0c 基于二进制 xff
  • 分治法,迭代与动态规划及贪心算法感悟

    分治法 xff0c 动态规划法 xff0c 贪心算法这三者之间有类似之处 xff0c 比如都需要将问题划分为一个个子问题 xff0c 然后通过解决这些子问题来解决最终问题 但其实这三者之间的区别还是蛮大的 1 分治法 分治法 xff08 d
  • Python字符串操作大全

    Python中字符串的定义 xff1a 由Unicode码点组成的不可变序列 xff08 Strings are immutable sequences of Unicode code points xff09 Python内置函数提供了强
  • python 入门第五讲 分支与循环

    for i in range 1 15 print i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 从M开始 xff0c 到N结束 xff0c K为步长 for c in 34 hello 34 print c end
  • python 入门第六讲 异常处理

    1 异常的基本用法 2 异常的高级用法 ZeroDivisionError TypeError def foo a try b 43 61 100 a except ZeroDivisionError print 34 can not di
  • python 入门第1七讲 函数的定义与使用

    单元开篇 xff1a 函数定义和使用 1 函数的定义和调用 2 函数的参数传递 3 局部变量和全局变量 4 lambda函数 xff08 匿名函数 xff09 5 函数递归 函数相关的保留字 def 声明函数 return global x
  • python 入门第八讲 组合数据类型基础

    集合类型 xff1a 一组数据的集合 集合的特性 xff1a 无序 xff1a 元素间没有顺序 xff0c 因此要求元素不能相同 xff0c 元素必须是不可变类型 非一致 xff1a 元素类型可以不一样 无索引 xff1a 不能对某个元素进
  • python 入门第九讲 组合数据类型运算函数及方法(非常重要)

    目录 单元开篇 xff08 组合数据类型使用方法 xff09 我是美丽的分割线 我是美丽的分割线 单元开篇 xff08 组合数据类型使用方法 xff09 集合类型的使用 1 2 3 元祖类型的使用 xff08 xff09 列表类型的使用 字
  • ROS学习日志:话题的方式统一控制5台机器人

    在gazebo环境中搭建一个尽量美观的场景 启动5台 turtlebot3 机器人 xff0c 以话题的方式统一控制5台机器人的运动速度 xff08 1 xff09 原有文件基础上添加多个机器人 xff08 2 xff09 统一话题控制五个