无人机自主导航12 自主导航】硬件篇-飞控、机载计算机与地面控制站通讯与控制

发布于 2021-05-04  1106 次阅读


前提需求:安装ROS、MAVROS、配置飞控等。

一、PX4与机载计算机通讯-连接px4和机载计算机

官方教程:点击

1.1 硬件配置

在 任何 可配置的串口 上使能MAVLink消息。

TELEM 2 一般用作与配套计算机通信。

要在TELEM 2 上配置默认的配套计算机消息流,请设置以下参数:

MAV_1_CONFIG = TELEM 2 (MAV_1_CONFIG总是配置为 TELEM 2 端口)
MAV_1_MODE = Onboard
SER_TEL2_BAUD = 921600(建议在像日志流或FastRTPS之类的应用,使用 921600 或更高)

1.2 软件配置

为了接收 mavlink消息, 配套计算机需要运行一些与串行端口对话的软件。 最常见的选择有:

  • MAVROS 与ros 节点通信
  • C/C++ example code 连接自定义代码

MAVLink Router (recommended) or MAVProxy to route MAVLink between serial and UDP

二、本地端SSH连接机载计算机

ufw放行ssh端口

2.1、SSH安装配置

1.1 安装SSH

安装SSH客户端

apt install openssh-client

安装SSH服务器

apt install openssh-server

安装SFTP服务器

apt install penssh-sftp-server

启动

systemctl start sshd

开机自动启动

systemctl enable sshd

2.2 修改配置文件

  1. 执行指令:
    nano /etc/ssh/sshd_config
  2. 允许root登录
 PermitRootLogin prohibit-password  修改为: PermitRootLogin yes
  1. 重启服务
systemctl restart sshd

2.3 NTP校时服务

  1. 更改NTP配置

    echo [Time]>/etc/systemd/timesyncd.conf
  2. 重新服务

    systemctl restart systemd-timesyncd
  3. 查看日志

    journalctl --since -1h -u systemd-timesyncd

2.4 安装配置UFW防火墙

  1. 启用
sudo ufw enable

sudo ufw default deny

运行以上两条命令后,开启了防火墙,并在系统启动时自动开启。关闭所有外部对本机的访问,但本机访问外部正常。

  1. 开启/禁用及其其他命令
sudo ufw allow|deny [service]

# 安装
apt install ufw
# 放行服务
ufw allow ssh
# 放行端口
ufw allow 80/tcp
# 放行一组端口
ufw allow 8000:8006/tcp
# 允许特定地址连接
ufw allow from 8.8.8.8
# 允许一个子网连接
ufw allow from 192.168.1.0/24
# 启用ufw(注意如果通过SSH操作启用前请检查是否打开了ssh端口)
ufw enable
# 查看规则
ufw status numbered
# 删除规则
ufw delete allow 80/tcp
# 重载
ufw reload
# 查看防火墙运行状态
ufw status verbose

三、本地端连接机载计算机远程桌面

file

四、MAVROS连接Pixhawk

请务必通过 usermod 将自己添加到 tty和dialout 组, 以避免必须以 root 身份执行脚本。

usermod -a -G tty ros-user
usermod -a -G dialout ros-user

在 linux 上, usb ftdi 的默认名称将类似于 \dev\ttyUSB0。 如果您在 usb 或 arduino 上连接了第二个 ftdi, 它将注册为 \dev\ttyUSB1。 为了避免第一次插入和第二个插头之间的混淆, 我们建议您创建一个从 ttyUSBx 到友好名称的符号链接, 具体取决于 usb 设备的供应商和产品 ID。

使用 lsusb指令,我们可以获得供应商和产品 ID。

如果你没找到你是设备,拔掉,执行 lsusb,再插上, 再次执行lsusb,查看增加的设备:

dji@manifold2:~lsusb
Bus 002 Device 002: ID 05e3:0620 Genesys Logic, Inc. 
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 8086:0b3a Intel Corp. 
Bus 001 Device 004: ID 0461:4d20 Primax Electronics, Ltd HP Optical Mouse
Bus 001 Device 006: ID 046d:c31c Logitech, Inc. Keyboard K120
Bus 001 Device 003: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter
Bus 001 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
dji@manifold2:~ lsusb
Bus 002 Device 002: ID 05e3:0620 Genesys Logic, Inc. 
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 8086:0b3a Intel Corp. 
Bus 001 Device 004: ID 0461:4d20 Primax Electronics, Ltd HP Optical Mouse
Bus 001 Device 006: ID 046d:c31c Logitech, Inc. Keyboard K120
Bus 001 Device 003: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter
Bus 001 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 001 Device 008: ID 26ac:0011  
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

