基于ESP32四旋翼无人机同蓝牙遥控器通信处理方式

2023-05-16

1.蓝牙初始化

在app_main调用函数初始化蓝牙
inf_ble_gatt_init();

2.判断蓝牙是否链接

在dandelion_task中调用函数inf_ble_gatt_connected()判断蓝牙是否链接,进而调用dandelion_handle_RC() 处理同遥控器蓝牙通信。

static void dandelion_task(void* arg)
{

uint32_t console_notify_at = 0;

while(1)
{
	vTaskDelay(2);

	// Get Semaphore >>>> 
	if(xSemaphoreTake(mDandelion.syn.mut, 10))
	{

		/* Check RC State */
		if(!inf_ble_gatt_connected())
		{
			/* Force Stop When Disconnect */
			if(mDandelion.syn.mode != DANDELION_STOP)
			{
				ESP_LOGI(TAG,"mode any -> stop # GATT disconnected");
				mDandelion.syn.mode = DANDELION_STOP;
				loop_process_stop();
			}
			
		}

		/* Check DMP State */
		if(mDandelion.dmp.state != DANDELION_POSE_ERR_OK)
		{
			if(mDandelion.syn.mode != DANDELION_STOP)
			{
				ESP_LOGI(TAG,"mode any -> stop # DMP warning");
				mDandelion.syn.mode = DANDELION_STOP;
				loop_process_stop();
			}
		}

		/* Handle RC-Message Queue */
		dandelion_handle_RC();   //根据消息,控制飞行状态

		/* Loop State Machine */
		dandelion_loop_state(); //没有消息时调用该函数控制飞行状态

		/* Invoke Bluetooth Notify State */
		notify_current_state(0);//通过蓝牙上传飞行数据

		xSemaphoreGive(mDandelion.syn.mut);
	}


	// Print >>>> 
	if(xTaskGetTickCount()-console_notify_at>2000)
	{
		console_notify_at = xTaskGetTickCount();
		ESP_LOGI(TAG,"State Mode=0x%02X Drive=[%1.2f,%1.2f,%1.2f,%1.2f]",mDandelion.syn.mode,
			mDandelion.pid.output[0],mDandelion.pid.output[1],mDandelion.pid.output[2],mDandelion.pid.output[3]);
	}

}

}

3.接收蓝牙信息并处理函数dandelion_handle_RC

static void dandelion_handle_RC(void)
{

if(mDandelion.control.sysmUpdate!=mDandelion.control.userUpdate)
{

	mDandelion.control.sysmUpdate = mDandelion.control.userUpdate;
	hid_msg* pMsg = &mDandelion.control.msg;

	ESP_LOGI(TAG,"Handle RC Update %02X",pMsg->mode);

	if(pMsg->mode==DANDELION_DPOWER)
	{
		if(mDandelion.syn.mode==DANDELION_STOP)
		{
			ESP_LOGI(TAG,"mode stop -> test.power");
			mDandelion.syn.mode = DANDELION_DPOWER;
			loop_process_debug_power(1,pMsg);
		}
		else if(mDandelion.syn.mode==DANDELION_DPOWER)
		{
			ESP_LOGI(TAG,"test.power %3d %3d %3d %3d",pMsg->output[0],pMsg->output[1],pMsg->output[2],pMsg->output[3]);
			loop_process_debug_power(0,pMsg);
		}
	}
	else if(pMsg->mode==DANDELION_LAND)
	{
		if(mDandelion.syn.mode==DANDELION_STOP)
		{
			if(loop_process_land(1)>0)
			{
				ESP_LOGI(TAG,"mode stop -> land");
				mDandelion.syn.mode = DANDELION_LAND;
			}
			else
			{
				ESP_LOGI(TAG,"mode stop -> stop # Switch failed");
			}
		}
	}
	else if(pMsg->mode==DANDELION_FLIGHT)
	{
		if(mDandelion.syn.mode==DANDELION_LAND)
		{
			ESP_LOGI(TAG,"mode land -> launch");
			mDandelion.syn.mode = DANDELION_LAUNCH;
			loop_process_launch(1,0);
		}
		else if(mDandelion.syn.mode==DANDELION_LAUNCH)
		{
			loop_process_launch(0,1);
		}
		else if(mDandelion.syn.mode==DANDELION_FLIGHT)
		{
			loop_process_flight(0,pMsg);
		}
	}
	else
	{
		ESP_LOGI(TAG,"mode any -> stop");
		mDandelion.syn.mode = DANDELION_STOP;
		loop_process_stop();
	}

	notify_current_state(1);
	
}

}

