愆蟠唉 发表于 昨天 13:51

ROS1(20.04 noetic) + PX4 + AirSim

博客地址:https://www.cnblogs.com/zylyehuo/
参考视频: 保姆级教程~手把手教你实现 ROS2 + PX4 + AirSim 联动
博主使用的版本配置如下:


[*]ROS: 20.04 noetic 【echo $ROS_DISTRO】
[*]PX4: v1.13.2 【git describe --tags】
[*]AirSim: 1.7.0 【找到\Unreal\Plugins\AirSim这个目录,进入后,打开AirSim.uplugin文件查看版本】

最终效果


安装 ROS


[*]20.04 noetic
参考链接: 小鱼的一键安装系列
wget http://fishros.com/install -O fishros && . fishrosPX4 开发环境搭建


[*]MAVROS + QGC + PX4
参考链接: PX4 仿真环境开发整理
参考链接: Linux系统 ubuntu20.04 无人机 PX4 开发环境搭建
遇到报错参考链接: make px4_sitl_default gazebo出错
遇到报错参考链接: Gazebo终端显示 Missing model.config for model
遇到报错参考链接: px4 运行mavros仿真
AirSim 仿真平台搭建


[*]UE4 + AirSim
参考链接: 在Ubuntu系统中搭建Unreal4和AirSim环境
使用Airsim的ros包

参考链接: ubuntu20.04下载和使用Airsim的ros包
遇到报错参考链接: 解决Ubuntu系统下ROS包找不到问题:环境配置与路径检查详解
AirSim 配置文件修改

