文章目录
- 前言
- 应用mavros控制无人机消息流
- 以mavros中setpoint_position/local为例子
- 1:确定话题的功能和消息类型
-
- 2:确定话题并最终找到转化为uorb消息
- 官方example offboard例程仿真与解析
- 确定任务需要用到的mavros话题名称与消息类型(阅读[官方文档](http://wiki.ros.org/mavros#mavros.2FPlugins.setpoint_position))
- 头文件需要包含所需要用到的消息类型.h文件
- 此处应用了mavros,应编译安装(我用的源码安装)
- 编写
前言
mavros消息的订阅和发布.
应用mavros控制无人机消息流
以mavros中setpoint_position/local为例子
1:确定话题的功能和消息类型
在http://wiki.ros.org/mavros下,可以看到对应的mavros消息.
找到setpoint_position/local
[1]直接阅读mavros中的说明
[2] (如果mavros说明不详细)阅读mavros源码找到对应的mavlink协议
[3] (这一步必须要做)查询对于的mavlink协议,阅读该协议的说明文档
如果快速找到对应的mavlink消息
(1):打开官网:http://mavlink.io/zh/messages/common.html
(2):按下ctrl+t会出现关键词查询
(3):输入刚刚在mavros消息下的mavlink协议(在本例子中是SET_POSITION_TARGET_GLOBAL_INT)
(4):输入进去,按回车查询
2:确定话题并最终找到转化为uorb消息
(1):打开官网:https://dev.px4.io/v1.10_noredirect/zh/concept/architecture.html
(2):打开中间件,可以查看相应的资料
(3)阅读px4的mavlink源码了解话题如何最终转化为uorb消息
(如果没有下载则去下载PX4固件)打开PX4固件下的src/modules/mavlink/mavlink_receiver.cpp和mavlink_receiver.h文件(不知道路径一不一样,不一样的话可以在文件下查询)
这个就mavlink解析数据,是根据ID判断消息类型.ID就是#后的数字,如:
然后接受完数据,就通过handle_message函数进行处理,最终转化为uorb消息
官方example offboard例程仿真与解析
这里会用到ROS消息类型中的服务,可以看我另篇文章,这里不加赘述.
确定任务需要用到的mavros话题名称与消息类型(阅读官方文档)
头文件需要包含所需要用到的消息类型.h文件
这里我的工作空间名为catkin_1,运行代码的时候改成你的工作空间名称
cd ~/catkin_1/src
catkin_create_pkg offboard_pkg roscpp rospy std_msgs geometry_msgs mavros_msgs
新建offb_node.cpp文件,include头文件
#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
#include <mavros_msgs/CommandBool.h>
#include <mavros_msgs/SetMode.h>
#include <mavros_msgs/State.h>
此处应用了mavros,应编译安装(我用的源码安装)
下载
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
git clone https://github.com/mavlink/mavros.git
git clone --recurse-submodules -b release/noetic/mavlink https://github.com/mavlink/mavlink-gbp-release.git
cd mavros
git checkout -b 1.13.0 1.13.0
编译
cd ~/catkin_ws
catkin build
mavros一定要用catkin_build,不用catkin_make
下面的操作是因为我自己的原因,可以忽略:
因为我mavros和我功能包工作空间不同,因此需要在vscode中设置IncludePath
在c_cpp_properties.json编辑:
“/home/khs/catkin_ws/devel/include/**”,
编写
转载于 参考
#include <ros/ros.h>
#include <geometry_msgs/PoseStamped.h>
#include <mavros_msgs/CommandBool.h>
#include <mavros_msgs/SetMode.h>
#include <mavros_msgs/State.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, "offb_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;
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)