ROS综合应用(一)树莓派外部控制 Pixhawk(一站到底)

2023-05-16


序言


上一次 说到学习 ROS,主要是因为在做多无人机协同控制项目。听说可以使用 ROS 来实现树莓派控制 Pixhawk 无人机,这样可以不用修改飞控源码,而且可以用树莓派做图像处理。于是开始了一场浩浩荡荡的西行,可奈何刚翻过几座山,又越过几条河,妖魔鬼怪怎么这么多。不过一条总结是多去官网,博客鱼龙混杂,而且很多时候版本不合,不可使用。

折腾了好久好久,终于完成了环境搭建,后面也测试成功,因此想记录一下。
注:初学外部控制时,请勿挂上螺旋桨,否则很危险!!!


一、系统环境


软硬件名称版本备注
树莓派Raspberry Pi 3B
树莓派操作系统Ubuntu 16.04 MATE
树莓派和笔记本ROS (Melodic) 和 MAVROSMoledic 似乎只支持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() 循环里。至于如何下载自己想要的版本,下次专门说.


二、飞控板设置


飞控板的主设置主要实现下载固件 v1.8.2 (stable)

2.1 登出再重新登入用户

sudo usermod -a -G dialout $USER

然后Ubuntu18.04 就是右上角注销,然后再登陆。
账户设置
2.2 克隆飞控源码

 git clone https://github.com/PX4/Firmware.git		# 下载源码
 git tag											# 查看发行版本
 git checkout v1.8.2  								# 选择需要的版本

2.3 搭建编译环境

安装必须环境,有问题请参考 PX4 Developer Guide

首先下载 ubuntu_sim_common_deps.sh,直接点进去复制里面内容或者 wget 下载皆可尝试,有时会连接不上,然后运行,这里面相当于把许多 shell 指令集合在一起,一次性安装完成。

# 下载 ubuntu_sim_common_deps.sh
wget https://raw.githubusercontent.com/PX4/Devguide/v1.9.0/build_scripts/ubuntu_sim_common_deps.sh
bash ubuntu_sim_common_deps.sh

2.4 编译与上传

Pixhawk 对应的固件在这里。我的是 Pixhawk2.4.8,也就是Pixhawk2,因此选择 px4fmu-v3_default

make px4fmu-v3_default								# 编译(第一次还会下载很多模块,耐心等待)
make px4fmu-v3_default upload						# 编译上传

此时连上飞控,就可以下载,正常的话会得到如下界面:
PX4编译效果

2.5 使能外部控制

如果传感器这些没有校正,请先校正,遥控器和飞行模式可以不用管。然后继续往下。

搜索参数 RC_MAP_OFFB_SW,设置为 Channel1

参数设置1

同样的方式,设置 SYS_COMPANION 为 57600

然后重新拔插,使设置有效。


三、树莓派设置(完全可以先用笔记本测试)


在树莓派上,需要新增一个 ROS 程序包,然后这个包里添加自己读取的程序。这一步骤与 ROS学习笔记(二)——文件系统、创建并编译程序包 的 2.2 创建ROS程序包 的步骤基本一致,如下:

3.1 配置环境

安装MAVROS,此处使用二进制安装(比官网推荐的源安装方便很多)

sudo apt-get install ros-kinetic-mavros ros-kinetic-mavros-extras ros-kinetic-control-toolbox

安装地理数据集

sudo /opt/ros/kinetic/lib/mavros/install_geographiclib_datasets.sh		# 可能会有点慢,耐心等待

3.2 创建程序包

cd ~/catkin_ws/src
catkin_create_pkg offb geometry_msgs mavros roscpp
#程序包名称 pi_offboard_px4,依赖的包 geometry_msgs, mavros 和 roscpp

3.3 添加 .cpp 文件及必要修改

cd offb/src
touch offb_node.cpp
vim offb_node.cpp

添加以下来自 PX4官方教程的MAVROS控制例程:

/**
 * @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();
    }

    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;
}

注:如果手写以上内容,很可能出错,编译产生Invocking "make -j4 -l4" failed,请根据错误多次排查。

接下来修改 CMakeLists.txt 以便编译。

cd ~/catkin_ws/src/offb/
vim CMakeLists.txt

取消注释/修改文本,得到如下两句:

add_executable(offb src/offb_node.cpp)
target_link_libraries(offb
	${catkin_LIBRARIES}
)

3.4 编译

catkin_make 				#编译
catkin_make install
source devel/setup.bash     #配置catkin 工作空间

四、连接测试(完全可以先用笔记本测试)


4.1 连接

使用USB转TTL 连接树莓派 与Pixhawk 的TELEM 2 端口 ,TELEM 2 输入电压为5V, USB转TTL使用5V的。

飞控板 TELEM2 字是正的,那么从左到右六个接口分别为:

5V TX RX 无用 无用 GND

实物连接图如下,从Pixhawk到树莓派的线的真实连接为:红-紫,白-灰,黑-绿,黄-蓝。

4.2 测试

这个过程需要树莓派打开几个终端,可以多登录几个 putty 实现。
在一个终端中运行 roscore ,启动 ROS。

roscore

在另一个终端中运行

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

再在另一个终端运行

rosrun offb offb_node

此时还可以再另一个终端运行

rostopic list
rostopic echo /mavros/altitude

查看当地海拔高度。当然,如果在 offboard_pi_node.cpp 里添加这些话题,也直接能够读取处理打印。

运行效果如下图

在这里插入图片描述


参考连接:PX4 无人机MAVROS 外部控制教程


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS综合应用(一)树莓派外部控制 Pixhawk(一站到底) 的相关文章

  • element 树形表格报Error: for nested data item, row-key is required

    element树形表格报以上这个错 xff0c 按网上的说法改 roke key 去掉element版本号前的 都不行 xff0c 最后发现在每条数据里加上一个id属性就可以了 xff0c 我数据本身没有id这个字段
  • Js 中的定时器

    定时器 前言一 定时器二 定时器具体内容三 定时器实例总结 前言 通过定时器自动的做一些事情 xff0c 例如发送网络请求 一 定时器 定时器 xff1a 定时器可以设定时间自动的做某件事情 定时器是一种方法 xff0c 不是对象 xff0
  • 【面经】常见机考类型汇总

    一 筑基篇 xff08 掌握数组 xff0c 字符串操作等基本操作 xff09 1 数组 目标 xff1a 掌握数组的正序遍历 xff0c 逆序遍历 xff0c 数组的排序等 典型例题 xff1a 提取不重复的整数 牛客题霸 牛客网 2 字
  • ONOS架构中的YANG、P4 Runtime

    本文总结自毛健炜的 ONOS架构中的YANG P4 Runtime 的演讲 ONOS xff0c 全称是开放网络操作系统 xff0c 通常以控制器的身份为人所知 它是由ON LAB组织发起的一个开源项目 xff0c 在与ONF组织合并之后
  • PID控制算法的原理剖析

    我的微信公众号 xff08 ID xff1a 00后开发者 xff09 从00后的角度出发 xff0c 专注但不局限于分享电气 嵌入式 机器视觉以及芯片行业的算法 技术文章和最新资讯 如果想查看更多内容 xff0c 可以关注我的微信公众号
  • flask 报错 sqlalchemy.exc.ArgumentError: Mapper mapped class BaseModel->base_model could not assemble

    报错信息 sqlalchemy exc ArgumentError Mapper mapped class BaseModel gt base model could not assemble any primary key columns
  • rospy-编写简单的服务端和客户端

    最近一直在实习公司做课程 xff0c 记录一些笔记和自己写的代码 基础知识和代码解释参考wiki 创客制造和其他博客 xff0c 侵删 背景知识 服务 service ROS中的通信方式有四种 主题 topic 服务 service 参数服
  • 树莓派 3B+ 蓝牙无法使用问题

    最近想用树莓派3B 43 做个小玩意 xff0c 结果发现蓝牙功能不可用 xff0c 图标消失且不能发现设备 xff0c 几乎试了网上所有方法都不行 最后参考了这个帖子恢复了蓝牙功能 xff1a SOLVED Bluetooth icon
  • 电源管理芯片之 Regulator用法。

    有问题请加 xff1a Q群 xff1a 241359063 共同走向创业学习之旅 原创 xff1a kylin zeng http blog chinaunix net uid 23795897 html 转载请注明原创出处 xff0c
  • 如何查看ssh登录日志信息

    less var log secure grep 39 Accepted 39 正常登录日志信息 正常退出 密码错误登录 三次密码登陆失败 输入密码时 xff0c 主动退出 为了安全期间 xff1a 我们只允许xxx xxx xxx xxx
  • C语言笔记-25-网络-TCP网络编程

    C语言笔记 25 网络 TCP网络编程 文章目录 C语言笔记 25 网络 TCP网络编程前言一 TCP编程模型概括二 inet工具htonlinet pton 三 TCP编程模型代码TCP服务端TCP客户端 总结 前言 自学笔记 xff0c
  • Failed to load nodelet [/camera/realsense2_camera] of type [realsense2_camera/RealSenseNodeFactory]

    输入 xff1a roslaunch realsense2 camera rs rgbd launch 报错 xff1a 报错原因 xff1a 是找不到realsense2 camera包 xff0c 在安装D435的包时 xff0c 以为
  • 十七、基于软核和CAN搭建FPGA在线升级系统设计

    1 系统搭建 系统主要包含 xff1a MicroBlaze软核处理器 xff0c Axi Can控制器 xff0c Axi lite user用户通信接口 xff0c MIG DDR3控制器 xff0c 中断控制器等 设计使用Can接收上
  • 【OpenCV】cv::Mat位深和通道,CV_8UC1等

    位深 每个像素由多少位来存储 是一个精度问题 xff0c 一般图片是8bit xff08 位 xff09 的 xff0c 则深度是8 通道 每个像素点能存放多少个数 类似于RGB彩色图中的每个像素点有三个值 xff0c 即三通道 一个图像的
  • darknet_ros编译报错以及在RVIZ中显示乱码

    最近在arm平台上部署 darknet ros 出现了一些错误 xff0c 这里记录一下 首先在ARM平台上部署和在AMD平台上部署是不同的 xff0c 首先应该考虑算力问题 xff0c 在ARM下 xff0c 加载yolov3 weigh
  • 萌新改代码系列(一)--VINS+GPS

    VINS与GPS组合 距离上次写博客过去了快一年了 xff0c 这一年来我一直忙于与SLAM方向几乎没有关系的科研工作 xff0c 说来惭愧 xff0c 最终也没研究出个啥 最近得空 xff0c 就把我之前开源的代码整理了一下 xff0c
  • GVINS论文阅读(VINS-MONO + gnss 紧耦合)

    原文 x1f517 https arxiv org pdf 2103 07899 pdf github x1f517 https github com HKUST Aerial Robotics GVINS 港科大 沈老师团队 在vins
  • 萌新学VINS-Fusion(一)------特征跟踪

    VINS FUSION代码心得 新人小白 xff0c 第一次写博客 xff0c 主要相当于自己做一个关于学习VINS的笔记 xff0c 不喜勿喷 xff0c 转载请注明出处 其实我之前也尝试着在VINS MONO基础上改写双目的 xff0c
  • 萌新学VINS-Fusion(二)------初始化

    最近在忙别的事情 xff0c 博客迟迟没更新 xff0c 现在终于放假了 xff0c 今天把初始化部分来分析一下 源码 xff1a https github com HKUST Aerial Robotics VINS Fusion pro
  • c 语言中 %d,%lu等区别

    转载至 xff1a http blog sina com cn s blog 7d94c35c01019f96 html d 有符号10进制整数 ld 长整型 hd短整型 hu 无符号短整形 u无符号整形 lu无符号长整形 i 有符号10进

随机推荐

  • 萌新学VINS-Fusion(三)------双目和GPS融合

    虽然要过年了 xff0c 而且每天还要在家里小店打工 xff0c 但是网红之路不能停对吧 xff0c 这篇博客写关于VINS Fusion和GPS的融合 其实我之前改出过一个加了GPS的VIO xff0c 并且也开源了 xff0c 之前没有
  • nuxt cookie-universal-nuxt 搭配 vuex-persistedstate 做数据持久化

    前言 因为服务端不存在 Local Storage 和 Session Storage 所以 便使用了 cookie universal nuxt 这个插件 在做Nuxt项目的时候 发现Vuex 在刷新页面后 储存的数据丢失 用 vuex
  • ROS学习(一):Navigation中GNSS与IMU数据融合定位

    1 参考博客 主要参考以下博客 感谢各位博主的分享 link https blog csdn net qinqinxiansheng article details 107108475 utm medium 61 distribute pc
  • msOS学习之路(1)

    msOS学习之路 xff08 1 xff09 1 msOS的初步认识 刚刚拿到msOS开发板的时候 xff0c 看了一下开发板 xff0c 感觉非常高端 xff0c 再看一下芯片 xff0c 用的是stm32 当时我就觉得我得先学习stm3
  • msOS学习之路(2)

    基于msOS自动回火机的实现 1 简介 1 1 背景 基于msOS自动回火机的实现的实例是学习msOS比较好的入门实例 xff0c 它包括msOS界面的设计 数据库的使用 系统节拍的使用 按键的使用 系统节拍使用等 xff0c 通过这个例子
  • msOS学习之路(4)

    设备层简单理解 1 设备层相关定义 设备层的相关定义是在device h文件中定义的 xff0c 包括按键 模拟量输入 数字量输入 输出枚举或者类型定义等 xff0c 对于一些结构体的理解 xff0c 例如 xff1a ADC结构体 xff
  • 【STM32】STM32CubeIDE HAL库Ring-buffer例程

    板子G474RE STM32HAL库Ring buffer使用 注意 xff1a HAL库中 xff0c 中断每执行一次 xff0c 就关闭 xff0c 所以需要重新开启中断 第一次开启在main函数中 HAL UART Receive I
  • 【ROS】多机协同ROS安装使用

    目录 通信框架ROS 安装ROS 测试ROS 控制协同 协同感知 通信框架ROS ROS是一种分布式软件框架 xff0c 节点之间通过松耦合的方式进行组合 xff0c 在很多应用场景下 xff0c 节点可以运行在不同的计算平台上 xff0c
  • 【无人机】PX4,ROS,Ubuntu20仿真运行

    参考 xff1a https docs px4 io master en ros mavros installation html https docs px4 io master en dev setup dev env linux ub
  • 【无人机】PX4,源码简要分析

    看看源码目的很单纯 xff0c 就是想有没有控制方面的代码可以移植到其它地方 无人机 PX4 xff0c ubuntu18仿真运行 从官网可能下载代码不全 xff0c 这是编译完成的源码 xff0c 有点大 xff01 xff01 xff0
  • 内核层读写应用层文件,使用filp_open函数。

    转载 xff1a http soft chinabyte com os 421 11398421 shtml 有时候需要在Linux kernel 大多是在需要调试的驱动程序 中读写文件数据 在kernel中操作文件没有标准库可用 xff0
  • 怎样去理解异常SVC和PendSV

    目录 什么是SVC和PendSV 什么是SVC和PendSV SVC xff08 系统服务调用 xff09 和 PendSV xff08 可悬挂系统调用 xff09 它们多用于在操作系统之上的软件开发中 SVC 用于产生系统函数的调用请求
  • vscode开发ROS基本配置订阅PX4中imu数据

    目录 安装vscode Linux版本 安装vscode插件 配置头文件路径 订阅PX4中imu数据 参考 xff1a ROS基本操作 ROS中订阅节点消息测试 ROS下如何订阅任意话题 步步清风皆是你的博客 CSDN博客 安装vscode
  • 执行 install_geographiclib_datasets.sh 错误!

    执行 install geographiclib datasets sh 错误 xff01 原因被墙 xff01 解决 xff1f Ubuntu 18 04 在 usr share 下目录新建 GeographicLib 目录 先将 geo
  • ubuntu查看文件依赖、安装libopencv

    ubuntu查看文件依赖 安装libopencv 1 ubuntu中 xff0c 当需要查看某个文件运行时 xff0c 需要那些依赖库时 xff0c 可以在终端输入指令 ldd name name为文件名字 2 出现libopencv相关依
  • VNC远程连接不上ubuntu服务器,显示time out

    原因 xff1a 可能是出现了wired unmanaged并且启动不了屏幕共享 xff08 screen sharing xff09 xff0c 即开关打不到on上面 解决方案1 xff1a https askubuntu com que
  • OpenCV(三):一步步实现图像定位(Python版)

    一 预期目标 如下图 xff0c 要识别图中的国旗 xff0c 然后框选出来 xff0c 并且返回国旗的中心位置 xff0c 效果如下 彩色图像大小 400 264 目标中心位置 225 218 二 准备工作 1 将下面的图像另存为在本地
  • PX4教程翻译(1)序+前言

    序 最近打算实现树莓派控制 Pixhawk 无人机 xff0c 做了近一个星期 xff0c 还是没有成功 由于没有系统的中文教程 xff0c 零散地看了许多博客 正如万山圈子里 xff0c 一山放过一山拦 各种Bugs层出不穷 于是决心静心
  • raise ResourceNotFound(name, ros_paths=self._ros_paths) ResourceNotFound: gazebo_ros

    电脑为Ubuntu16 04 xff0c 安装来ROS xff08 kinetic版本 xff09 和 gazebo xff08 9版本 xff09 xff0c 在做PX4固件仿真 xff0c 想实现外部控制Pixhawk xff0c 但是
  • ROS综合应用(一)树莓派外部控制 Pixhawk(一站到底)

    序言 上一次 说到学习 ROS xff0c 主要是因为在做多无人机协同控制项目 听说可以使用 ROS 来实现树莓派控制 Pixhawk 无人机 xff0c 这样可以不用修改飞控源码 xff0c 而且可以用树莓派做图像处理 于是开始了一场浩浩