今日心语:遇到困难不抱怨,遇到奇葩不争论!
学习目标:
(1)一个月内学会QGC地面站开发;
(2)今年结束之前发表一篇文章;
(3)半年内解决多无人机分布式控制问题。
今日学习工作内容:
- QGC地面站使用介绍和开发接口
- 阅读ROS机器人编程实践
- 中午练习演讲–会做事也要会讲话!
- 整理版面费报销材料
- 跑步三公里
1、 QGC地面站使用介绍和开发接口 -1
QGC地面站前期已有一定的使用基础,但当前地面站无法同时连接多架无人机进行控制,所以开发具有多机同时控制的地面站对于后续多机分布式控制具有重要意义。本学习内容主要参考B站UP主胡萝卜科技的视频教程,但愿学习过程顺利!
QGC地面站界面主要由三大部分组成:菜单栏、任务栏、主显示区域,如下图所示:
其中:
- 菜单栏:File用于使能日志回放功能及手动退出操作,Widget包含了HIL(硬件在环仿真),和MAVLink INspector(mavlink数据波形显示)等控件功能。
- 任务栏:实现地面站的日志回放。
- 主显示区域: 支持不同的页面进行展示(左上角是页面切换按钮)。
对于主显示区域,由左上角的五个功能按钮来切换功能显示区域:
图2 QGC地面站主要功能按钮
包含所有切换按钮的顶部一行称为主工具栏(MainToolBar),五个功能按钮从左至右依次为:
AppSettings
:App Settings页面,用于设置页面色彩、通讯连接、离线地图等软件设置功能,如下图所示:
图3 QGC地面站AppSetting页面
- SetupView: Setup页面,用于机架选择、固件下载、参数修改、传感器校准等功能:如下图所示:
图4 QGC地面站系统设置页面
- PlanView:飞行规划页面,用于规划飞行航线:
图5 QGC地面站飞行规划页面
- FlightDisplay: 飞行状态显示页面
图5 QGC地面站飞行状态显示页面
- AnalyzeView: 分析页面,用于下载飞行日志、控制台调试等:
图5 QGC地面站AnalyzeView页面
这些页面包括工具栏均由qml文件绘制生成的,即: AppSettings.qml、SetupView.qml、PlanView.qml、FlightDisplay.qml、AnalyzeView.qml、MainToolBar.qml
,统一在MainRootWindow.qml
文件中加载:
//-------------------------------------------------------------------------
/// Settings
Loader {
id: settingsWindow
anchors.fill: parent
visible: false
source: "AppSettings.qml"
}
//-------------------------------------------------------------------------
/// Setup
Loader {
id: setupWindow
anchors.fill: parent
visible: false
source: "SetupView.qml"
}
//-----------------
/// Fly View 似乎没有单独的qml文件,直接调用MainToolBar.qml创建的界面
FlyView {
id: flightView
anchors.fill: parent
}
//-------------------------------------------------------------------------
/// Plan View
Loader {
id: planViewLoader
anchors.fill: parent
visible: false
source: "PlanView.qml"
}
//-------------------------------------------------------------------------
/// Analyze
Loader {
id: analyzeWindow
anchors.fill: parent
visible: false
source: "AnalyzeView.qml"
}
//-------------------------------------------------------------------------
/// Toolbar
header: ToolBar {
height: ScreenTools.toolbarHeight
visible: !QGroundControl.videoManager.fullScreen
background: Rectangle {
color: qgcPal.globalTheme === QGCPalette.Light ? QGroundControl.corePlugin.options.toolbarBackgroundLight : QGroundControl.corePlugin.options.toolbarBackgroundDark
}
Loader {
id: toolbar
anchors.fill: parent
source: "qrc:/toolbar/MainToolBar.qml"
//-- Toggle Full Screen / Windowed
MouseArea {
anchors.fill: parent
enabled: !ScreenTools.isMobile
onDoubleClicked: {
if(mainWindow.visibility === Window.Windowed) {
mainWindow.showFullScreen()
} else {
mainWindow.showNormal()
}
}
}
}
}
在MainToolBar.qml文件中,我们可以发现不同界面切换的功能代码:
...
QGCToolBarButton {
id: planButton
Layout.fillHeight: true
icon.source: "/qmlimages/Plan.svg"
visible: currentButton.icon.source !== icon.source
onClicked: {
if (_viewButtonClicked(this)) {
mainWindow.showPlanView()
}
}
}
....
上述代码中icon source
调用了相应页面对应的图标,onClicked
的内容表示用鼠标单击后,主界面会显示规划界面(即mainWindow.showPlanView()
,该函数位于MainRootWindow.qml
文件中)。
初次接触qml文件,许多东西理解起来较为困难,进度稍慢,今日花费半天功夫才学习至此。因有其它工作需要完成,关于QGC地面站学习只能明天继续,加油!
2、 阅读学习《ROS机器人编程实践》
rosrun
用于运行一个ros节点,如运行talker和listener:
rosrun rospy_tutorials talker
-----------------------------
rosrun rospy_tutorials listener
roslaunch
用于运行一个xxxx.launch
型文件,xxxx.launch
型文件是描述一组节点以及它们话题重映射和参数的XML文件,如:
roslaunch rospy_tutorials talker_listener.launch
话题
ROS节点之间通过**发布(publish)/订阅(subscribe) 话题(topic)**的通信机制来进行通讯、交换信息和数据。下面给出具体的实例来分析其工作过程。
例1:声明一个话题并在其上发布消息,相应节点以2Hz的速率发送连续的整数到counter节点上。
该实例用Python实现,文件名称为 topic_publisher.py
,代码如下:
#!/usr/bin/env python
import rospy
from std_msgs.msg import Int32
rospy.init_node('topic_publisher')
pub=rospy.Publisher('counter',Int32)
rate=rospy.Rate(2)
count=0
while not rospy.is_shutdown():
pub.publish(count)
count+=1
rate.sleep()
代码第一行注释部分用于告诉操作系统这是一个Python文件。运行该程序需要建立ros工作区间,并导入一些配置文件,可参考这篇豆瓣文章,这里给出一些过程:
- 新建并初始化一个工作区间:
~$: mkdir catkin_ws2
~$: mkdir -p ~/catkin_ws2/src
~$: cd ~/catkin_ws2/src
~$: catkin_init_workspace
- 将ros用户自己的工程目录配置到bash里
gedit ~/.bashrc
在其最后一行加入
export ROS_PACKAGE_PATH=~/catkin_ws2:$ROS_PACKAGE_PATH
- 编译工程
$ cd ~/catkin_ws2/
$ catkin_make
- 将catkin_make加入到shell里
$ source devel/setup.bash
$ echo $ROS_PACKAGE_PATH
- 创建工程文件
catkin_create_pkg basic std_msgs rospy
- 编译
catkin_make
- 加入到当前shell环境里
. ~/catkin_ws2/devel/setup.bash
- 将
topic_publisher.py
文件放入~/catkin_ws2/basic/src/
文件夹下 - 将当前工程加入到shell环境里去
echo "source ~/catkin_ws2/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
- 运行前,还需要用
chmod
命令给它增加运行权限:
chmod u+x topic_publisher.py
- 回到
catkin_ws2
目录下,运行程序(需开两个终端)
roscore
rosrun basic topic_publisher.py
运行成功显示界面如下:
lxy@linxiaoyin:~/catkin_ws3$ rosrun basic topic_publisher.py
/home/wangcheng/catki n_ws3/src/basic/src/topic_publisher.py:9: SyntaxWarning: The publisher should be created with an explicit keyword argument 'queue_size'. Please see http://wiki.ros.org/rospy/Overview/Publishers%20and%20Subscribers for more information.
pub=rospy.Publisher('counter',Int32)
- 通过rostopic查看相关信息
$ rostopic list
-----------
/counter
/rosout
/rosout_agg
- 观察数据输出情况
$ rostopic echo /counter 5
----------------------
data: 185
---
data: 186
---
data: 187
---
data: 188
---
data: 189
rostopic
还有其它一些指令用于查看发布的话题相关信息,如:
# 检验是否按照我们期望的速率发布消息
rostopic hz counter
# 查看声明的话题
rostopic info counter
# 查询已发布的某种类型的话题
rostopic find std_msgs/Int32
3.整理版面费报销材料
因为是国外期刊,需要的材料较多,具体包括以下八项:
- 论文首页
- 论文首页翻译
- 国外发票(invoice)
- 国外发票翻译
- 汇款凭证
- 当日汇率及购汇明细
- 文章录用通知(邮件)
- 文章录用通知翻译
4.练习演讲
学习了《开讲啦》一些名人的演讲,但后来耳机坏了,大概只模仿练习了10分钟,耳机下午没修好,打算换一个了。
5.跑步三公里
keep打卡证明!
今天学习时间:
1、 上午8:00-12:00:学习地面站开发
2、 下午14:00-17:30 ROS学习
3、晚上19:00-23:00 整理报销材料/跑步