HDMI Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Pixhawk 是 Bus 001 Device 008: ID 26ac:0011
tuozyhanwu:
Bus 001 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Mouse is Bus 001 Device 004: ID 0461:4d20 Primax Electronics, Ltd HP Optical Mouse
ketboard Bus 001 Device 006: ID 046d:c31c Logitech, Inc. Keyboard K120
D435i 是Bus 001 Device 003: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter

建立mavros启动文件mavros.launch

<?xml version="1.0"?>
<launch>

    <!-- MAVROS configs -->
    <arg name="fcu_url" default="/dev/ttyACM0:57600"/>
    <arg name="gcs_url" default="" />
    <arg name="respawn_mavros" default="false"/>

    <!-- MAVROS -->
    <include file="(find experiment_fast_planner)/launch/px4.launch">
        <!-- GCS link is provided by SITL -->
        <arg name="gcs_url" value="(arg gcs_url)"/>
        <arg name="fcu_url" value="(arg fcu_url)"/>
        <arg name="respawn_mavros" value="(arg respawn_mavros)"/>
    </include>

</launch>

px4.launch

<launch>
    <!-- vim: set ft=xml noet : -->
    <!-- example launch script for PX4 based FCU's -->

    <arg name="fcu_url" default="/dev/ttyACM0:57600" />
    <arg name="gcs_url" default="" />
    <arg name="tgt_system" default="1" />
    <arg name="tgt_component" default="1" />
    <arg name="log_output" default="screen" />
    <arg name="fcu_protocol" default="v2.0" />
    <arg name="respawn_mavros" default="false" />

    <include file="(find mavros)/launch/node.launch">
        <arg name="pluginlists_yaml" value="(find experiment_fast_planner)/config/px4_pluginlists.yaml" />
        <arg name="config_yaml" value="(find experiment_fast_planner)/config/px4_config.yaml" />

        <arg name="fcu_url" value="(arg fcu_url)" />
        <arg name="gcs_url" value="(arg gcs_url)" />
        <arg name="tgt_system" value="(arg tgt_system)" />
        <arg name="tgt_component" value="(arg tgt_component)" />
        <arg name="log_output" value="(arg log_output)" />
        <arg name="fcu_protocol" value="(arg fcu_protocol)" />
        <arg name="respawn_mavros" default="(arg respawn_mavros)" />
    </include>
</launch>

在地面站pc用ssh控制机载计算机后,运行mavros px4.launch

roslaunch experiment_fast_planner mavros.launch

如果报错基本就是fcl_url没有匹配,修改arg name=“fcu_url” default="/dev/ttyACM0:57600",如果采用USB连接则改为:/dev/ttyUSB0:57600"(此处存疑,无需改动可实现),执行后的输出如下:

[ WARN] [1620739993.163170136]: GP: No GPS fix
[ INFO] [1620739993.242315079]: udp1: Remote address: 172.17.127.231:14550
[ INFO] [1620739993.262942056]: IMU: Scaled IMU message used.
[ INFO] [1620739993.369541644]: IMU: Attitude quaternion IMU detected!
[ INFO] [1620739993.369769889]: IMU: High resolution IMU detected!
[ INFO] [1620739993.924646121]: CON: Got HEARTBEAT, connected. FCU: PX4 Autopilot
[ INFO] [1620739993.927554713]: IMU: Attitude quaternion IMU detected!
[ INFO] [1620739993.927750848]: IMU: High resolution IMU detected!
....

查看mavros状态:rostopic echo /mavros/state

dji@manifold2:~/catkin_ws/src/experiment_fast_planner$ rostopic echo /mavros/state
header: 
  seq: 9
  stamp: 
    secs: 1620646363
    nsecs: 758022064
  frame_id: ''
connected: True
armed: False
guided: False
manual_input: True
mode: "MANUAL"
system_status: 3
---
header: 
  seq: 10
  stamp: 
    secs: 1620646364
    nsecs: 756534072
  frame_id: ''
connected: True
armed: False
guided: False
manual_input: True
mode: "MANUAL"
system_status: 3
---

如果显示connected :false则没有连接上飞控,需要检查:

  • 串口/USB接口是否正确连接

  • 波特率是否设置正确

  • 机载计算机是否设置了串口

五、地面站QGC连接飞控

