multi-robot system

  经过两个多月的ros学习,对ros的认识有了比较深入的了解,本篇博客主要记录在ros下开发多机器人系统以及对ros更深入的开发。本篇博客是假定读者已经学习完了全部ros tutorials

Beginner Level 和 Intermediate Level

  

  目录:

  同一电脑运行多机器人节点

  现在我们开始尝试运行两个相同的turtlesim节点(nodes),打开三个运行如下命令:

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtlesim_node

  得到的结果如下:

  第一次运行的turtlesim_node 被终止了。ros不允许相同名字的节点同时运行,如果第二个节点运行,第一个会被自动终结。

  参数重映射(Remapping Arguments):一个节点中的任何ROS名称可以在命令行重映射,这是ROS中的一个非常重要且强大的特征。

  有了这个特征,我们就可以实现在同一台电脑中控制多个节点做不同的事了:

  如果要同时运行多个节点的话,是一定要改名字的,一下介绍两种改名字的方法:

    第一种:直接在命令行改名字

更改第二个命令:
rosrun turtlesim turtlesim_node __name:=turtlesim2
再运行:
rostopic pub /turtle1/cmd_vel -r 10 geometry_msgs/Twist '{linear:{x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

  现在可以实现同时控制两个turtlesim_node了

    第二种:使用launch文件

  创建 multi_turtlesim.launch

<launch>
<group ns="sim1">
<node name="turtle" pkg="turtlesim" type="turtlesim_node"/>
<node name="controller" pkg="turtlesim" type="draw_square"/>
</group>
<group ns="sim2">
<node name="turtle" pkg="turtlesim" type="turtlesim_node"/>
<node name="controller" pkg="turtlesim" type="draw_square"/>
</group>
</launch>

  我们直接在launch文件中更改了节点的namespaces,运行rqt_graph可以更直接的看到我i们的修改:

  

  如果要实现多个节点受不同的控制,创建 remapping_turtlesim.launch ,并运行:

<launch>
<group ns="sim1">
<node name="turtle" pkg="turtlesim" type="turtlesim_node"/>
</group>
<group >
<node name="turtle" pkg="turtlesim" type="turtlesim_node"/>
</group>
<node pkg="turtlesim" name="teleop" type="turtle_teleop_key" output="screen">
<remap from="/turtle1/cmd_vel" to="/sim1/turtle1/cmd_vel"/>
</node>
</launch>

  这里,我们将  topic  /turtle1/cmd_vel 改成 /sim1/turtle1/cmd_vel,

  再运行:

rostopic pub /turtle1/cmd_vel -r  geometry_msgs/Twist '{linear:{x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

  现在我们可以发现,其中一只turtle在转圈,而另外一只受键盘控制。

 不同电脑在同一roscore下运行多机器人节点

  上面我们已经能在同一电脑中实现多机器人的控制了,接下来,我们将实现在不同电脑中实现多机器人的控制。

  首先,准备两台电脑并确保在同一wifi下,然后运行 ifconfig

假设得到的结果为:
192.168.1.151 (machine A)
192.168.1.154 (machine B)

  然后,在machine B 上运行:

ping 192.168.1.151

  如果有返回,则可以实现两台电脑的通信。

  现在,我们以machine A为主机建立多机器人系统。

  然后再在machine A的  .bashrc 中添加:

function get_ip_address { ifconfig | fgrep -v 127.0.0.1 | fgrep '掩码:255.255.255.0' | egrep -o '地址:[^ ]*' | sed 's/^.*://'; }
export ROS_IP=$( get_ip_address )

  在machine B的 .bashrc中添加:

function get_ip_address { ifconfig | fgrep -v 127.0.0.1 | fgrep '掩码:255.255.255.0' | egrep -o '地址:[^ ]*' | sed 's/^.*://'; }
export ROS_IP=$( get_ip_address )
export ROS_MASTER_URI=http://192.168.1.151:11311

  现在,可以实现多电脑的机器人通信了:

在 machine A中运行:roscore
在 machine A中运行:turtlesim 节点
在 machine B中运行:turtlesim2节点
在 machine B中运行:teleop_key 节点

  完成上述步骤后,你就会发现,我们可以同时控制A与B两个turtlesim 节点了。

  下一篇介绍:

  在下一篇中,我们将实现在模拟环境下的多机器人协作,防止机器人之间的碰撞,机器人的同步,以及自定义消息的创建。