settings.json
{
    "SettingsVersion": 1.2,
    "SimMode": "Multirotor",
    "ClockType": "SteppableClock",
    "Vehicles": {
      "PX4": {
            "VehicleType": "PX4Multirotor",
            "UseSerial": false,
            "LockStep": true,
            "UseTcp": true,
            "TcpPort": 4560,
            "ControlPortLocal": 14030,
            "ControlPortRemote": 14280,
            "ControlIp": "remote",
            "LocalHostIp": "192.168.1.5",
            "Cameras": {
                "CameraDepth": {
                  "CaptureSettings": [
                        {
                        "ImageType": 2,
                        "Width": 800,
                        "Height": 600,
                        "FOV_Degrees": 120,
                        "AutoExposureSpeed": 100,
                        "AutoExposureBias": 0,
                        "AutoExposureMaxBrightness": 0.64,
                        "AutoExposureMinBrightness": 0.03,
                        "MotionBlurAmount": 0,
                        "TargetGamma": 1.0,
                        "ProjectionMode": "",
                        "OrthoWidth": 5.12
                        }
                  ],
                  "NoiseSettings": [
                        {
                        "Enabled": false,
                        "ImageType": 0,

                        "RandContrib": 0.2,
                        "RandSpeed": 100000.0,
                        "RandSize": 500.0,
                        "RandDensity": 2,

                        "HorzWaveContrib":0.03,
                        "HorzWaveStrength": 0.08,
                        "HorzWaveVertSize": 1.0,
                        "HorzWaveScreenSize": 1.0,

                        "HorzNoiseLinesContrib": 1.0,
                        "HorzNoiseLinesDensityY": 0.01,
                        "HorzNoiseLinesDensityXY": 0.5,

                        "HorzDistortionContrib": 1.0,
                        "HorzDistortionStrength": 0.002
                        }
                  ],
                  "Gimbal": {
                        "Stabilization": 0,
                        "Pitch": 0, "Roll": 0, "Yaw": 0
                  },
                  "X": 0, "Y": 0, "Z": -1,
                  "Pitch": 0, "Roll": 0, "Yaw": 0,
                  "UnrealEngine": {
                        "PixelFormatOverride": [
                            {
<?xml version="1.0"?>
<launch>








<include file="$(find mavros)/launch/px4.launch">
   
   
   
</include>


<node pkg="offboard_py" type="offb_node.py" name="offb_node_py" required="true" output="screen"/>
</launch>"ImageType": 0,
<?xml version="1.0"?>
<launch>








<include file="$(find mavros)/launch/px4.launch">
   
   
   
</include>


<node pkg="offboard_py" type="offb_node.py" name="offb_node_py" required="true" output="screen"/>
</launch>"PixelFormat": 0
                            }
                        ]
                  }
                },
                "CameraImage": {
                  "CaptureSettings": [
                        {
                        "ImageType": 0,
                        "Width": 800,
                        "Height": 600,
                        "FOV_Degrees": 120,
                        "AutoExposureSpeed": 100,
                        "AutoExposureBias": 0,
                        "AutoExposureMaxBrightness": 0.64,
                        "AutoExposureMinBrightness": 0.03,
                        "MotionBlurAmount": 0,
                        "TargetGamma": 1.0,
                        "ProjectionMode": "",
                        "OrthoWidth": 5.12
                        }
                  ],
                  "X": 0, "Y": 0, "Z": -1,
                  "Pitch": 0, "Roll": 0, "Yaw": 0
                }
            },
            "Sensors":{
                "Magnetometer": {
                  "SensorType": 4,
                  "Enabled": true
                },
                "Barometer":{
                  "SensorType": 1,
                  "Enabled": true,
                  "PressureFactorSigma": 0.0001825
                },
                "Imu": {
                  "SensorType": 2,
                  "Enabled" : true,
                  "AngularRandomWalk": 0.3,
                  "GyroBiasStabilityTau": 500,
                  "GyroBiasStability": 4.6,
                  "VelocityRandomWalk": 0.24,
                  "AccelBiasStabilityTau": 800,
                  "AccelBiasStability": 36
                },
                "Gps": {
                  "SensorType": 3,
                  "Enabled" : true,
                  "EphTimeConstant": 0.9,
                  "EpvTimeConstant": 0.9,
                  "EphInitial": 25,
                  "EpvInitial": 25,
                  "EphFinal": 0.1,
                  "EpvFinal": 0.1,
                  "EphMin3d": 3,
                  "EphMin2d": 4,
                  "UpdateLatency": 0.2,
                  "UpdateFrequency": 50,
                  "StartupDelay": 1
                },
                "Lidar": {
                  "SensorType": 6,
                  "Enabled": true,
                  "NumberOfChannels": 16,
                  "RotationsPerSecond": 10,
                  "PointsPerSecond": 100000,
                  "X": 0, "Y": 0, "Z": -1,
                  "Roll": 0, "Pitch": 0, "Yaw": 0,
                  "VerticalFOVUpper": 10,
                  "VerticalFOVLower": -10,
                  "HorizontalFOVStart": -20,
                  "HorizontalFOVEnd": 20,
                  "DrawDebugPoints": true,
                  "DataFrame": "SensorLocalFrame"
                },
                "DistanceDown": {
                  "SensorType": 5,
                  "Enabled" : true,
                  "MinDistance": 0.1,
                  "MaxDistance": 40,
                  "X": 0, "Y": 0, "Z": -0.5,
                  "Yaw": 0, "Pitch": -90, "Roll": 0,
                  "DrawDebugPoints": true,
                  "ExternalController": true
                }
            },
            "Parameters": {
                "NAV_RCL_ACT": 0,
                "NAV_DLL_ACT": 0,
                "COM_OBS_AVOID": 0
            }
      }
    }
}安装 Micro-XRCE-DDS-Agent

参考链接: Installing the Agent standalone


[*]安装指令
$ git clone https://github.com/eProsima/Micro-XRCE-DDS-Client.git

$ cd Micro-XRCE-DDS-Client

$ mkdir build && cd build

$ cmake ..

$ make -j8

$ sudo make install

$ sudo ldconfig /usr/local/lib/

$ MicroXRCEAgent --help开发流程

参考链接: MAVROS Offboard control example (Python)
yehuo@zyl:~$ mkdir px4_airsim_ros1_ws

yehuo@zyl:~$ cd px4_airsim_ros1_ws

yehuo@zyl:~/px4_airsim_ros1_ws$ mkdir src

yehuo@zyl:~/px4_airsim_ros1_ws$ cd src

yehuo@zyl:~/px4_airsim_ros1_ws/src$ catkin_create_pkg offboard_py rospy

yehuo@zyl:~/px4_airsim_ros1_ws/src$ cd ..

yehuo@zyl:~/px4_airsim_ros1_ws$ catkin build

yehuo@zyl:~/px4_airsim_ros1_ws$ source devel/setup.bash

yehuo@zyl:~/px4_airsim_ros1_ws$ roscd offboard_py