本节内容续接第三节,在无人机飞行过程中,我们需要通过另一台电脑运行的QGC地面站对无人机状态进行监控。

首先通过ufw防火墙开放端口,根据 <arg name="fcu_url" default="udp://:14540@"/>设定端口为14540,端口可自定义为其他:

sudo ufw allow 14540

查看是否开放了指定端口:

sudo ufw status

回到需要进行远程连接的电脑,将运行MAVROS的机载电脑、运行QGC的地面站连接到相同的局域网,如WIFI。

打开QGC,根据上文设定的端口建立QGC与MAVROS连接,步骤如下:

(1)修改参数,将gcs_url参数修改为运行QGC地面站在局域网下的IP:

<arg name="gcs_url" default="udp://@172.17.127.231" />

运行MAVROS,即进行上文第三:MAVROS连接PX4步骤:

dji@manifold2:~/catkin_ws/src/experiment_fast_planner$ roslaunch experiment_fast_planner px4.launch 
... logging to /home/dji/.ros/log/66ab6092-b184-11eb-9499-c8e7d8ffc3d2/roslaunch-manifold2-25170.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://manifold2:33657/

SUMMARY
========

CLEAR PARAMETERS
 * /mavros/

PARAMETERS
 * /mavros/cmd/use_comp_id_system_control: False
 * /mavros/conn/heartbeat_rate: 1.0
 * /mavros/conn/system_time_rate: 1.0
......
 * /mavros/wheel_odometry/wheel1/y: 0.15
 * /rosdistro: kinetic
 * /rosversion: 1.12.17

NODES
  /
    mavros (mavros/mavros_node)

auto-starting new master
process[master]: started with pid [25180]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 66ab6092-b184-11eb-9499-c8e7d8ffc3d2
process[rosout-1]: started with pid [25193]
started core service [/rosout]
process[mavros-2]: started with pid [25211]
[ INFO] [1620646778.962021547]: FCU URL: /dev/ttyACM0:57600
[ INFO] [1620646778.963503299]: serial0: device: /dev/ttyACM0 @ 57600 bps
[ INFO] [1620646778.963839284]: GCS bridge disabled
......
[ INFO] [1620646779.183544653]: Autostarting mavlink via USB on PX4
[ INFO] [1620646779.183575427]: Built-in SIMD instructions: SSE, SSE2
[ INFO] [1620646779.183592028]: Built-in MAVLink package version: 2021.3.3
[ INFO] [1620646779.183615756]: Known MAVLink dialects: common ardupilotmega ASLUAV all autoquad icarous matrixpilot paparazzi standard uAvionix ualberta
[ INFO] [1620646779.183633796]: MAVROS started. MY ID 1.240, TARGET ID 1.1
[ WARN] [1620646779.289711420]: GP: No GPS fix
[ INFO] [1620646779.505851748]: IMU: Attitude quaternion IMU detected!
[ INFO] [1620646779.522303497]: IMU: High resolution IMU detected!
[ INFO] [1620646779.699881798]: CON: Got HEARTBEAT, connected. FCU: PX4 Autopilot
[ INFO] [1620646779.844997756]: IMU: Attitude quaternion IMU detected!
[ INFO] [1620646779.845735282]: IMU: High resolution IMU detected!
[ INFO] [1620646780.705384785]: WP: Using MISSION_ITEM_INT
[ INFO] [1620646780.705526950]: VER: 1.1: Capabilities         0x000000000000e4ef
[ INFO] [1620646780.705670169]: VER: 1.1: Flight software:     010b03ff (a6274bc5ed000000)
[ INFO] [1620646780.705764366]: VER: 1.1: Middleware software: 010b03ff (a6274bc5ed000000)
[ INFO] [1620646780.705851158]: VER: 1.1: OS software:         080200ff (ec20f2e6c5cc35b2)
[ INFO] [1620646780.705964399]: VER: 1.1: Board hardware:      00000011
[ INFO] [1620646780.706066365]: VER: 1.1: VID/PID:             26ac:0011
[ INFO] [1620646780.706151989]: VER: 1.1: UID:                 3438510935383135
[ WARN] [1620646780.706289108]: CMD: Unexpected command 520, result 0
[ INFO] [1620646789.700363372]: HP: requesting home position
[ INFO] [1620646794.701044538]: WP: mission received
[ INFO] [1620646799.700259534]: HP: requesting home position
[ WARN] [1620646809.490710681]: GP: No GPS fix
[ INFO] [1620646809.700413297]: HP: requesting home position

