第一次通过通讯节点连接实现无人机仿真模拟(ROS1 + C++ + PX4)
通过与chatGPT之间的交互,让其辅助我进行代码编写|C++ 控制节点|| (自主起飞/降落)|ROS TopicMAVLink| 飞控 SITL|仿真物理接口|无人机模型|
通过与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生成,仅供参考
更多推荐




所有评论(0)