4.将无人机状态信息回传给蓝牙遥控器

通过调用notify_current_state()函数来实现:
/* Packet GATT Characterstic Value /
static void notify_current_state(int force)
{
/
Period Limit */
if( (force==0) && (xTaskGetTickCount() - mDandelion.control.timeNotify<250) )
return ;

hid_msg msg = {0};

/* State Machine */
msg.mode = mDandelion.syn.mode ;

/* Motor Output */
msg.output[0] = mDandelion.pid.output[0] * 100 ; msg.output[1] = mDandelion.pid.output[1] * 100 ;
msg.output[2] = mDandelion.pid.output[2] * 100 ; msg.output[3] = mDandelion.pid.output[3] * 100 ;

/* Pose */
msg.mpu = mDandelion.dmp.state ;
msg.imu.pitch  = mDandelion.dmp.poseCurrent.pitch   * 180 / 3.14;
msg.imu.roll   = mDandelion.dmp.poseCurrent.roll    * 100 / 3.14;
msg.imu.yaw    = mDandelion.dmp.poseCurrent.yawGyro * 100 / 3.14;
msg.imu.height = 0;

/* Battery */
msg.battery = bsp_battery();
msg.charge  = 0;

/* Invoke Interface */
inf_ble_gatt_notify(&msg, sizeof(hid_msg), chara_uuid_KeyboardInput);

mDandelion.control.timeNotify = xTaskGetTickCount();

}

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

基于ESP32四旋翼无人机同蓝牙遥控器通信处理方式 的相关文章