如果报错:
fix

sudo gedit /opt/ros/kinetic/share/mavros/launch/px4_config.yaml

则打开配置文件

sudo gedit /opt/ros/melodic/share/mavros/launch/px4_config.yaml

修改为:timesync_rate: 0.0 # TIMESYNC rate in Hertz (feature disabled if 0.0), 默认参数是10.0。

(2)点击左上角图标-应用设置

(3)点击comm Links,新建连接,根据参数提示设定对应的值,注意端口与上文的launch配置文件相同,有两种设定方式,建议两个参数全开

  • 根据UDP建立连接

file

  • 根据串口建立连接:略

【步骤2-3非必须。】

(4)准备连接事宜,首先通过ssh连接上机载计算机:

file

可以看到此时的QGC处于未连接状态。

接下来通过ssh运行机载电脑上的mavros,结果如下,连接速度还是非常迅速的:

file

可以远程查看飞控状态信息

file

六、同版本ROS多机平台通信

6.1 master计算机配置--机载计算机

  • 1、查看基本信息

在终端中输入hostname,查看hostname,输入ifconfig 查看ip

  • 2、运行
sudo vim /etc/hosts

可以看到如下配置信息

127.0.0.1  localhost
127.0.1.1  [本设备的hostname]

[IP_A]            [主设备的hostname ]
[IP_B]            [从设备的hostname]

增加主机与从机效果:

dji@manifold2:~$ cat /etc/hosts
127.0.0.1   localhost
127.0.1.1   manifold2

192.168.43.27   manifold2
192.168.43.54   ganahe-ANh-51

从机效果:

ganahe@ganahe-ANh-51:~/catkin_ws/src/experiment_fast_planner$ cat /etc/hosts
127.0.0.1   localhost
127.0.1.1   ganahe-ANh-51

192.168.43.27   manifold2
192.168.43.54   ganahe-ANh-51

6.2 时间同步

1、 重启网络服务

sudo /etc/init.d/networking restart

2、装上chrony包,用于实现同步:

sudo apt-get install chrony

3、安装ssh工具,方便远程到另一个设备进行调试,省的来回切电脑操作

sudo apt-get install openssh-server

安装完毕后,可以通过下面命令查看服务是否启动

ps -e | grep ssh

4、ping下对方机子,看网络通不通
主机需要ping下每个从机,从机都ping下主机

6.3 修改.bashrc配置文件

1、把下面的内容增加到.bashrc末尾

export ROS_HOSTNAME=[本机的hostname] #!!!注意是本机的hostname 端口号11311是固定值,照抄即可

export ROS_MASTER_URI=http://[主机的hostname]:11311

例如,主机yuhs的设备作为master

export ROS_HOSTNAME=yuhs
export ROS_MASTER_URI=http://yuhs:11311

然后启用

source ~/.bashrc

slave设备配置
其他内容和master配置一致,只有第八项内容
8、把下面的内容增加到.bashrc末尾


export ROS_HOSTNAME=[本机的hostname] #!!!注意是本机的hostname
export ROS_MASTER_URI=http://[主机的hostname]:11311

例如 lisi是从设备的hostname,yuhs是主设备的hostname

export ROS_HOSTNAME=lisi
export ROS_MASTER_URI=http://yuhs:11311

测试

注意事项

如果在从机运行一个roslaunch,启动一个程序,需要现在主机上运行roscore后,
从机才能启动起来,
原本一个pc上运行roslaunch的时候,会默认启动rosmaster,但是现在主机是另一个pc了,所以需要这样先把master跑起来
尽量把最常用的pc设置为master

七、不同版本ROS多机平台通信

实机平台的OS为Manifold-2C上的ubutnu16.04(kinetic),地面站电脑则采用搭建melodic的ubutnu18.04:

平台 OS ROS
Manifold-2C Ubuntu16.04 Kinetic
GCS Ubuntu18.04 Melodic

最近项目遇到在Ubuntu16.04 与Ubuntu18.04两个系统间进行ROS通信,ROS版本分别为Kinetic和Melodic。配置网络后,两边都能够ping通,但是在获取ros数据是,却出现报错:

后面在ROS wiki上查询到相关解决方案:

即:

Master: export ROS_HOSTNAME=hello(主机名称).local
Slave : export ROS_HOSTNAME=fine(客机名称).local
export ROS_MASTER_URI=http://hello(主机名称).local:11311
即可完成通信。

参考文献