yehuo@zyl:~/px4_airsim_ros1_ws/src/offboard_py$ mkdir scripts

yehuo@zyl:~/px4_airsim_ros1_ws/src/offboard_py$ cd scripts

yehuo@zyl:~/px4_airsim_ros1_ws/src/offboard_py/scripts$ touch offb_node.py

yehuo@zyl:~/px4_airsim_ros1_ws/src/offboard_py/scripts$ chmod +x offb_node.pyoffb_node.py

"""
* File: offb_node.py
* Stack and tested in Gazebo 9 SITL
"""

#! /usr/bin/env python

import rospy
from geometry_msgs.msg import PoseStamped
from mavros_msgs.msg import State
from mavros_msgs.srv import CommandBool, CommandBoolRequest, SetMode, SetModeRequest

current_state = State()

def state_cb(msg):
    global current_state
    current_state = msg


if __name__ == "__main__":
    rospy.init_node("offb_node_py")

    state_sub = rospy.Subscriber("mavros/state", State, callback = state_cb)

    local_pos_pub = rospy.Publisher("mavros/setpoint_position/local", PoseStamped, queue_size=10)

    rospy.wait_for_service("/mavros/cmd/arming")
    arming_client = rospy.ServiceProxy("mavros/cmd/arming", CommandBool)

    rospy.wait_for_service("/mavros/set_mode")
    set_mode_client = rospy.ServiceProxy("mavros/set_mode", SetMode)


    # Setpoint publishing MUST be faster than 2Hz
    rate = rospy.Rate(20)

    # Wait for Flight Controller connection
    while(not rospy.is_shutdown() and not current_state.connected):
      rate.sleep()

    pose = PoseStamped()

    pose.pose.position.x = 0
    pose.pose.position.y = 0
    pose.pose.position.z = 2

    # Send a few setpoints before starting
    for i in range(100):
      if(rospy.is_shutdown()):
            break

      local_pos_pub.publish(pose)
      rate.sleep()

    offb_set_mode = SetModeRequest()
    offb_set_mode.custom_mode = 'OFFBOARD'

    arm_cmd = CommandBoolRequest()
    arm_cmd.value = True

    last_req = rospy.Time.now()

    while(not rospy.is_shutdown()):
      if(current_state.mode != "OFFBOARD" and (rospy.Time.now() - last_req) > rospy.Duration(5.0)):
            if(set_mode_client.call(offb_set_mode).mode_sent == True):
                rospy.loginfo("OFFBOARD enabled")

            last_req = rospy.Time.now()
      else:
            if(not current_state.armed and (rospy.Time.now() - last_req) > rospy.Duration(5.0)):
                if(arming_client.call(arm_cmd).success == True):
                  rospy.loginfo("Vehicle armed")

                last_req = rospy.Time.now()

      local_pos_pub.publish(pose)

      rate.sleep()yehuo@zyl:~/px4_airsim_ros1_ws/src/offboard_py/scripts$ roscd offboard_py

yehuo@zyl:~/px4_airsim_ros1_ws/src/offboard_py$ mkdir launch

yehuo@zyl:~/px4_airsim_ros1_ws/src/offboard_py$ cd launch

yehuo@zyl:~/px4_airsim_ros1_ws/src/offboard_py/launch$ touch start_offb.launchstart_offb.launch

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








<include file="$(find mavros)/launch/px4.launch">
   
   
   
</include>


<node pkg="offboard_py" type="offb_node.py" name="offb_node_py" required="true" output="screen"/>
</launch>yehuo@zyl:~/px4_airsim_ros1_ws/src/offboard_py/launch$ roslaunch offboard_py start_offb.launch
https://img2024.cnblogs.com/blog/3071480/202507/3071480-20250729151618121-792178433.png
流程框架整理


[*]step1: 启动 AirSim
[*]step2: 启动 PX4
yehuo@zyl:~/下载/PX4_Firmware$ make px4_sitl_default none_iris

[*]step3: 启动 DDS
yehuo@zyl:~$ MicroXRCEAgent udp4 -p 8888

[*]step4: 启动 MAVROS (Python版本)
yehuo@zyl:~$ roscoreyehuo@zyl:~$ roslaunch offboard_py start_offb.launch

[*]step5: 查看话题是否成功获取
yehuo@zyl:~$ rostopic list
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: ROS1(20.04 noetic) + PX4 + AirSim