多无人机通信
多无人机之间相互通信是实现编队飞行的基础,而想要实现通信就需要组建网络,在网络之间实现数据信息的互相传输,按结构分成两大类:中心节点网络和无中心节点网络.我们这里所用的路由器就是中心节点网络,所有的数据的传输都要经过中心节点,所以中心节点的带宽需要足够高才能满足要求.
硬件:pixhawk-v4, F450机架,tx2开发板,小米路由器以及一些基本零件.
软件:Ubuntu18,px4(v1.11.2)及其环境.
我们这里搭建的只是一个小型局域网,不会连接互联网,只需要把每个无人机中的tx2连接上该网络,就能使他们同处于同一台局域网中,同时也会为每台tx2分配一个静态ip,保证下次连接上的时候也是相同的ip.然后使用ROS的分布式功能实现在不同的tx2和主机上实现互相通信,即把每台tx2作为一个节点或者从机,而主机电脑作为ROS节点的master节点,每个节点都会通过master节点进行通信.
1.ROS远程控制及主机设置
1.1 安装openssh-server
ROS的远程连接主要是使用ssh来实现的,Ubuntu系统会默认安装openssh-client,但是并没有安装openssh-server,所以需要在从机上安装openssh-server.
sudo apt-get install openssh-server;
sudo /etc/init.d/ssh start
sudo ps -e |grep ssh
1.2 配置主机
1.连接路由器的WiFi,通过ifconfig命令查看其主机的IP地址.
2.配置/etc/hosts文件,输入:
192.168.31.105 name #主机的IP和主机名
192.168.31.176 name1 #从机1的IP和主机名
192.168.31.96 name2 #从机2的IP和主机名
注意:把上面的IP换成自己的IP,主机名也换成自己对应的,因为这是主机中的hosts文件,所以需要包含各个从机的IP地址和从机名.
3.配置~/.bashrc文件,输入:
export ROS_HOSTNAME=name # 这里的name是自己的主机名
export ROS_MASTER_URI=http://name:11311 #也可以把这个name改成主机的IP地址
#其中11311是固定的端口.
4.更新~/.bashrc文件:
source ~/.bashrc
1.3 配置从机
配置从机的步骤和主机的步骤相同.
1.连接路由器的WiFi,通过ifconfig命令查看其从机的IP地址.
2.对第i个从机配置,/etc/hosts文件,输入:
192.168.31.105 name #主机的IP和主机名
192.168.31.176 namei #从机i的IP和主机名
3.对第i个从机,配置~/.bashrc文件,输入:
export ROS_HOSTNAME=namei # 这里的namei是自己的主机名
export ROS_MASTER_URI=http://name:11311 #也可以把这个name改成主机的IP地址
注意:从机中的ROS_MASTER_URI同主机中的相同,一个从机的hosts文件不需要包含另一个从机的IP地址,因为他们之间的通信是通过主机来实现的.
4.更新~/.bashrc文件:
source ~/.bashrc
1.4 测试
测试在同一个局域网中能否用主机控制从机,首先需要让主从机都连上之前的路由器,保证IP地址是静态的,然后在主机中执行:
ssh 用户名@服务器地址
然后输入从机的登录密码即可登录,登录后shell终端的目录会变成从机的目录,就可以在命令行远程控制从机,但是无法使用从机的图形界面工具,例如,如果想修改文件,只能用vim命令在终端修改,不能使用gedit命令打开文本编辑器.
一般情况下我们都是不采取这种远程控制的方式来修改文件,而是提前在从机上写好文件,在需要执行命令的时候在采用这种远程控制的方式控制从机.
2.通过ROS实现通信
2.1 添加group
前面说到,我们需要在主机上运行一个master节点,在从机上运行各自的节点,每个从机都需要在外部控制模式下把飞控的数据输入到tx2,所以每个从机都需要执行命令:
roslaunch mavros px4.launch
通过mavros订阅和发布数据,但是每台从机发布的消息名都是相同的,即同时存在两个/mavros/state消息的数据,ROS节点就会报错.例如:当一台从机通过mavros连接后,另一个从机便无法通过mavros连接.为解决这个问题,需要修改px4.launch文件,为每个从机的消息名提供一个前缀,保证每个从机的消息名都是不同的.修改如下:
<?xml version="1.0"?>
<launch>
<!-- Posix SITL PX4 launch script -->
<!-- Launches Only PX4 SITL. This can be used by external projects -->
<group ns="uav1">
<!-- PX4 config arguments -->
<arg name="est" default="ekf2"/>
<arg name="vehicle" default="iris"/>
<arg name="ID" default="0"/>
<arg name="interactive" default="true"/>
<env name="PX4_SIM_MODEL" value="$(arg vehicle)" />
<env name="PX4_ESTIMATOR" value="$(arg est)" />
<arg unless="$(arg interactive)" name="px4_command_arg1" value="-d"/>
<arg if="$(arg interactive)" name="px4_command_arg1" value=""/>
<node name="sitl_$(arg ID)" pkg="px4" type="px4" output="screen" args="$(find px4)/ROMFS/px4fmu_common -s etc/init.d-posix/rcS -i $(arg ID) $(arg px4_command_arg1)">
</node>
</group>
</launch>
和原来px4.launch文件不同的是为其添加了group标签,使原来的消息名:/mavros/state变为:/uav1/mavros/state,也可以为从机2添加uav2等.
2.2 获取数据
在实现上面的步骤之后,我们已经能够实现远程控制,并解决每个从机的消息名相同的问题,下一步就是看能否在主机上订阅从机中的数据.
在能够实现远程控制的前提下,在主机上执行:roscore命令,建立master节点,然后分别在从机的终端上执行:roslaunch mavros px4.launch,然后可以查看话题名:rostopic list,可以看见/uav1/mavros/state和/uav2/mavros/state,然后查看执行roslaunch mavros px4.launch的终端中是否出现一行
[WARN] CMD Unexpected command 520 ,result 0
如果出现则说明这是tx2能够接受飞控传过来的数据,这是可以通过rostopic echo /uav1/mavros/state打印数据,这是能够看见数据的传输.但是若没有出现那一行,这说明飞控和tx2之前并没有数据传输,这个问题一般情况下是因为没有设置mavlink端口,导致在硬件问题上的数据传输问题.解决办法是:打开QGC,在参数中选择
1. MAV_1_CONFIG 设置为TELEM2
2. MAV_1_MODE 设置为Onboard
3. SER_TEL2_BAUD 设置为921600 8N1
设置TELEM2的原因是这个接口和tx2连接的,每个人的连接方法不同,可以做适量的更改.另外一开始可能参数中只有MAV_1_CONFIG,搜不到其他参数,只需要先把MAV_1_CONFIG参数设置好后重启,其他参数就有了.
当全部设置好并重启飞机之后,就能通过rostopisc echo 命令订阅uav1和uav2的数据.
需要注意的是,在这种情况下只能通过主机来启动roscore,且主机本身无法使用mavros.而其他主机不能作为主机使用,只能使用mavros连接主机,不能使用roscore命令.想要在主机上运行mavros,只需要修改~/.bashrc文件中的master_url的IP地址为localhost,即127.0.0.1,然后再source一下即可.从机也是相同的原理.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)