通过与chatGPT之间的交互,让其辅助我进行代码编写

                 +-------------------+
                 |   C++ 控制节点     |
                 | (自主起飞/降落)    |
                 +---------+---------+
                           |
                        ROS Topic
                           |
                    +------v------+
                    |   MAVROS    |
                    +------ +-----+
                           |
                        MAVLink
                           |
                    +------v------+
                    |    PX4      |
                    | 飞控 SITL    |
                    +------+------+
                           |
                     仿真物理接口
                           |
                    +------v------+
                    |   Gazebo    |
                    |  无人机模型  |
                    +-------------+

任务顺序:

  • PX4 仿真启动
  • Gazebo 中生成无人机
  • ROS 与 PX4 通信
  • 查看无人机状态
  • C++ 发布控制指令
  • 自动解锁
  • 自动起飞
  • 定点悬停
  • 自动降落

一、环境配置

使用vmware虚拟机进行操作,系统为ubuntu20.04版本,确保 VMware 能顺利运行 PX4 + Gazebo + ROS,检查 MAVROS 通信是否稳定,创建新的工作空间来存放新的包

二、ROS与MAVROS通信

(1)启动PX4 SITL

cd ~/PX4-Autopilot
make px4_sitl gazebo

  (2)   启动MAVROS

source /opt/ros/noetic/setup.bash

roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"

正常情况下你会看到:

类似:

FCU: connected

这表示:

ROS 已经成功接管 PX4

rostopic echo /mavros/state

如果成功,你会看到类似:

connected: True
armed: False
guided: True
mode: "AUTO.LOITER"

三、编写节点通信代码

cd ~/catkin_ws/src

catkin_create_pkg offboard_pkg roscpp std_msgs geometry_msgs mavros_msgs

打开vscode,在offboard_pkg包下的src文件夹创建offboard_node.cpp

#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
#include <mavros_msgs/State.h>
#include <mavros_msgs/CommandBool.h>
#include <mavros_msgs/SetMode.h>

mavros_msgs::State current_state;

void state_cb(const mavros_msgs::State::ConstPtr& msg)
{
    current_state = *msg;
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "offboard_node");

    ros::NodeHandle nh;

    ros::Subscriber state_sub =
        nh.subscribe<mavros_msgs::State>
        ("/mavros/state", 10, state_cb);

    ros::Publisher local_pos_pub =
        nh.advertise<geometry_msgs::PoseStamped>
        ("/mavros/setpoint_position/local", 10);

    ros::ServiceClient arming_client =
        nh.serviceClient<mavros_msgs::CommandBool>
        ("/mavros/cmd/arming");

    ros::ServiceClient set_mode_client =
        nh.serviceClient<mavros_msgs::SetMode>
        ("/mavros/set_mode");

    ros::Rate rate(20.0);

    while(ros::ok() && !current_state.connected)
    {
        ros::spinOnce();
        rate.sleep();
    }

    geometry_msgs::PoseStamped pose;

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

    for(int i = 100; ros::ok() && i > 0; --i)
    {
        local_pos_pub.publish(pose);

        ros::spinOnce();
        rate.sleep();
    }

    mavros_msgs::SetMode offb_set_mode;

    offb_set_mode.request.custom_mode = "OFFBOARD";

    mavros_msgs::CommandBool arm_cmd;

    arm_cmd.request.value = true;

    ros::Time last_request = ros::Time::now();

    while(ros::ok())
    {
        if(current_state.mode != "OFFBOARD" &&
           (ros::Time::now() - last_request >
            ros::Duration(5.0)))
        {
            if(set_mode_client.call(offb_set_mode) &&
               offb_set_mode.response.mode_sent)
            {
                ROS_INFO("OFFBOARD enabled");
            }

            last_request = ros::Time::now();
        }
        else
        {
            if(!current_state.armed &&
               (ros::Time::now() - last_request >
                ros::Duration(5.0)))
            {
                if(arming_client.call(arm_cmd) &&
                   arm_cmd.response.success)
                {
                    ROS_INFO("Vehicle armed");
                }

                last_request = ros::Time::now();
            }
        }

        local_pos_pub.publish(pose);

        ros::spinOnce();
        rate.sleep();
    }

    return 0;
}

顺便修改Cmakelist.txt文件

add_executable(offboard_node src/offboard_node.cpp)

target_link_libraries(offboard_node
  ${catkin_LIBRARIES}
)

ctrl+s保存,catkin_make进行编译

四、运行

cd ~/PX4-Autopilot
make px4_sitl gazebo

roslaunch mavros px4.launch \
fcu_url:="udp://:14540@127.0.0.1:14557"

source ~/catkin_ws/devel/setup.bash

rosrun offboard_pkg offboard_node

你会看到:

OFFBOARD enabled
Vehicle armed

然后:

无人机自动起飞到2米

个人学习总结,内容含AI生成,仅供参考

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