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分钟左右。
创建程序包
创建 /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 文件及必要修改
cd offb/src sudo gedit offb_node.cpp
添加以下来自 PX4官方教程的MAVROS控制例程:
// 飞行模式 // GUIDED_NOGPS AVOID_ADSB THROW BRAKE POSHOLD AUTOTUNE FLIP // SPORT DRIFT OF_LOITER LAND POSITION CIRCLE RTL LOITER GUIDED AUTO ALT_HOLD ACRO STABILIZE
/** * @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 以便编译。
取消注释/修改文本,得到如下两句:
add_executable(offb src/offb_node.cpp) target_link_libraries(offb ${catkin_LIBRARIES} )完整的CMakeLists.txt
cmake_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
<?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>编译
catkin_make
catkin_make #编译 catkin_make install source devel/setup.bash #配置catkin 工作空间
测试
这个过程需要树莓派打开几个终端,可以多登录几个 putty 实现。
1开启ros
在一个终端中运行 roscore
,启动 ROS。
roscore
2开启通信节点
用途:接受本机ros节点接受程序指令,转换成飞控协议数据,串口转发给飞控。
首先给与串口权限,允许串口USB启用。
https://www.cnblogs.com/gooutlook/p/16494885.html
临时给与一次
sudo chmod 777 /dev/ttyUSB0
永久性 dongdong 当前用户名根据电脑修改 相当于把川口所在的dialout组加入到管理员dongdong的用户下
sudo usermod -aG dialout dongdong
然后在另一个终端中运行
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话题发布控制命令,然后控制飞机。
再在另一个终端运行 程序控制节点
source devel/setup.bash rosrun offb offb
判断是否进入指定模式,进入的话解锁飞机,进入解锁模式的旋转
可以看到飞机电机转动解锁。
更改GUIDED模式,重新编译测试
此时还可以再另一个终端运
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口,苍穹四轴有卖,下面这两根线是接在一起的,是一根线)
sudo usermod -aG dialout dongdong