搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
Guff_9hys
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
win11安装MySql5.7
2
xray工具的搭建和使用_一键搭建xray面板脚本
3
BERT:训练数据生成代码解读_tokenization.fulltokenizer
4
SQL注入原理、过程、防御方案、RASP概念_sql注入原理、防御 csdn
5
vue中axios的使用_vue axios使用
6
动态规划(一):动态规划的基本概念和基本方程_如何确定动态规划基本方程
7
Mac OS下 Qt 安装及真机调试 (Xcode12 + macOS10.15.7 + Qt5.15.2)_qt5.15 for mac 编译后的
8
【大数据】Hadoop学习笔记_hadoop笔记
9
在linux内核中使用整数运算模拟浮点运算计算三角函数_内核 三角函数
10
大数据的四大特点_大数据四大特征
当前位置:
article
> 正文
基于GTK创建ARDrone 2.0控制线程_如何运行gatortron
作者:Guff_9hys | 2024-07-16 06:05:43
赞
踩
如何运行gatortron
目标: 创建一个GUI,用来控制飞机起飞、降落、左右、前后、上下、旋转,后四者的控制量各自由一个文本框输入。
用GTK实现,顶层窗口只能包含一个组合框,所以顶层一个组合框,向下一个vbox;vbox里包含5个hbox,分别用来放置控制起飞降落、左右、前后、上下、旋转的控件。对于起飞降落,需要两个互斥按钮;其余四种动作,各自需要标签、文本框和按钮各一个。
首先创建gui.c,
#
include
<stdlib.h>
#
include
<stdio.h>
#
include
"gui.h"
#
include
<ardrone_tool/UI/ardrone_input.h>
#
include
<VP_Os/vp_os_delay.h>
#
include
<ardrone_api.h>
static
GtkWidget *window
; //top widget--widow
//-----------
buttons
----------
static
GtkWidget *btnStop
;
static
GtkWidget *btnStart
;
static
GtkWidget *btnLeftRight
;
static
GtkWidget *btnFrontBack
;
static
GtkWidget *btnUpDown
;
static
GtkWidget *btnAngular
;
//------------
text
entries--------
static
GtkWidget *textLeftright
;
static
GtkWidget *textFrontBack
;
static
GtkWidget *textUpDown
;
static
GtkWidget *textAngular
;
//-------------get and set Start/Stop
buttons
state-----
static
void toggleButtonsState(void)
{
gboolean start_state = gtk_widget_get_sensitive(btnStart)
;
gtk_widget_set_sensitive(btnStart,
!
start_state)
;
gtk_widget_set_sensitive(btnStop, start_state)
;
}
//-----------Start/Stop
buttons
callback function------
static
void btnlandCallback(GtkWidget *widget,gpointer data)
{
static
int landFlag =
1
; //1-taking off, else land
ardrone_tool_set_ui_pad_start(landFlag)
;
if
(landFlag)
g_print(
"Taking off"
)
;
else
g_print(
"Landing"
)
;
landFlag = (landFlag
+
1
)
%
2
;
toggleButtonsState()
; //Only one button to be clicked
}
static
int mode_flag =
1
;
//-----------LeftRight
button
callback function
static
void btnLRCallback(GtkWidget *widget, gpointer data)
{
float
LRVaule
;
const gchar* LRChar = gtk_entry_get_text(GTK_ENTRY(textLeftright))
;
LRVaule = (
float
)strtod(LRChar, NULL)
;
ardrone_tool_set_progressive_cmd(mode_flag, LRVaule,
0
.
0
,
0
.
0
,
0
.
0
,
0
.
0
,
0
.
0
)
;
}
//--------------FrontBack
button
callback function
static
void btnFBCallback(GtkWidget *widget, gpointer data)
{
float
FBVaule
;
const gchar* FBChar = gtk_entry_get_text(GTK_ENTRY(textFrontBack))
;
FBVaule = (
float
)strtod(FBChar, NULL)
;
//int i
;
//ardrone_at_reset_com_watchdog()
;
//for(i=
0
; i<10; i++)
//{
ardrone_tool_set_progressive_cmd(mode_flag,
0
.
0
, FBVaule,
0
.
0
,
0
.
0
,
0
.
0
,
0
.
0
)
;
// vp_os_delay(
150
)
;
//}
//ardrone_at_set_progress_cmd(mode_flag,
0
.
0
, FBVaule,
0
.
0
,
0
.
0
)
;
}
//------------------
UpDown
button
callback function
static
void btnUDCallback(GtkWidget *widget, gpointer data)
{
float
UDVaule
;
const gchar* UDChar = gtk_entry_get_text(GTK_ENTRY(textUpDown))
;
UDVaule = (
float
)strtod(UDChar, NULL)
;
ardrone_tool_set_progressive_cmd(mode_flag,
0
.
0
,
0
.
0
, UDVaule,
0
.
0
,
0
.
0
,
0
.
0
)
;
}
//--------------Angular
button
callback function
static
void btnACallback(GtkWidget *widget, gpointer data)
{
float
AVaule
;
const gchar* AChar = gtk_entry_get_text(GTK_ENTRY(textAngular))
;
AVaule = (
float
)strtod(AChar, NULL)
;
ardrone_tool_set_progressive_cmd(mode_flag,
0
.
0
,
0
.
0
,
0
.
0
, AVaule,
0
.
0
,
0
.
0
)
;
}
//-----------init window--------------
void init_control_gui(int argc, char **argv)
{
GtkWidget *vboxMain
; //top box
//-----box for every
control
widget
GtkWidget *hboxStartStop
;
GtkWidget *hboxLeftRight
;
GtkWidget *hboxFrontBack
;
GtkWidget *hboxUpDown
;
GtkWidget *hboxAngular
;
//-----
label
for
control
text
entries
GtkWidget *labelLeftRight
;
GtkWidget *labelFrontBack
;
GtkWidget *labelUpDown
;
GtkWidget *labelAngular
;
g_thread_init(NULL)
;
gtk_init(&argc, &argv)
;
//-----Create window and register its
destroy
function
window = gtk_window_new(GTK_WINDOW_TOPLEVEL)
;
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER)
;
g_signal_connect(G_OBJECT(window),
"destroy"
,
G_CALLBACK(gtk_main_quit),NULL)
;
//-----Create all boxes
vboxMain = gtk_vbox_new(
FALSE
,
1
)
;
hboxStartStop = gtk_hbox_new(
FALSE
,
10
)
;
hboxLeftRight = gtk_hbox_new(
FALSE
,
10
)
;
hboxFrontBack = gtk_hbox_new(
FALSE
,
10
)
;
hboxUpDown = gtk_hbox_new(
FALSE
,
10
)
;
hboxAngular = gtk_hbox_new(
FALSE
,
10
)
;
//-----Create Start/Stop
buttons
and put them into a hbox
btnStart = gtk_button_new_with_label(
"Taking Off"
)
;
btnStop = gtk_button_new_with_label(
"Landing"
)
;
gtk_box_pack_start(GTK_BOX(hboxStartStop), btnStart,
FALSE
,
FALSE
,
0
)
;
gtk_box_pack_start(GTK_BOX(hboxStartStop), btnStop,
FALSE
,
FALSE
,
0
)
;
//-----Create LeftRight
button
/
text
/
label
and put them into a hbox
btnLeftRight = gtk_button_new_with_label(
"Left/Right"
)
;
labelLeftRight = gtk_label_new(
"Left/Right Var:"
)
;
textLeftright = gtk_entry_new()
;
gtk_box_pack_start(GTK_BOX(hboxLeftRight), labelLeftRight,
FALSE
,
FALSE
,
0
)
;
gtk_box_pack_start(GTK_BOX(hboxLeftRight), textLeftright,
FALSE
,
FALSE
,
0
)
;
gtk_box_pack_start(GTK_BOX(hboxLeftRight), btnLeftRight,
FALSE
,
FALSE
,
0
)
;
//-----Create FrontBack
button
/
text
/
label
and put them into a hbox
btnFrontBack = gtk_button_new_with_label(
"Front/Back"
)
;
labelFrontBack = gtk_label_new(
"Front/Back Var:"
)
;
textFrontBack = gtk_entry_new()
;
gtk_box_pack_start(GTK_BOX(hboxFrontBack), labelFrontBack,
FALSE
,
FALSE
,
0
)
;
gtk_box_pack_start(GTK_BOX(hboxFrontBack), textFrontBack,
FALSE
,
FALSE
,
0
)
;
gtk_box_pack_start(GTK_BOX(hboxFrontBack), btnFrontBack,
FALSE
,
FALSE
,
0
)
;
//-----Create
UpDown
button
/
text
/
label
and put them into a hbox
btnUpDown = gtk_button_new_with_label(
"Up/Down"
)
;
labelUpDown = gtk_label_new(
"Up/Down Var:"
)
;
textUpDown = gtk_entry_new()
;
gtk_box_pack_start(GTK_BOX(hboxUpDown), labelUpDown,
FALSE
,
FALSE
,
0
)
;
gtk_box_pack_start(GTK_BOX(hboxUpDown), textUpDown,
FALSE
,
FALSE
,
0
)
;
gtk_box_pack_start(GTK_BOX(hboxUpDown), btnUpDown,
FALSE
,
FALSE
,
0
)
;
//-----Create Angular
button
/
text
/
label
and put them into a hbox
btnAngular = gtk_button_new_with_label(
"Angular"
)
;
labelAngular = gtk_label_new(
"Angular Var:"
)
;
textAngular = gtk_entry_new()
;
gtk_box_pack_start(GTK_BOX(hboxAngular), labelAngular,
FALSE
,
FALSE
,
0
)
;
gtk_box_pack_start(GTK_BOX(hboxAngular), textAngular,
FALSE
,
FALSE
,
0
)
;
gtk_box_pack_start(GTK_BOX(hboxAngular), btnAngular,
FALSE
,
FALSE
,
0
)
;
//-----Register all
buttons
' callback function
g_signal_connect(btnStart,
"clicked"
, G_CALLBACK(btnlandCallback), NULL)
;
g_signal_connect(btnStop,
"clicked"
, G_CALLBACK(btnlandCallback), NULL)
;
g_signal_connect(btnLeftRight,
"clicked"
, G_CALLBACK(btnLRCallback), NULL)
;
g_signal_connect(btnFrontBack,
"clicked"
, G_CALLBACK(btnFBCallback), NULL)
;
g_signal_connect(btnUpDown,
"clicked"
, G_CALLBACK(btnUDCallback), NULL)
;
g_signal_connect(btnAngular,
"clicked"
, G_CALLBACK(btnACallback), NULL)
;
//-----Set Start/Stop
buttons
' state to be different at one moment
gtk_widget_set_sensitive(btnStart,
TRUE
)
;
gtk_widget_set_sensitive(btnStop,
FALSE
)
;
//-----Put all hbox into vbox
gtk_box_pack_start(GTK_BOX(vboxMain), hboxStartStop,
TRUE
,
TRUE
,
0
)
;
gtk_box_pack_start(GTK_BOX(vboxMain), hboxLeftRight,
TRUE
,
TRUE
,
0
)
;
gtk_box_pack_start(GTK_BOX(vboxMain), hboxFrontBack,
TRUE
,
TRUE
,
0
)
;
gtk_box_pack_start(GTK_BOX(vboxMain), hboxUpDown,
TRUE
,
TRUE
,
0
)
;
gtk_box_pack_start(GTK_BOX(vboxMain), hboxAngular,
TRUE
,
TRUE
,
0
)
;
//-----Put vbox into window
gtk_container_add(GTK_CONTAINER(window), vboxMain)
; //a window can only contain one widget
gtk_widget_show_all(window)
;
}
创建gui.h,
#
ifndef GUI_H_
#
define GUI_H_
#
include
<gtk-
2
.
0
/gtk/gtk.h>
#
include
<cairo.h>
void init_control_gui(int argc, char **argv)
;
#
endif
将以上两个文件添加到
sdk_demo/Source
里面的UI文件夹,在ardrone_testing_tool.c里添加GTK线程,
#include "UI/gui.h"
DEFINE_THREAD_ROUTINE(gui, data)
{
gdk_threads_enter();
gtk_main();
gdk_threads_leave();
}
在main函数里添加,
init_control_gui(argc, argv)
在
ardrone_tool_init_custom函数里启动线程,
START_THREAD(gui, NULL);
在
ardrone_tool_shutdown_custom函数里关闭线程,
JOIN_THREAD(gui);
修改
ardrone_testing_tool.c结尾的
Thread Table,
最后,修改Makefile即可,
GENERIC_BINARIES_COMMON_SOURCE_FILES+= \
Navdata/navdata.c \
Video/video_stage.c \
UI/gui.c
GENERIC_LIBS=-lpc_ardrone -lgtk-x11-2.0 -lrt `pkg-config --libs gthread-2.0`
注:
main函数里建立了gtk线程,如果在其他线程里,比如video_stage或navdata_update,想要对界面上的控件(比如Label)做一些改变,可以通过如下方式进行,
gdk_threads_enter();
/*******Your code here*****************/
gdk_threads_leave();
顺便提一下添加navdata_update线程的方法:将sdk_demo里Navdata文件夹拷贝到你的工程源文件目录下,在Thread Table添加,
THREAD_TABLE_ENTRY(navdata_update, 20)
然后在Makefile里的编译源文件加上
Navdata/navdata.c,
就完成了,该线程由SDK的ardrone_tool_main函数自己启动,不用自己在
ardrone_tool_init_custom和
ardrone_tool_shutdown_custom函数里开启和启动
。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/Guff_9hys/article/detail/832604
推荐阅读
article
【适合小白】
开发
一个
区块
链
应用
_
区块
链
开发
...
前言:本篇教程是小编基于FISCO BCOS官网的教程撰写的,有不明白的地方也可以去官网上的教程看看。在
开发
区块
链
应用
...
赞
踩
article
机器学习——
决策树
剪枝
算法
_基于基尼指数
的
损失
函数
...
本篇博客介绍了
决策树
的
剪枝
算法
,包括预
剪枝
和后
剪枝
两种方法,以及
决策树
的
损失
函数
(目标
函数
)。通过Python实现了预剪...
赞
踩
article
OpenAI
新
模型
「
草莓
」曝光:强
推理
/长任务规划/
超大规模
训练
!还给出AGI分级......
明敏 克雷西 发自 凹非寺量子位 | 公众号 QbitAI
OpenAI
最
新
绝密项目曝光!知情人士透露,
OpenAI
正在开...
赞
踩
article
测试
团队
管理
——如何判断
一个
差的
管理
者
_工时缺陷比 开发
测试
...
如何判断
一个
差的
管理
者
_工时缺陷比 开发
测试
工时缺陷比 开发
测试
目录 引言 1、双标问...
赞
踩
article
【
Linux
】
线程
互斥
_
xchgb
指令...
介绍
线程
互斥
的概念,认识和理解
互斥
锁,介绍使用
互斥
锁的相关接口,理解锁的原理,了解死锁!_
xchgb
指令
xchgb
指令 ...
赞
踩
article
如何使用Visual Studio Code
连接
MySQL
数据库
_
visual
studio
c...
如何使用Visual Studio Code 远程
连接
MySQL
数据库
_
visual
studio
code
怎么
连接
数据...
赞
踩
article
微信群
机器人
(仿真
企业
微信群
机器人
)...
企业
微信的应该应该听过
企业
微信群
机器人
,它是
企业
微信的原生功能,你在
企业
微信群
中新建一个
机器人
,随后就可以获得这个群机器...
赞
踩
article
使用 VS
Code
连接
MySQL
数据库
_
vscode
mysql...
使用VS
Code
连接
数据库
、导入导出数据_
vscode
mysql
vscode
mysql ...
赞
踩
article
【
DRONECAN
】
(
一
)
介绍
...
笔者最近因为项目需要用到CAN通信,所以研究了
一
下飞控上基于CAN的协议,目前在Ardupilot和PX4中用的是DRO...
赞
踩
article
技术
管理
成长
计划
(一)
:
角色
认知
及转身_主
计划
角色
认知
...
担任
技术
管理
岗位伊始,你是否碰到过如下问题? 做好
技术
管理
,先回答以下3个问题?怎么理解
技术
管理
的岗位
角色
?
技术
管理
岗位...
赞
踩
article
【论文笔记】
Digital
Tw
in
in
Industry
:
State
-of-
the
-Art——...
智能制造需要大量的数据支持+硬件技术和信息技术的快速发展促进了物理设备与虚拟模型之间的连接,数字孪生技术基于这两个背景应...
赞
踩
article
reproducible
-
image
-
denoising
-
state
-of-the-art_
wen
...
https://github.com/
wen
bihan
/
reproducible
-
image
-
denoising
-sta...
赞
踩
article
Drone
CI/CD 使用
exec
流水线进行持续交付,
exec
一直卡
pending
_dron...
Drone
CI/CD 是一款轻量的devOps软件。声明 pipeline type的类型,在 yml 文件中写入 s...
赞
踩
article
项目
如何
持续
集成
,
持续
部署
,
使用
Jenkins
就能轻松完成_
项目
如何
进行
持续
集成
...
项目
如何
持续
集成
,
持续
部署
,
使用
Jenkins
就能轻松完成。解释一下:Dockerfile是一个创建镜像所有命令的文本文...
赞
踩
article
微信
聊天
发码
机器人
操作指南_
微信
群
机器人
指令
大全...
微信
聊天
机器人
,可以实现自动回复,
发码
,发图片,交易记录,收款,群回复等等。_
微信
群
机器人
指令
大全
微信
群
机器人
指令
大全 ...
赞
踩
article
希望
大家以后
多多关照
!!
_
希望
你们
多多关照
...
第一次到次,
希望
和志趣相投的朋友一起分享阳光!
_
希望
你们
多多关照
希望
你们
多多关照
第一次...
赞
踩
article
Sklearn
入门教程
:开启
机器
学习
之旅...
本文介绍了Scikit-learn库的入门知识,包括安装、数据准备以及分类、回归和聚类等常见任务的示例代码。希望通过本文...
赞
踩
article
vue3
实现
浏览器
打印
(
条形码
、二维码)...
如果需要
打印
条形码
, 可以使用
vue3
-barcode插件,但是这个插件不支持同时
打印
多个,最后一个总会覆盖前面的,如果...
赞
踩
article
python
asyncio
(
协程
、
异步
编程)...
asyncio
(Asynchronous I/O)模块是一个
异步
代码库,它提供了一种基于
协程
(coroutine)和事...
赞
踩
article
技术
新
经理
如何实现
从
技术
岗
到
管理
岗
的转变_
从
技术
到
技术
管理
...
目前认识
到
的一些
技术
新
经理
, 大部分都是
从
技术
岗
被提拔
到
管理
岗
位上。 并且有超过80%的
技术
管理
者,都是在没有明确表达管...
赞
踩
相关标签
区块链
人工智能
开发语言
运维
linux
机器学习
算法
决策树
agi
深度学习
低成本犯错
java
redis
服务器
c++
dba
微信
自动化
VS Code
网络
论文阅读
docker
devops