px4ctrl代码-fsm.process()

2023-05-16

//主进程
//初始状态为MANUAL_CTRL
/* 
        Finite State Machine

	      控制系统启动
	            |
	            |
	            v
	----- > 手动控制 <---------------
	|         ^   |    \             |
	|         |   |     \            |
	|         |   |      >自动起飞   |
	|         |   |        /         |
	|         |   |       /          |
	|         |   |      /           |
	|         |   v     /            |
	|       悬停模式 <               |
	|         ^   |  \  \            |
	|         |   |   \  \           |
	|         |	  |    > 自动降落 ---
	|         |   |
	|         |   v
	-------- 程序控制(大概?)

*/
void PX4CtrlFSM::process()
{

	ros::Time now_time = ros::Time::now();
	Controller_Output_t u;
	Desired_State_t des(odom_data);
	bool rotor_low_speed_during_land = false;

	// STEP1: state machine runs
	switch (state)
	{
	case MANUAL_CTRL:
	{
		if (rc_data.enter_hover_mode) // Try to jump to AUTO_HOVER
		//enter_hover_mode的布尔值由遥控器通道4值决定,last_mode小于1750本次大于1750则置为True
		//表示将模式切换至AUTO_HOVER
		{
			if (!odom_is_received(now_time))
			//如果里程计数据更新时间超过设定值,则视为里程计丢失,参数中为0.5S
			{
				ROS_ERROR("[px4ctrl] Reject AUTO_HOVER(L2). No odom!");
				break;
			}
			//如果上次控制指令更新时间*没有超过*设定值,则禁止进入AUTO_HOVER模式
			if (cmd_is_received(now_time))
			{
				ROS_ERROR("[px4ctrl] Reject AUTO_HOVER(L2). You are sending commands before toggling into AUTO_HOVER, which is not allowed. Stop sending commands now!");
				break;
			}
			if (odom_data.v.norm() > 3.0)
			//个人理解为里程计速度向量长度若大于3,则认为数据错误
			{
				ROS_ERROR("[px4ctrl] Reject AUTO_HOVER(L2). Odom_Vel=%fm/s, which seems that the locolization module goes wrong!", odom_data.v.norm());
				break; 
			}
			state = AUTO_HOVER;
			//更新状态
			controller.resetThrustMapping();
			
			//函数如下:param_.gra为重力加速度,param_.thr_map.hover_percentage在参数表为0.30
			//Thrust percentage in Stabilize/Arco mode
		  
			//LinearControl::resetThrustMapping(void)
      //{
      //thr2acc_ = param_.gra / param_.thr_map.hover_percentage;
      //P_ = 1e6;
      //}
      
			set_hov_with_odom();
			//将里程计数据写入一个四位列向量
			toggle_offboard_mode(true);
      //切换到offboard模式,下面对应函数解析
			ROS_INFO("\033[32m[px4ctrl] MANUAL_CTRL(L1) --> AUTO_HOVER(L2)\033[32m");
		}
		else if (param.takeoff_land.enable && takeoff_land_data.triggered && takeoff_land_data.takeoff_land_cmd == quadrotor_msgs::TakeoffLand::TAKEOFF) // Try to jump to AUTO_TAKEOFF
		{
		//切换到自动起飞的条件
		//1.参数表中自动起飞参数为True
		//2.自动起飞标志位置为True->在Takeoff_Land_Data_t::feed中(服务takeoff_land_sub的回调函数)
		//3.读取mavros/takeoff_land_cmd的状态为已解锁
			if (!odom_is_received(now_time))
			{
				ROS_ERROR("[px4ctrl] Reject AUTO_TAKEOFF. No odom!");
				break;
			}
			if (cmd_is_received(now_time))
			{
				ROS_ERROR("[px4ctrl] Reject AUTO_TAKEOFF. You are sending commands before toggling into AUTO_TAKEOFF, which is not allowed. Stop sending commands now!");
				break;
			}
			if (odom_data.v.norm() > 0.1)
			//认为自动起飞时应该是静态的
			{
				ROS_ERROR("[px4ctrl] Reject AUTO_TAKEOFF. Odom_Vel=%fm/s, non-static takeoff is not allowed!", odom_data.v.norm());
				break;
			}
			if (!get_landed())
			//无人机应处于着陆状态
			{
				ROS_ERROR("[px4ctrl] Reject AUTO_TAKEOFF. land detector says that the drone is not landed now!");
				break;
			}
			if (rc_is_received(now_time)) // Check this only if RC is connected.
			//如果使用遥控器(非必须),下面应该是通道值的检测,不深入.
			{
				if (!rc_data.is_hover_mode || !rc_data.is_command_mode || !rc_data.check_centered())
				{
					ROS_ERROR("[px4ctrl] Reject AUTO_TAKEOFF. If you have your RC connected, keep its switches at \"auto hover\" and \"command control\" states, and all sticks at the center, then takeoff again.");
					while (ros::ok())
					{
						ros::Duration(0.01).sleep();
						ros::spinOnce();
						if (rc_data.is_hover_mode && rc_data.is_command_mode && rc_data.check_centered())
						{
							ROS_INFO("\033[32m[px4ctrl] OK, you can takeoff again.\033[32m");
							break;
						}
					}
					break;
				}
			}

			state = AUTO_TAKEOFF;
			//更新状态
			controller.resetThrustMapping();
			//上面有描述
			set_start_pose_for_takeoff_land(odom_data);
			//记录起飞位置和起飞时间
			toggle_offboard_mode(true);				  // toggle on offboard before arm
			//切换offboard模式,下面有详解
			for (int i = 0; i < 10 && ros::ok(); ++i) // wait for 0.1 seconds to allow mode change by FMU // mark
			{
				ros::Duration(0.01).sleep();
				ros::spinOnce();
			}
			//延时0.1秒再次检测模式,防误触?
			if (param.takeoff_land.enable_auto_arm)
			{
				toggle_arm_disarm(true);
			}
			takeoff_land.toggle_takeoff_land_time = now_time;
      //mark自动起飞时间
			ROS_INFO("\033[32m[px4ctrl] MANUAL_CTRL(L1) --> AUTO_TAKEOFF\033[32m");
		}

		if (rc_data.toggle_reboot) // Try to reboot. EKF2 based PX4 FCU requires reboot when its state estimator goes wrong.
		{
			if (state_data.current_state.armed)
			{
				ROS_ERROR("[px4ctrl] Reject reboot! Disarm the drone first!");
				break;
			}
			reboot_FCU();
		}
		//没仔细看,应该是异常检测rc_data.toggle_reboot在读取RC服务是通过判断置为True
		break;
	}

	case AUTO_HOVER:
	{
		if (!rc_data.is_hover_mode || !odom_is_received(now_time))
		//如果不是在悬停模式下,或里程计数据更新未超时(这个判断有点没明白什么意思)
		{
			state = MANUAL_CTRL;
			//更新状态为手动控制
			toggle_offboard_mode(false);
      //退出offboard模式
			ROS_WARN("[px4ctrl] AUTO_HOVER(L2) --> MANUAL_CTRL(L1)");
		}
		else if (rc_data.is_command_mode && cmd_is_received(now_time))
		{
		//如果在程序控制模式下,且指令更新未超时
			if (state_data.current_state.mode == "OFFBOARD")
			{
			  //如果在offboard模式下
				state = CMD_CTRL;
				//更新状态为程序控制模式
				des = get_cmd_des();
				//更新控制数据 从话题cmd的回调函数中得到
				ROS_INFO("\033[32m[px4ctrl] AUTO_HOVER(L2) --> CMD_CTRL(L3)\033[32m");
			}
		}
		else if (takeoff_land_data.triggered && takeoff_land_data.takeoff_land_cmd == quadrotor_msgs::TakeoffLand::LAND)
		{
    //不分析了,如果这样就自动降落
			state = AUTO_LAND;
			set_start_pose_for_takeoff_land(odom_data);

			ROS_INFO("\033[32m[px4ctrl] AUTO_HOVER(L2) --> AUTO_LAND\033[32m");
		}
		else
		{
			set_hov_with_rc();
			//从RC数据中获取位置期望,具体下面有解析
			des = get_hover_des();
			//将获取的位置作为输入传给DES
			if ((rc_data.enter_command_mode) ||
				(takeoff_land.delay_trigger.first && now_time > takeoff_land.delay_trigger.second))
			{
				takeoff_land.delay_trigger.first = false;
				//第一次进入该模式发送提示
				publish_trigger(odom_data.msg);
				ROS_INFO("\033[32m[px4ctrl] TRIGGER sent, allow user command.\033[32m");
			}

			// cout << "des.p=" << des.p.transpose() << endl;
		}

		break;
	}

	case CMD_CTRL:
	{
	  //程序控制模式
		if (!rc_data.is_hover_mode || !odom_is_received(now_time))
		{
			state = MANUAL_CTRL;
			//更新状态为手动模式
			toggle_offboard_mode(false);
      //关闭offboard模式
			ROS_WARN("[px4ctrl] From CMD_CTRL(L3) to MANUAL_CTRL(L1)!");
		}
		else if (!rc_data.is_command_mode || !cmd_is_received(now_time))
    //如果不在控制模式下,且控制数据更新超时
		{
			state = AUTO_HOVER;
			//更新状态为定点模式
			set_hov_with_odom();
			//保存当前位置
			des = get_hover_des();
			//将位置数据传至DES
			ROS_INFO("[px4ctrl] From CMD_CTRL(L3) to AUTO_HOVER(L2)!");
		}
		else
		{
			des = get_cmd_des();
			//将控制数据传至DES
		}

		if (takeoff_land_data.triggered && takeoff_land_data.takeoff_land_cmd == quadrotor_msgs::TakeoffLand::LAND)
		{
		//如果在程序控制模式下降落,需先切换回定点模式
			ROS_ERROR("[px4ctrl] Reject AUTO_LAND, which must be triggered in AUTO_HOVER. \
					Stop sending control commands for longer than %fs to let px4ctrl return to AUTO_HOVER first.",
					  param.msg_timeout.cmd);
		}

		break;
	}

	case AUTO_TAKEOFF:
	{
	  //自动起飞
		if ((now_time - takeoff_land.toggle_takeoff_land_time).toSec() < AutoTakeoffLand_t::MOTORS_SPEEDUP_TIME) // Wait for several seconds to warn prople.
		{
			des = get_rotor_speed_up_des(now_time);
			//切换到自动起飞后,怠速时间为3S,期间更新DES
		}
		else if (odom_data.p(2) >= (takeoff_land.start_pose(2) + param.takeoff_land.height)) // reach the desired height
		{
		  //到达设定高度后设置为定点模式
			state = AUTO_HOVER;
			set_hov_with_odom();
			ROS_INFO("\033[32m[px4ctrl] AUTO_TAKEOFF --> AUTO_HOVER(L2)\033[32m");

			takeoff_land.delay_trigger.first = true;
			takeoff_land.delay_trigger.second = now_time + ros::Duration(AutoTakeoffLand_t::DELAY_TRIGGER_TIME);
		}
		else
		{
		  //正在上升
			des = get_takeoff_land_des(param.takeoff_land.speed);
		}

		break;
	}

	case AUTO_LAND:
	{
	  //自动降落
		if (!rc_data.is_hover_mode || !odom_is_received(now_time))
		{
		  //未在定点模式或里程计未及时更新
			state = MANUAL_CTRL;
			//切换回手动模式
			toggle_offboard_mode(false);
      //退出offboard
			ROS_WARN("[px4ctrl] From AUTO_LAND to MANUAL_CTRL(L1)!");
		}
		else if (!rc_data.is_command_mode)
		{
		  //若不在控制模式下
			state = AUTO_HOVER;
			//切换回定点模式
			set_hov_with_odom();
			des = get_hover_des();
			ROS_INFO("[px4ctrl] From AUTO_LAND to AUTO_HOVER(L2)!");
		}
		else if (!get_landed())
		//
		{
			des = get_takeoff_land_des(-param.takeoff_land.speed);
		}
		else
		{
			rotor_low_speed_during_land = true;
      //怠速
			static bool print_once_flag = true;
			if (print_once_flag)
			{
				ROS_INFO("\033[32m[px4ctrl] Wait for abount 10s to let the drone arm.\033[32m");
				print_once_flag = false;
			}
      //灯带十秒上锁
			if (extended_state_data.current_extended_state.landed_state == mavros_msgs::ExtendedState::LANDED_STATE_ON_GROUND) // PX4 allows disarm after this
			{

				static double last_trial_time = 0; // Avoid too frequent calls
				if (now_time.toSec() - last_trial_time > 1.0)
				{
					if (toggle_arm_disarm(false)) // disarm
					{
						print_once_flag = true;
						state = MANUAL_CTRL;
						//上锁后切回手动模式
						toggle_offboard_mode(false); // toggle off offboard after disarm
						ROS_INFO("\033[32m[px4ctrl] AUTO_LAND --> MANUAL_CTRL(L1)\033[32m");
					}

					last_trial_time = now_time.toSec();
				}
			}
		}

		break;
	}

	default:
		break;
	}

	// STEP2: estimate thrust model
	//选择合适的计算方式
	if (state == AUTO_HOVER || state == CMD_CTRL)
	{
	  //若处于程控或定点模式下
		// controller.estimateThrustModel(imu_data.a, bat_data.volt, param);
		controller.estimateThrustModel(imu_data.a,param);
		//将imu加速度和参数输入estimateThrustModel
	}

	// STEP3: solve and update new control commands
	if (rotor_low_speed_during_land) // used at the start of auto takeoff
	{
		motors_idling(imu_data, u);
		//将推力计算入模型->起飞时使用,这也解释了为什么起飞时会飞机会飘,起飞时不使用视觉里程计
	}
	else
	{
		debug_msg = controller.calculateControl(des, odom_data, imu_data, u);
		//将推力,des,里程计数据,imu数据输入
		debug_msg.header.stamp = now_time;
		debug_pub.publish(debug_msg);
	}
  
	// STEP4: publish control commands to mavros
	//将结果发布给mavros
	if (param.use_bodyrate_ctrl)
	{
		publish_bodyrate_ctrl(u, now_time);
	}
	else
	{
		publish_attitude_ctrl(u, now_time);
	}

	// STEP5: Detect if the drone has landed
	land_detector(state, des, odom_data);
	// cout << takeoff_land.landed << " ";
	// fflush(stdout);

	// STEP6: Clear flags beyound their lifetime
	//清理标志位
	rc_data.enter_hover_mode = false;
	rc_data.enter_command_mode = false;
	rc_data.toggle_reboot = false;
	takeoff_land_data.triggered = false;
}


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

