ROS2+Ardupilot+Gazebo通信仿真基本环境搭建

0 阅读4分钟

一、准备工作:安装ROS2

1. 确认系统版本

ROS2 Humble 仅适配 Ubuntu 22.04 LTS(Jammy),执行命令校验系统:

lsb_release -a

输出信息需包含 Ubuntu 22.04 (Jammy Jellyfish)

2. 更新系统并安装基础工具

sudo apt update
sudo apt upgrade -y

3. 解决 apt 公钥缺失报错(NO_PUBKEY F42ED6FBAB17C654)

  1. 导入缺失公钥
gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv F42ED6FBAB17C654
  1. 将公钥写入 apt 信任列表
gpg --export --armor F42ED6FBAB17C654 | sudo apt-key add -

注意:命令末尾 - 不可省略

  1. 刷新软件源
sudo apt update

4. 鱼香 ROS 一键安装脚本

wget http://fishros.com/install -O fishros && . fishros

交互选项统一选择:1(安装 ROS2 Humble),连续确认全部 1 号选项完成安装。

5. 配置永久 ROS 环境变量

  1. 写入 bashrc 配置文件
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
  1. 立刻加载环境变量,无需重启终端
source ~/.bashrc
  1. 验证 ROS 发行版
echo $ROS_DISTRO

正常输出:humble


二、验证 ROS2 完整安装

1. 话题通信测试(talker/listener)

终端 1(发布节点):

ros2 run demo_nodes_cpp talker

终端 2(订阅节点):

ros2 run demo_nodes_cpp listener

listener 持续打印接收字符串即代表通信正常。

2. 图形海龟仿真测试

终端 1(海龟画布):

ros2 run turtlesim turtlesim_node

终端 2(键盘控制):

ros2 run turtlesim turtle_teleop_key

选中控制终端,通过上下左右方向键可操控海龟移动,图形功能正常即安装完整。

ROS2和Ardupilot的通信(基于MAVROS,本质上还是UDP转发)

1.安装Mavros

安装MAVROS。这是连接ROS2和Ardupilot飞控的桥梁


# 创建工作空间
mkdir -p ~/ros2_mavros_ws/src
cd ~/ros2_mavros_ws/src
 
# 克隆mavros和相关的mavlink包
git clone https://github.com/mavlink/mavros.git
git clone https://github.com/mavlink/mavlink.git
 
# 安装依赖并编译
cd ~/ros2_mavros_ws
rosdep install --from-paths src --ignore-src -r -y
colcon build --symlink-install

可能遇到的问题

RROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.

colcon-core 0.20.1 requires setuptools<80,>=30.3.0, but you have setuptools 82.0.1 which is incompatible.

---

Finished <<< mavlink [15.8s]

Starting >>> libmavconn 


解决

pip3 install "setuptools<80.0.0"

降级完成后,再次运行编译命令即可:

colcon build --symlink-install

装好 ROS2 后写入 bashrc

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
echo "source ~/ros2_mavros_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

2.启动gazebo和ardupilot

启动gazebo

cd ardupilot_gazebo
gz sim -v4 -r iris_runway.sdf --render-engine ogre

image.png

启动ardupilot 将数据通过14550端口转发出去,并可以通过该端口接受命令,双向通信

cd ardupilot
sim_vehicle.py -v ArduCopter -f gazebo-iris --model JSON --map --console --out=udp:172.22.46.xx:14550

image1.png 等待传感器初始化完成后解锁执行任务

mode guided // 切换到引导模式
arm throttle //解锁

3.进入ros2_mavros_ws执行ros连接

cd ros2_mavros_ws
ros2 run mavros mavros_node --ros-args -p fcu_url:=udp://:14550@ -p system_id:=1 -p component_id:=240 -p target_system_id:=1 -p target_component_id:=1 -p dialect:=ardupilotmega

4.查看通信话题

任意打开中断执行

source /opt/ros/humble/setup.bash
source ~/ros2_mavros_ws/install/setup.bash
ros2 topic echo /uas1/mavros/state

成功通信

ros.png

ROS2和Ardupilot的通信(基于DDS转发,极致的性能)

建议基于WSL安装

1.下载已经编译完成的ROS2和Ardupilot整合包

假设下载路径为d/vm_transfer/

ros1.png

2.拷贝文件至WSL

cp /mnt/d/vm_transfer/ardupilot_ros_image.tar.gz ~/
cp /mnt/d/vm_transfer/ROS2_ardupilot_Iris_docker.zip ~/
unzip ROS2_ardupilot_Iris_docker.zip #解压到当前目录

3.借用windows已存在的Docker Desktop导入镜像

  1. 打开 Docker Desktop 设置 - Resources WSL Integration
  2. 开启ubuntu-20.04开关,Apply & restart

dockerwsl.png 3. 关闭当前WSL终端,重新打开WSL窗口 或打开powershell bash wsl --shutdown 4. 再执行导入命令: bash gunzip -c ardupilot_ros_image.tar.gz | docker load docker images # 能看到原镜像名+标签即迁移完成

4.启动docker容器

  1. 进入ROS2_ardupilot_Iris_docker目录(方案一)

    docker compose down
    docker compose up -d
    docker compose exec ardupilot_ros bash
    

    启动成功

    dockerwsl3.png

  2. 使用Docker Desktop启动(方案二,推荐!!!)

    dockerwsl2.png 点击右边的启动按钮即可

5.Vscode进行容器操作及二次开发

  1. 确保DockerDesktop开启且docker容器启动成功

  2. 打开Vscode,连接

    vscode_docker.png

  3. 连接成功

    vscode_docker1.png

6.仿真测试

  1. 进入ros2_ws目录,启动带有摄像头的gazebo仿真

    cd ~/ros2_ws
    rm -rf build/ install/ log/
    colcon build
    source /opt/ros/humble/setup.bash
    source ~/ros2_ws/install/setup.bash
    ros2 launch ardupilot_gz_bringup iris_runway.launch.py
    
  2. 新建终端启动mavproxy

    source /opt/ros/humble/setup.bash
    source ~/ros2_ws/install/setup.bash
    mavproxy.py --console --map --aircraft test --master=:14550
    
  3. 控制飞行并且接收到视频画面

    vscode_docker2.png