ros下多机器人系统(1)的更多相关文章

  1. Ubuntu与ROS的Docker桌面系统与ROS在线练习课程(在线Linux虚拟机)

    ROS在线练习课程正在逐步完善中,目前以ROS官网中文资料制作,可参考: https://www.shiyanlou.com/courses/854  邀请码 U23ERF8H 安装Ubuntu+RO ...

  2. ZED 相机 && ORB-SLAM2安装环境配置与ROS下的调试

    注:1. 对某些地方进行了更新(红色标注),以方便进行配置. 2. ZED ROS Wrapper官方github已经更新,根据描述新的Wrapper可能已经不适用与Ros Indigo了,如果大家想 ...

  3. ROS中3D机器人建模(一)

    一,机器人建模的ROS软件包 *urdf : 机器人建模最重要的ros软件包是urdf软件包.这个软件包包含一个用于统一机器人描述格式(URDF)的C++解析器,它是一个表示机器人模型的XML文件,还 ...

  4. UEFI+GPT模式下的Windows系统中分区结构和默认分区大小及硬盘整数分区研究

    内容摘要:本文主要讨论和分析在UEFI+GPT模式下的Windows系统(主要是最新的Win10X64)中默认的分区结构和默认的分区大小,硬盘整数分区.4K对齐.起始扇区.恢复分区.ESP分区.MSR ...

  5. LSD-SLAM深入学习(1)-基本介绍与ros下的安装

    前言 借鉴来自RGB-D数据处理的两种方法-基于特征与基于整体的,同样可以考虑整个图片的匹配,而不是只考虑特征点的…… 一般这种稠密的方法需要很大的计算量,DTAM: Dense tracking a ...

  6. Hyper-V下安装Ossim系统

    WindowsServer2008Hyper-V下安装Ossim系统 背景:很多朋友在用Hyper-v安装Linux的时候总是抱怨速度很慢,而且装好了系统无法识别网卡,可实际上针对网卡的问题本文提出了 ...

  7. VM下的linux系统上不了网?? 使用putty远程登录不上linux的解决方法?

    背景:昨晚想尝试一下用putty远程登录我的linux系统,悲剧的是,我竟然连接不上,显示 connection refused   ,连接被拒绝.于是我就想看看能不能在linux下看看能不能访问百度 ...

  8. Windows系统下远程Linux系统

    Windows系统下远程Linux系统 工具:Xmanager 启动界面: 配置保存路径(win7): C:\Users\Administrator\AppData\Roaming\NetSarang ...

  9. 1、win10下连接本地系统上的Linux操作系统(分别以Nat方式和桥接模式实现)

    1.win10下连接本地系统上的Linux操作系统(分别以Nat方式和桥接模式实现) 一.准备知识:win10下打开Administrator的方式 在win10操作系统中,Administrator ...

随机推荐

  1. Delphi2010中DataSnap高级技术(7)—TDSServerClass中Lifecycle生命周期三种属性说明

    Lifecycle 三种属性: Session.Invocation.Server 这三种属性都用在什么情况,有什么要注意的事项,Delphi2010中罕有说明. 如果乱用这三种属性,你的服务程序有可 ...

  2. egrep 及扩展正则表达式

    grep -E 表示支持扩展的正则表达式 grep -E = egrep 一.字符匹配: 扩展模式下的字符匹配与基本正则表达式的字符匹配相同,如: . 表示任意单个字符 [] 表示范围内人任意单个字符 ...

  3. Java学习基础1

    Java 平台: Java API JVM  特点:可跨平台  Java 运行机制:           编译                         运行 Java文件-------> ...

  4. Android_SQLite版本升级,降级 管理

    今天我们主要学习了数据库版本升级对软件的管理操作. 我们手机经常会收到xxx软件升级什么的提醒,你的软件版本更新,同时你的数据库对应的版本也要相应的更新. 数据库版本更新需要主要的问题: 软件的1.0 ...

  5. @ViewDebug.ExportedProperty的使用

    原文链接:http://daemon369.github.io/android/2014/06/12/android-viewdebug-exportedproperty/ http://www.eo ...

  6. Expected one result (or null) to be returned by selectOne(), but found 2

    这个问题在于你查询sql返回结果是多个值.一个集合,但是你在service的实现层的dao都调用了.get方法.而是应该使用.getlist方法等.

  7. C#线程同步控制

    ManualResetEvent类,用于通知一个或多个正在等待的线程已发生事件,它有2种状态:有信号(true)的无信号(false). 有2种方法可以设置它的信号状态:构造函数构造的时候设置或者通过 ...

  8. SQL2008安装提示"Microsoft visual studio 2008早期之前的版本

    打开注册表管理器(运行 --regedit 依次展开如下项目:   HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DevDiv 将devdiv项目导出来保存,倒出来之后可 ...

  9. NSDate和NSString相互转换

    一.NSDate转NSString //获取系统当前时间 NSDate *currentDate = [NSDate date]; //用于格式化NSDate对象 NSDateFormatter *d ...

  10. include,import,@class的区别

    1.#include与#import功能一样,都是导入头文件 2.区别是#include是单纯导入头文件,如果重复导入头文件,头文件就被导入多分 3.#import在导入头文件之前会检查之前是否导入过 ...