px4ctrl代码-fsm.process() 的相关文章

  • 如何在容器化世界中独特地解决“流程”?

    这是一个普遍问题 但出于争论的目的 您可以假设我们有一组通过 AMQP 和 HTTP 组合进行通信的进程 有两种具体情况需要考虑 最简单的一个 Q 如果 A 向 B 发送消息 B 如何识别 A 发送回复的位置 A A 必须以某种方式告诉 B
  • YUI 压缩机和 .NET 应用程序

    我想使用 YUI Compressor 原始版本 并将其用作典型 MS 构建过程 Visual Studio 2008 MSBuild 的一部分 有人对此有任何指导或想法吗 例如 合并到项目中的好方法 如何处理现有的 CSS 和 JS 引用
  • 无法杀死的控制台窗口

    我正在 Visual C 2008 下使用 GLUT 开发基于 OpenGL 的 2d 模拟 有时当我遇到断言 或未处理的异常并闯入调试器时 GLUT 显示窗口关闭 但控制台窗口保持打开状态 它们只是不能杀了 它们不会出现在任务管理器 进程
  • 不受信任的 URL 字符串的安全 Process.Start 实现

    我的目标是在用户默认浏览器中安全地打开网页 该网页的 URL 被视为 不受信任 将其视为使用该软件打开的文档中的链接 但该文档可能来自任何地方 并且其中的链接可能是恶意的 我想避免有人将 C Windows malicious code e
  • 从 C# .net 调用 python.py

    我在从 C 调用 python 脚本时遇到问题 我的 python 脚本根据参数 1 和参数 2 计算一个值并发送计算出的值 我无法获得计算值 比如说 我正在使用一个简单的 python 类并调用 C 以下是 python py impor
  • 如何知道gdb附加了哪个进程(stat: T)?

    当 gdb 附加进程时 该进程的 stat 为 T 例如 root 6507 0 0 0 0 67896 952 Ss 12 01 0 00 mytest root 6508 0 0 0 0 156472 7120 Sl 12 01 0 0
  • 如何启动第二个 Java 进程?

    如何启动第二个独立于平台的 Java 进程 理想情况下 它应该与当前运行的 Java 版本相同 有什么有用的系统属性吗 您可以使用java home系统属性来查找当前的 JVM String jvm new java io File new
  • 为什么 jQuery 文件上传插件的进程事件不触发?

    我对 jQuery 文件上传插件有一个奇怪的问题 如果我使用这个 SITAX fileupload fileupload url myurl add function e data console log add event process
  • Android 应用程序在调用 System.exit(0) 后不会关闭

    在添加 Admob 活动之前 我有一个运行良好的 Android 应用程序 我正在通过终止进程来关闭我的应用程序 调用 System exit 0 我知道这是完成应用程序的最糟糕的解决方案 我正在使用 OpenGL 状态和 libgdx f
  • pctl(PR_SET_PDEATHSIG) 竞争条件

    据我了解 当父进程死亡时终止子进程的最佳方法是通过prctl PR SET PDEATHSIG 至少在 Linux 上 父进程退出后如何让子进程终止 https stackoverflow com questions 284325 how
  • java中如何销毁进程

    我写了下面的代码 要从 Java 应用程序运行 bat 文件 我使用 process exec 但蝙蝠有时可能会挂起 所以我需要为此过程设置一个超时 我启动一个新线程并在线程中新建一个进程 我在线程中设置超时 并在超时时杀死线程 但我发现超
  • 如何在 ruby​​ 中后台运行多个外部命令

    给定这个 Unix shell 脚本 test sh bin sh sleep 2 sleep 5 sleep 1 wait 时间 test sh real 0m5 008s user 0m0 040s sys 0m0 000s 如何在 U
  • 如何停止supervisord.conf文件中指定的单个程序? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想使用supervisor来管理几个进程 我已经在supervisord conf文件中进行了更改 我想稍后停止一些程序 我尝试使用 s
  • C++ 进程管理 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有一个众所周知的 可移植的 好的 C 进程管理库 我发现了一个很有前途的图书馆叫做升压过程 htt
  • 进程终止时释放资源

    当进程被任务管理器等进程终止时 如何释放资源 有没有办法在进程关闭之前调用函数 如果您的进程被终止 您实际上无能为力 根据定义 杀死一个进程就是杀死它 该进程没有机会运行任何代码 这很大程度上是 设计使然 想象一下 您可以注册一个例程 当您
  • 在 Perl 中,如何从父进程向子进程发送消息(或信号),反之亦然?

    我正在编写一个管理多进程的程序 这就是我所做的 而且效果很好 但现在 我想将消息从子进程发送到父进程 反之亦然 从父进程到子进程 你知道最好的方法吗 你知道我所做的是否是我想要的正确方法 从子进程到父进程发送消息 信号或共享内存 反之亦然
  • 从 java servlet 运行长进程的最佳方法是什么?

    我想问从 java servlet 运行长进程的最佳方法是什么 我有一个网络应用程序 当客户端发出请求时 它会运行一个 servlet 该 servlet 应该从请求中获取一些参数 然后运行一个进程 这个过程可能需要很长时间 所以我需要单独
  • CreateProcess error=2,系统找不到指定的文件

    我正在用java编写一个程序 它将执行winrar并解压一个jar文件 放在h myjar jar进入文件夹h new 我的java代码是这样的 import java io File import java io IOException
  • 在 uwsgi 应用程序中运行子进程

    我正在编写一个 Django 应用程序 它需要执行长时间的异步任务 最初的想法是从执行该工作的视图启动一个子流程 并在另一个视图中监视进度 当应用程序通过以下方式启动时 这个想法运行良好manage py runserver 但是当它在 u
  • /proc/PID 文件格式

    我想从中检索一些流程信息 proc目录 我的问题如下 中的文件是否有标准格式 proc PID 例如 有这个proc PID status文件与Name t ProcName在第一行 我可以在其他地方用空格代替这个文件吗 t或者类似的东西

