前提需求:安装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 0> 连接自定义代码
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 修改配置文件
- 执行指令:
nano /etc/ssh/sshd_config
- 允许root登录
PermitRootLogin prohibit-password 修改为: PermitRootLogin yes
- 重启服务
systemctl restart sshd
2.3 NTP校时服务
-
更改NTP配置
echo [Time]>/etc/systemd/timesyncd.conf
-
重新服务
systemctl restart systemd-timesyncd
-
查看日志
journalctl --since -1h -u systemd-timesyncd
2.4 安装配置UFW防火墙
- 启用
sudo ufw enable
sudo ufw default deny
运行以上两条命令后,开启了防火墙,并在系统启动时自动开启。关闭所有外部对本机的访问,但本机访问外部正常。
- 开启/禁用及其其他命令
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
三、本地端连接机载计算机远程桌面
四、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建立连接
- 根据串口建立连接:略
【步骤2-3非必须。】
(4)准备连接事宜,首先通过ssh连接上机载计算机:
可以看到此时的QGC处于未连接状态。
接下来通过ssh运行机载电脑上的mavros,结果如下,连接速度还是非常迅速的:
可以远程查看飞控状态信息
六、同版本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
即可完成通信。
Comments NOTHING