随机推荐

  • HNU软件能力实训3-8. ab串

    写在前面 你好 xff01 欢迎来到我的博客 xff0c 希望我的思路能够帮到你 xff01 问题描述 给定一个由字符 a 和字符 b 组成的字符串 xff0c 可以删除若干字符 xff0c 使得剩下来的字符串满足前后段为a xff0c 中
  • HNU软件能力实训3-9. 占座位

    写在前面 你好 xff01 欢迎来到我的博客 xff0c 希望我的思路能够帮到你 xff01 问题描述 一个人可以去占多个座位 xff0c 而且一定是要连续的座位 xff0c 如果占不到他所要求的这么多座位 xff0c 那么他就一个座位也不
  • ROS编程入门(C++ 及 思路)

    使用Autolabor官方入门教程 xff0c 笔记内容为注意事项 首页 Autolabor开源ROS机器人底盘 官方网站 一 ROS通信机制的解释 例如在生活中 xff0c 我们在家里有一个放零食的箱子 xff0c 而操作服务器就是这个箱
  • HNU软件能力实训4-5. 小希的数表

    写在前面 你好 xff01 欢迎来到我的博客 xff0c 希望我的思路能够帮到你 xff01 问题描述 Gardon 昨天给小希布置了一道作业 xff0c 即根据一张由不超过 5000 的 N 3 lt 61 N lt 61 100 个正整
  • HNU软件能力实训4-12. 疫情期间

    写在前面 你好 xff01 欢迎来到我的博客 xff0c 希望我的思路能够帮到你 xff01 问题描述 正值新冠疫情期间 xff0c 阿迪没法返回学校学习 xff0c 他希望通过参加一些比赛来提高一下编程技能 xff0c 同时做做运动 他收
  • HNU软件能力实训4-14. 组个最小数

    写在前面 你好 xff01 欢迎来到我的博客 xff0c 希望我的思路能够帮到你 xff01 问题描述 给定数字0 9各若干个 你可以以任意顺序排列这些数字 xff0c 但必须全部使用 目标是使得最后得到的数尽可能小 xff08 注意0不能
  • CMakeLists.txt的编写

    首先是编写好的CMakeLists txt文件 span class token function cmake minimum required span span class token punctuation span VERSION
  • 第一课 神经网络与深度学习 第二周 神经网络基础(已完结(虽然有坑))

    视频地址 二分分类 怎么说 xff0c 第一段话就颠覆了我的想象 xff0c 遍历m个样本不需要用for循环 这里是介绍了图片的预处理 xff0c 将图片切分为rgb三个颜色空间 xff08 这个我熟 xff09 xff0c 然后将所有的分
  • leetcode 1200. 最小绝对差

    1200 最小绝对差 span class token keyword class span span class token class name Solution span span class token punctuation sp
  • 648. 单词替换

    648 单词替换 span class token keyword class span span class token class name Solution span span class token punctuation span
  • 1217. 玩筹码

    1217 玩筹码 span class token comment 由题目描述可知 xff0c 移动1步成本为1 移动2步没有成本 那么我们可以不耗费成本的将不同奇数位置的筹码移动到某一个奇数位置 此时的成本为0 同理 也可以将不同偶数位置
  • dronekit控制实体无人机起飞降落

    摘要 xff1a 本文基于dronekit在实体无人机上实现最基本的起飞和降落 xff0c 测试了这一过程中速度的变化以及起落位置的偏移 实体实验环境 树莓派4BUbuntu mate 20 04飞控Pixhawk 2 4 8飞控固件APM
  • Gazebo中针对Gazebo软件或生成模型出现process has died问题的参考方案

    在基于ROS机器人仿真时 xff0c 打开Gazebo经常出现一些问题 xff0c 比如Gazebo窗口打开了 xff0c 终端却显示gazebo进程已死 本文记录了一次遇到的类似问题 xff0c 并给出了在部分情况下能够适用的参考方案 问
  • ROS 入门 (launch文件)

    本章主要内容介绍在ROS中上述问题的解决策略 见本章目录 xff0c 预期达成学习目标也与上述问题对应 xff1a 掌握元功能包使用语法 xff1b 掌握launch文件的使用语法 xff1b 理解什么是ROS工作空间覆盖 xff0c 以及
  • 报错:Multiple annotations found at this line: - user cannot be resolved

    问题 xff1a Multiple annotations found at this line user cannot be resolved 第一步 xff1a 右键找到Build Path 点击Configure Build Path
  • Nuxt 生命周期

    目录 服务端生命周期1 nuxtServerInit nuxt中第一个运行的生命周期 2 RouteMiddleware 第二个 xff1a 中间键 xff0c 路由导航守卫 4 validate 是用来校验url参数符不符合5 async
  • 使用ESP-idf-4.23一次编译通过ESP32-Drone四旋翼无人机代码

    为了编译ESP32 Drone四旋翼无人机代码 xff0c 试用了几种编译环境 xff0c 折腾一个上午 xff0c 最后使用ESP idf 4 23一次性编译通过 记录一下过程 1 获取ESP32 Drone四旋翼无人机项目源代码 xff
  • 基于ESP32四旋翼无人机如何根据PID算法进行电机的PWM duty补偿

    1 计算模型 电机位置和补偿输出的关系 xff0c 需要求解的是C1 C2 C3 C4的电机输出补偿值 分别对应M1 M2 M3 M4四个电机 2 推导过程 xff08 可以跳过不看 xff0c 直接到第三步 xff09 3 四个电机的PI
  • 基于ESP32四旋翼无人机的MPU6050姿态数据采集和处理方式

    1 MPU6050姿态数据采集和处理 在DMP任务里面采集MPU6050的四元数的姿态数据 xff0c 然后解算出机体坐标系的三个角姿态角 dmp task任务通过消息队列将姿态角发送给姿态控制程序 dmp task gt dandelio
  • 基于ESP32四旋翼无人机同蓝牙遥控器通信处理方式

    1 蓝牙初始化 在app main调用函数初始化蓝牙 inf ble gatt init 2 判断蓝牙是否链接 在dandelion task中调用函数inf ble gatt connected 判断蓝牙是否链接 xff0c 进而调用da