随机推荐

  • python 做的request模块封装工具类

    1 python 做的request模块封装工具类 记录下 xff0c 避免以后用到 import time from requests adapters import HTTPAdapter import json import requ
  • python发送email邮件

    1 使用QQ邮箱做服务转发邮 2 使用 coding utf 8 from import res import smtplib from email mime text import MIMEText from email utils im
  • MySQL实现连表查询

    一 创建相应的表 1 xff09 创建一张学生信息的表 xff0c 包含 id xff08 自增 xff09 xff0c 学号 xff0c 姓名 xff0c 性别 xff0c 身高 xff0c 体重 xff0c 备注 CREATE TABL
  • 解决Eclipses下tomcat部署端口号占用和server.xml修改之后被重置无效的问题,即使修改了也会被改回来的问题

    首先介绍一下tomcat部署的常用三个方式 xff1a 直接部署到host虚拟主机管理的目录 xff0c 通过eclipse直接发布到这个目录 需要每次启动tomcat 直接在server xml下配置Context 路径 xff0c 直接
  • Linux下安装redis及遇到的问题解决

    1 Linux安装redis wget http download redis io releases redis 5 0 3 tar gz tar xzf redis 5 0 3 tar gz cd redis 5 0 3 make 启动
  • 在spring boot中使用configuration注解无法注入bean

    1 在spring boot和spring中bean注入的方式 xff0c 基于Java类配置的 xff0c 即通过configuration注解注入 xff0c 其中遇到发现在springboot中 xff0c 无法自动注入 xff0c
  • 电路学习笔记( 一)——上拉电阻(编码器电路)

    来自于编码器接口电路 Encoder1和Encoder2经过510电阻和一个上拉10k电阻后输入到最小系统中 问题在于 xff0c 为什么要接上拉电阻 之前的知识仅理解到了拉高电压一项 xff0c 但原因不明 在单片机引脚作为输入端时 xf
  • 64位系统下运行32位程序

    现象 xff1a bash make ext4fs No such file or directory 解决 xff1a 一般出现该错误是由于应用程序是 32 位导致的 xff0c 可以使用 file 命令来查看 xff1a cpp vie
  • 安装mybatisx插件失败Fail to load plugin descriptor from file MyBatis-4.02.jar

    我想大概会有人出错的 hhhh Fail to load plugin descriptor from file MyBatis 4 02 jar 只需要把jar包改为zip格式即可 这种方式是先下载好jar包 其它博客有怎么下载
  • 4、DockerFile文件的使用

    文章目录 一 DockerFile 文件1 1 DockerFile构建过程1 1 1 基础知识1 1 2 docker执行DockerFile的大致流程 1 2 Dockerfile常见的关键字1 3 自定义镜像mycentosjava8
  • git 的使用笔记 编辑工具vscode

    vscode与git对应命令 Changes 里的文件 43 会放到 Staged Changes 61 61 git add 全部修改的文件 Staged Changes 里的文件 34 34 会撤回到Changes里 61 61 git
  • 使用Python,Opencv检测AprilTag

    这篇博客将介绍AprilTags 这是一组基准标记 通常用于机器人技术 校准和3D计算机视觉项目 通常在执行实时检测时使用AprilTags 以及密切相关的ArUco标记 AprilTags是一种基准标记 更简单地说是 标记 基准点是在捕获
  • DIY 属于自己的OPENMV4, 附openmv4部分的原理图。

    很多小白想要用AD来DIYopenmv4 xff0c 拥有属于自己DIY的openmv4 但是却没有找到好的参考资料 xff0c 现总结如下所示 现在官方还在众筹 xff0c 官方的开源的资料 xff0c 也是在三月份GitHub才向大家公
  • 30道最新Linux内核大厂面试题(含答案)

    1 Linux 中主要有哪几种内核锁 xff1f Linux 的同步机制从 2 0 到 2 6 以来不断发展完善 从最初的原子操作 xff0c 到后来 的信号量 xff0c 从大内核锁到今天的自旋锁 这些同步机制的发展伴随 Linux 从单
  • 最新腾讯等大厂c/c++后端 linux开发常见面试题汇总

    计算机操作系统 xff08 Linux xff09 1 命令 xff1a netstat tcpdump ipcs ipcrm 这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验 2 cpu 内存 硬盘 等等与系统性能调试相关的命
  • C++高性能大规模服务器开发实践

    本文摘录自腾讯高级工程师在 全球C 43 43 及系统软件技术大会 上的专题演讲 01Lego简介 首先介绍一下 CDN 非常早期的时候有一个大牛创建了一个公司叫阿卡曼 xff0c 他把服务器部署到全球各地 xff0c 然后把源站的内容缓存
  • 梯度、散度、旋度、拉普拉斯算子

    梯度 运算的对象是纯量 xff08 即标量 xff0c 只有大小 xff0c 没有方向 xff09 xff0c 运算出来的结果是向量 xff08 矢量 xff0c 既有大小 xff0c 又有方向 xff09 定义 xff1a 函数在某点的梯
  • 【VINS-Fusion-gpu在NX的部署】

    VINS Fusion gpu在NX的部署 1 移除nx中已经默认的opencv sudo apt span class token operator span get purge libopencv span class token op
  • 电机扭矩计算

    转自 xff1a http blog sina com cn s blog 521a53b001011xdl html 扭矩的定义 xff1a 垂直方向的力 到旋转中心的距离 1 电动机有一个共同的公式 xff1a P 61 M N 955
  • px4ctrl代码-fsm.process()

    主进程 初始状态为MANUAL CTRL Finite State Machine 控制系统启动 v gt 手动控制 lt gt 自动起飞