ROS综合应用(一)树莓派外部控制 Pixhawk(一站到底)
https://blog.csdn.net/weixin_41869763/article/details/104258058
ubuntu20.04配置marvos+px4+XTDrone
https://blog.csdn.net/weixin_42301220/article/details/117845212
官网
https://docs.px4.io/main/en/companion_computer/pixhawk_companion.html
https://docs.px4.io/v1.12/zh/flight_modes/offboard.html
技术分享 | P450-详解室内外指点飞行来啦
https://zhuanlan.zhihu.com/p/364475780
通过MAVROS连接机载电脑(NANO/TX2/NX)与Pixhawk
https://zhuanlan.zhihu.com/p/364390798
一、系统环境
软硬件名称 版本 备注
树莓派 Raspberry Pi 3B 无
树莓派操作系统 Ubuntu 16.04 MATE 无
树莓派和笔记本 ROS (Melodic) 和 MAVROS Moledic 似乎只支持Ubuntu18.04 及以上
树莓派和笔记本 python 要默认为 python2 不然安装 ROS 会有问题
飞控 Pixhawk 2.4.8 无
飞控固件版本 PX4 v1.8.2 (stable) 要自己编译下载(不要怕,此文一一道来)
笔记本操作系统 Ubuntu 18.04 编译固件,相传 Windows编译源码很慢
笔记本关键软件 QGroundControl v3.5.6 用于设置飞控 TELEM波特率
笔记本关键软件 putty 用于远程登录树莓派
其他硬件 USB转TTL 和无人机TELEM 2 通信时需要
假设你已经完成以上软硬件安装,注意QGC 使用的最新PX4 固件为 v1.10.1 ,找不到下面的 SYS_COMPANION 参数,不知为何,就是不行,程序卡在自己编写的第一个 while() 循环里。至于如何下载自己想要的版本,下次专门说.
测试环境
电脑
联想笔记本ubuntu20
jetson nx ubuntu18
飞控
飞控 Pixhawk 2.4.8
飞控固件版本 未知
其他硬件 USB转TTL 和无人机TELEM 2 通信时需要
硬件链接
使用USB转TTL 连接树莓派 与Pixhawk 的TELEM 2 端口 ,TELEM 2 输入电压为5V, USB转TTL使用5V的。
飞控板 TELEM2 字是正的,那么从左到右六个接口分别为:
5V TX RX 无用 无用 GND
最好用胶枪缝一下,不然线容易开
1线(这个线头插进去有点紧并不是完全适配的)
带锁扣GH1.25转杜邦2.54mm端子线转接线2P3P4P5P6P飞控无人机线束
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.45292e8diJM0gM&id=673456981205&_u=n1qf7bf531a8![]()
2 线2 插头刚刚好,但是没有转杜邦线的
V3数传连接线 电流计线 apm PIX飞控电源模块线6p对6p硅胶 xh1.25
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.45292e8diJM0gM&id=547108606536&_u=n1qf7bf564a6
2 USB-ttl软件链接
Ubuntu20.04 noetic
Ubuntu18.04 melodic
Ubuntu16.04 kinetic
Ubuntu14.04 indigo1、树莓派设置(完全可以先用笔记本测试)
在树莓派上,需要新增一个 ROS 程序包,然后这个包里添加自己读取的程序。
安装MAVROS,此处使用二进制安装(比官网推荐的源安装方便很多)
sudo apt-get install ros-noetic-mavros ros-noetic-mavros-extras ros-noetic-control-toolbox
安装地理数据集
sudo /opt/ros/noetic/lib/mavros/install_geographiclib_datasets.sh
最后一步请耐心等待,我大概等待了20分钟左右。
创建程序包
12345678创建 /catkin_ws/src
cd /catkin_ws
编译
catkin_make
创建工程
cd ~/catkin_ws/src
catkin_create_pkg offb geometry_msgs mavros roscpp
#程序包名称 pi_offboard_px4,依赖的包 geometry_msgs, mavros 和 roscpp
添加 .cpp 文件及必要修改
12cd offb/src
sudo gedit offb_node.cpp
添加以下来自 PX4官方教程的MAVROS控制例程:
123// 飞行模式
// GUIDED_NOGPS AVOID_ADSB THROW BRAKE POSHOLD AUTOTUNE FLIP
// SPORT DRIFT OF_LOITER LAND POSITION CIRCLE RTL LOITER GUIDED AUTO ALT_HOLD ACRO STABILIZE
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990/**
* @file offb_node.cpp
* @brief Offboard control example node, written with MAVROS version 0.19.x, PX4 Pro Flight
* Stack and tested in Gazebo SITL
*/
#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"
);
//the setpoint publishing rate MUST be faster than 2Hz
ros::Rate rate(20.0);
// wait for FCU connection
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;
//send a few setpoints before starting
for
(
int
i = 100; ros::ok() && i > 0; --i){
local_pos_pub.publish(pose);
ros::spinOnce();
rate.sleep();
}
// 飞行模式
// GUIDED_NOGPS AVOID_ADSB THROW BRAKE POSHOLD AUTOTUNE FLIP
// SPORT DRIFT OF_LOITER LAND POSITION CIRCLE RTL LOITER GUIDED AUTO ALT_HOLD ACRO STABILIZE
mavros_msgs::SetMode offb_set_mode;
offb_set_mode.request.custom_mode =
"GUIDED"
;
//
mavros_msgs::CommandBool arm_cmd;
arm_cmd.request.value =
true
;
ros::Time last_request = ros::Time::now();
while
(ros::ok()){
if
( current_state.mode !=
"GUIDED"
&&
(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(
"GUIDED 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;
}
注:如果手写以上内容,很可能出错,编译产生
Invocking "make -j4 -l4" failed
,请根据错误多次排查。接下来修改 CMakeLists.txt 以便编译。
取消注释/修改文本,得到如下两句:
1234add_executable(offb src/offb_node.cpp)
target_link_libraries(offb
${catkin_LIBRARIES}
)
完整的CMakeLists.txt
12345678910111213141516171819202122232425262728cmake_minimum_required(VERSION 3.0.2)
project(offb)
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
mavros
roscpp
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES offb
# CATKIN_DEPENDS geometry_msgs mavros roscpp
# DEPENDS system_lib
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
add_executable(offb src/offb_node.cpp)
target_link_libraries(offb
${catkin_LIBRARIES}
)
完整的package.xml
1234567891011121314151617181920212223242526272829<?xml version=
"1.0"
?>
<package format=
"2"
>
<name>offb</name>
<version>0.0.0</version>
<description>The offb package</description>
<maintainer email=
"dongdong@todo.todo"
>dongdong</maintainer>
<license>TODO</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>geometry_msgs</build_depend>
<build_depend>mavros</build_depend>
<build_depend>roscpp</build_depend>
<build_export_depend>geometry_msgs</build_export_depend>
<build_export_depend>mavros</build_export_depend>
<build_export_depend>roscpp</build_export_depend>
<exec_depend>geometry_msgs</exec_depend>
<exec_depend>mavros</exec_depend>
<exec_depend>roscpp</exec_depend>
<!-- The export tag contains other, unspecified, tags -->
<export>
<!-- Other tools can request additional information be placed here -->
</export>
</package>
编译
1catkin_make
1 2 3 | catkin_make #编译 catkin_make install source devel/setup.bash #配置catkin 工作空间 |
测试
这个过程需要树莓派打开几个终端,可以多登录几个 putty 实现。
1开启ros
在一个终端中运行 roscore
,启动 ROS。
1 | roscore |
2开启通信节点
用途:接受本机ros节点接受程序指令,转换成飞控协议数据,串口转发给飞控。
首先给与串口权限,允许串口USB启用。
https://www.cnblogs.com/gooutlook/p/16494885.html
临时给与一次
1 | sudo chmod 777 /dev/ttyUSB0 |
永久性 dongdong 当前用户名根据电脑修改 相当于把川口所在的dialout组加入到管理员dongdong的用户下
1 | sudo usermod -aG dialout dongdong |
然后在另一个终端中运行
1 2 3 | ls /dev/tty* # 下面两句只运行一句即可(根据有 ttyUSB0 还是 ttyACM0) roslaunch mavros px4.launch fcu_url:=/dev/ttyUSB0:57600 #有ttyUSB0 roslaunch mavros px4.launch fcu_url:=/dev/ttyACM0:57600 #有ttyACM0 |
报错 原因(不是编译报错)
1 找不到offboard模式,看来我这个固件版本没有这个模式。
2 我尝试切换到guidece和guideceNogps模式也会有别的报错,是遥控器没开的原因。
指示灯是黄色(遥控器没开)
guideceNogps模式 遥控器打开,灯变蓝色了,正常的截图
3 程序控制节点
用途:使用自定义的程序给ros话题发布控制命令,然后控制飞机。
再在另一个终端运行 程序控制节点
1 2 | source devel/setup.bash rosrun offb offb |
判断是否进入指定模式,进入的话解锁飞机,进入解锁模式的旋转
可以看到飞机电机转动解锁。
更改GUIDED模式,重新编译测试
此时还可以再另一个终端运
1 2 | rostopic list rostopic echo /mavros/altitude |
查看当地海拔高度。当然,如果在 offboard_pi_node.cpp 里添加这些话题,也直接能够读取处理打印。
运行效果如下图
软件1
ubuntu mate 18.04官网下载,烧录及安装 SSH VNC ROS MAVROS librealsense realsense-ros vision_to_mavros(我自己亲自弄的)
https://blog.csdn.net/sinat_16643223/article/details/108032651?spm=1001.2014.3001.5502
软件2
基于单目视觉的四旋翼定点降落——如何通过mavros控制pixhawk(二)(这个我觉得讲得很详细)(2021.3.1现在回看发现也是对PX4官方手册里mavros-offboard代码的讲解)
https://blog.csdn.net/sinat_16643223/article/details/107589052?spm=1001.2014.3001.5502
软件3
MAVROS功能包的offboard模式控制例子
https://blog.csdn.net/weixin_44917390/article/details/106339339?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-106339339-blog-107589052.pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-106339339-blog-107589052.pc_relevant_multi_platform_whitelistv3&utm_relevant_index=1
主要过程:
要先解锁无人机,在切换无人机到offboard模式。 我们每隔五秒去检查一下与飞控的连接等是否一切正常。 在同一个循环中,我们按照指定的频率持续发送期望点信息给飞控。
软件4
offboard代码超详细注释
https://blog.csdn.net/zouxu634866/article/details/104095648?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-104095648-blog-106339339.pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1-104095648-blog-106339339.pc_relevant_multi_platform_whitelistv3&utm_relevant_index=1
硬件1
图文并茂详细教程之--用pixhawk飞控组装一台F450四轴无人机(上)
https://blog.csdn.net/sinat_16643223/article/details/106981400
图文并茂详细教程之——用pixhawk飞控组装一台S500四轴无人机(上)图文并茂详细教程之——用pixhawk飞控组装一台S500四轴无人机(中)图文并茂详细教程之——用pixhawk飞控组装一台S500四轴无人机(下)
硬件2
快速搭建一个APMT265树莓派无人机
https://blog.csdn.net/sinat_16643223/article/details/108354556?spm=1001.2014.3001.5502
https://blog.csdn.net/weixin_41869763/article/details/104258058
启动命令(我在B站上专门录了视频 APM T265 树莓派,SSH启动树莓派三个节点视频演示,实现T265的位置信息传给APM_哔哩哔哩_bilibili)
树莓派数据线(也是USB转TTL线,插在Pixhawk的telem2口,苍穹四轴有卖,下面这两根线是接在一起的,是一根线)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2020-07-20 热成像
2019-07-20 (知识点4)C++ 中vector