自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

方亮的专栏

方亮的专栏

  • 博客(570)
  • 资源 (2)
  • 收藏
  • 关注

原创 Robot Operating System——初探可执行文件、动态库运行模式

不管是在Windows还是在Linux操作系统中,可运行的逻辑不是存在于可执行程序中,就是存在于动态库中。如果我们的逻辑比较简单,不会频繁修改,可以直接在可执行文件中保存所有逻辑。如果我们的逻辑比较复杂,需要做模块化运行或发布,则我们可以将独立的功能放在动态库中,按需加载和运行。ROS2也是存在这两种模式。

2024-08-07 00:15:00 1411

原创 Robot Operating System——发布流体压力数据

sensor_msgs::msg::FluidPressure 是 ROS (Robot Operating System) 中的一个消息类型,用于表示流体压力数据。它通常在以下场景中使用:

2024-08-07 00:15:00 282

原创 Robot Operating System——深度解析单线程执行器(SingleThreadedExecutor)执行逻辑

在ROS2中,我们设置的各种回调都是在执行器(Executor)中执行的,所以它是整个系统非常核心的组件。目前,rclcpp 提供了三种 Executor 类型,它们派生自同一个父类Executor。本文我们将借用中的例子,将单线程执行器在最上层的使用方法总结如下。

2024-08-06 00:15:00 1148

原创 Robot Operating System——电池电量通知

/ 电池电压 (单位: 伏特)// 电池温度 (单位: 摄氏度)// 电池电流 (单位: 安培)// 电池电量 (单位: 安培小时)// 电池容量 (单位: 安培小时)// 电池设计容量 (单位: 安培小时)// 电池剩余电量百分比 (0.0 到 1.0)// 电源状态 (例如:充电中、放电中、满电等)// 电源健康状态 (例如:良好、过热、过压等)// 电源技术 (例如:锂离子、镍镉等)// 电池是否存在// 每个电池单元的电压// 每个电池单元的温度// 电池位置。

2024-08-06 00:07:37 549

原创 Robot Operating System——单线程中启动多个Node

在一文中,我们介绍了如何实现Service的客户端和服务端。在例子中,它们分别被编译成libadd_two_ints_client_async_library.so和libadd_two_ints_server_library.so,然后分别被可执行程序add_two_ints_client_async和add_two_ints_server加载。这样它们就以两个独立的进程运行起来。本文我们将介绍,如果在一个进程中,使用单线程模式运行两个Node代码。

2024-08-05 00:30:00 1388

原创 Windows Subsystem for Linux——vscode远程开发

之前我们在VMware、Hyper-V上安装Linux操作系统,然后使用vscode远程连接它们进行开发。但是WSL给我们提供了另外一种方案——直接使用vscode连接WSL虚拟机。

2024-08-05 00:15:00 480

原创 Robot Operating System——Action通信机制的服务端

Action服务端主要由3个回调构成:是否接受执行任务请求的handle_goal;是否接受终止任务请求的handle_cancel;handle_goal中返回rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE或者rclcpp_action::GoalResponse::ACCEPT_AND_DEFER后执行的handle_accepted。

2024-08-03 10:52:37 777

原创 Robot Operating System——Action通信机制概念及Client端

在ROS 2(Robot Operating System 2)中,Action是一种强大的通信机制,特别适用于需要长时间运行且需要定期反馈的任务。Action结合了话题(Topic)和服务(Service)的特性,提供了一个更加灵活和强大的方式来控制和管理机器人的复杂行为。

2024-08-03 10:52:18 921

原创 Windows Subsystem for Linux——使用宿主机器上的摄像头

即使我们使用中的方法,在远程连接时共享所有视频捕获设备也不会让我们在Ubuntu子系统中看到任何摄像头(如/dev/video0之类)这就需要我们定制WSL Kernel Linux。

2024-08-02 00:30:00 1265

原创 Windows Subsystem for Linux——定制WSL2-Linux-Kernel

WSL Linux Kernel的定制

2024-08-02 00:15:00 749

原创 Windows Subsystem for Linux——安装桌面版Ubuntu

在一文中,我们看到WSL只能安装非桌面版的Linux。但是桌面版的Linux其实是在非桌面版的基础上安装了可视化工具而已。所以基于这个思路,我们将尝试这个方案的可行性。

2024-08-01 00:30:00 393

原创 Windows Subsystem for Linux——安装多个相同的操作系统

在中,我们使用下面指令安装了Ubuntu-24.04子系统。但是分析这个命令,可以发现它指定了系统名,但是没指定虚拟机的名字。在我们需要安装三个基于Ubuntu-24.04的kubernetes Master Node的虚拟机,又要安装几台同样基于Ubuntu-24.04的kubernetes Worker Node的虚拟机时,上述方案就无法支持了。本文我们就来探索如何安装相同操作系统,不同虚拟机名称的方案。以下指令都在Powershell中执行。

2024-08-01 00:15:00 315

原创 Windows Subsystem for Linux——安装和使用

Windows Subsystem for Linux(简称WSL)是微软开发的一项极具创新性的技术,它为Windows用户提供了在无需虚拟机或双系统的情况下运行原生Linux环境的能力。这一功能极大地提升了跨平台开发的便捷性和效率,让Windows用户可以轻松体验到Linux系统的强大和灵活性。

2024-07-31 00:30:00 1099

原创 给Hyper-V的Ubuntu虚拟机启动增强会话(EnhancedSession)的方法

Hyper-V的“增强会话”功能是一项强大的技术,它极大地提升了虚拟化环境中用户与虚拟机交互的体验。这一功能特别适用于需要高效管理和操作虚拟机的场景,为管理员和终端用户提供了前所未有的便利。在启用“增强会话”模式后,用户能够享受到一系列高级特性,这些特性显著地扩展了虚拟机与宿主机之间的互操作能力。首先,它支持拖放文件功能,这意味着用户可以简单地通过拖放操作在宿主机和虚拟机之间传输文件,无需使用额外的文件传输工具,从而大大提高了数据传输的效率和便捷性。

2024-07-31 00:15:00 1399

原创 Robot Operating System——深度解析日志功能的实现

enable_logger_service会让Node启动两个Service,分别用于获取和设置Node的日志等级。在ROS2中,会通过静态变量g_rcutils_logging_severities_mapb保存不同Node的日志等级。RCLCPP_DEBUG、RCLCPP_INFO、RCLCPP_WARN、RCLCPP_ERROR和RCLCPP_FATAL第一个参数要传递Node的rclcpp::Logger的原因是:ROS2需要通过它获取名称,进而判断该Node的日志等级。

2024-07-30 00:30:00 900

原创 Robot Operating System——远程修改日志等级

在任何系统中,日志功能的重要性都是不容忽视的。日志功能为开发者、维护者甚至用户提供了一个关键的工具,以监控、理解和调试系统的行为。所以我们数量掌握日志功能非常必要。本文我们将结合demo_nodes_cpp/src/logging/use_logger_service.cpp来熟悉如何在ROS2中,远程修改日志等级,以方便工作中问题的排查。

2024-07-30 00:15:00 697

原创 Robot Operating System——内部审查(Introspection)Service

在ROS 2(Robot Operating System 2)中,内部审查(Introspection)是一种强大的功能,它允许用户和开发者查询和理解系统中的实时状态和配置。这种能力特别重要,因为它提供了一种方法来监视和调试复杂的机器人系统,从而确保系统的健康和性能。

2024-07-29 00:30:00 1339

原创 Robot Operating System——深度解析监控Parameters修改的底层实现

ParameterEventHandler包含了AsyncParametersClient的实现,且比其功能更丰富。AsyncParametersClient只能设置一个全部Parameter监控回调函数,而ParameterEventHandler可以设置多个。而且ParameterEventHandler还可以针对不同Node、不同Parameter设置多个不同的回调,但是AsyncParametersClient没有这个能力。

2024-07-29 00:15:00 1898

原创 Robot Operating System——ParameterEventHandler监控Parameters的增删改行为

AsyncParametersClient和SyncParametersClient的on_parameter_event的功能和ParameterEventHandler::add_parameter_event_callback比较类似,会通知所有Parameter的变动;

2024-07-27 00:30:00 1654

原创 Robot Operating System——AsyncParametersClient监控Parameters的增删改行为

在一文中,我们使用Node::add_post_set_parameters_callback设置一个回调函数,用于在Parameters设置成功后,执行相关后续动作,但是这种行为发生在Node内部。如果我们希望在Node外部监控Parameters变动,则可以使用SyncParametersClient或者AsyncParametersClient类的on_parameter_event方法设置一个回调函数来监控。我们分别以同步和异步的方式讲解这个功能。

2024-07-27 00:15:00 851

原创 Robot Operating System——Parameter设置的预处理、校验和成功回调

在一文中,我们通过Node的add_on_set_parameters_callback方法,设置了一个回调函数,用于校验传递过来的Parameter参数。但是这个方法并不能对传递过来的内容做预处理,只能做校验。当我们需要干涉传入的Parameters时,比如填入一些默认值或者做某些计算,则需要使用预处理程序。如果Parameters设置成功,我们还可以通过成功回调函数来做对应值变更后的逻辑计算。

2024-07-26 00:30:00 1152

原创 Robot Operating System——对Parameter设置进行校验

通过Node的add_on_set_parameters_callback设置回调函数,可以对传入的Parameters信息做预处理。如果回调函数返回的rcl_interfaces::msg::SetParametersResult::successful为true,框架就会对所有传入的Parameters做出修改;否则就放弃本次修改请求。

2024-07-26 00:15:00 701

原创 Robot Operating System——深度解析Parameter同步操作的底层实现

Parameter同步操作是通过对异步操作的封装来实现的。而在ROS2系统中,诸如spin_until_future_complete等待一个Node完整相关任务的操作,其在系统底层并不是一味地等待。而是尽量利用等待的空隙,完成一些诸如timer等可能已经被触发的行为。这样的设计虽然不能在系统上严格保证Wait时间的准确性,但是很大程度上利用了系统CPU资源,而不是让其一直IDLE。

2024-07-25 00:30:00 1399

原创 Robot Operating System——空Node的Service和Parameters

在中,我们提到Node自身作为Parameters相关Service的服务端,与我们创建的rclcpp::SyncParametersClient、rclcpp::AsyncParametersClient客户端通信。本文我们将看看一个空的Node提供了哪些默认的Service和Parameters。参考的例子是demo_nodes_cpp/src/parameters/parameter_blackboard.cpp。其内容非常简单:继承于Node类,并自动声明了Node中的Parameters。

2024-07-25 00:15:00 799

原创 Robot Operating System——取带前缀的Parameters

在一文中,我们看到如何使用get_parameters通过精确的Key来查询Parameters的值。本文将介绍一种通过前缀遍历所有符合条件的Parameters的方法。我们还是分为同步和异步两种模式来讲解。

2024-07-24 00:30:00 1262

原创 Robot Operating System——初探动态配置Parameters

本文的两个例子,分别使用SyncParametersClient和AsyncParametersClient从Node外部设置和查询Node的Parameters。实际我们在Node内部可以通过Node类中的set_parameter方法操作本Node的Parameters。

2024-07-24 00:15:00 1280

原创 Robot Operating System——Service的同步/异步通信

在ROS 2中,除了介绍的Topic,还有其他通信机制。Service就是其中一种。Service是一种同步的请求/响应通信机制。一个节点可以提供一个Service,其他节点可以请求这个Service,并等待响应。Service由Service类型定义,包括请求和响应消息。

2024-07-23 00:30:00 641

原创 Robot Operating System——深度解析“借用内存型消息”

在前期,普通消息处理会有很多智能指针以及内存分配操作;而序列化消息和借用内存型消息没有太多复杂操作。在后期,普通消息和序列化消息比借用内存型消息多了一次序列化。所以整体看,借用内存型消息的效率是最高的。

2024-07-23 00:15:00 1039

原创 Robot Operating System——借用内存型消息

在ROS 2中,"loaned message"是一种消息传递机制,用于在发布者(publisher)和订阅者(subscriber)之间传递数据。它是一种高效的消息传递方式,可以避免不必要的数据复制。在传统的ROS中,消息是通过复制的方式进行传递的,即发布者将消息复制一份发送给订阅者。这种方式在数据量较大或频繁传递消息时可能会导致性能问题。而在ROS 2中,引入了"loaned message"的概念。当发布者发送消息时,它不会直接复制消息,而是将消息的所有权(ownership)转移给订阅者。

2024-07-22 00:30:00 830

原创 bug诞生记——动态库加载错乱导致程序执行异常

这个案例发生在我研究ROS 2的测试Demo时发生的。整体现象是:修改了源码,编译也成功了,但是执行流程和没修改前一致,新代码的逻辑没有体现。最后定位到“动态库加载错乱”这个根本的问题,方案也就呼之欲出。但是整个排查过程经历了若干假设和推导,还是值得记录下。

2024-07-22 00:15:00 908

原创 Robot Operating System——深度解析序列化的实现

本案例中,std_msgs::msg::String的裸指针最终在Serialization的底层,通过std_msgs::msg::String的std::basic_string类型成员data获得其最终大小,进而保证数据复制的空间是正确的。

2024-07-21 00:30:00 1119

原创 Robot Operating System——消息的序列化和反序列化

在ROS 2中,提供了一种叫做SerializedMessage的消息。我们可以将C类型或者C++类型变量序列化后发送,然后在接收端再反序列化还原。这种方案在有别于我们常见的通过Json串进行序列化和反序列化。它在底层会使用类型的内存模型去做数据拼装,而不是转成某种可视化的字符串,所以它的效率更高些。本文我们将通过案例看看消息序列化和反序列化的使用。

2024-07-21 00:15:00 925

原创 Robot Operating System——订阅者订阅过滤消息

和很多订阅者-发布者模型的中间件类似,ROS 2也支持订阅者消息过滤功能。我们通过下面这个“温度”检测器来查看如何使用该项技术。

2024-07-20 00:30:00 680

原创 Robot Operating System——定时器

定时器是一种编程构造,用于在指定的延迟后执行一次或多次代码。定时器可以是一次性的,也就是说,它们在指定的延迟后只触发一次;或者是周期性的,意味着它们会以指定的时间间隔重复触发。在ROS 2中,定时器是重复性的,但是我们可以通过一些方法达到一次性的效果。我们通过两个例子来熟悉ROS 2中定时器的用法。

2024-07-20 00:15:00 358

原创 Robot Operating System——topic的发布和订阅

我们以demo_nodes_cpp中的listener和talker来分析如何在ROS2中定制发布和订阅机制。

2024-07-19 10:36:09 1014

原创 Robot Operating System——Ubuntu上以二进制形式安装环境

在众多ROS版本中,我们选择Jazzy Jalisco。

2024-07-19 10:35:19 347

原创 从汇编层看64位程序运行——栈保护

在中,我们看到可以通过“微操”栈空间控制程序执行流程。现实中,黑客一般会利用栈溢出改写Next RIP地址,这就会修改连续的栈空间。而编译器针对这种场景,设计了“栈保护”机制。

2024-07-17 00:30:00 965

原创 从汇编层看64位程序运行——ROP攻击以控制程序执行流程

一般我们运行有调用关系的代码,就像套娃一样,一个套着一个。比如main函数调用foo7函数,foo7调用foo函数,则main函数要先进入foo7,然后进入foo。等foo执行完,会回到foo7;等foo7执行完,再回到main。那么我们有办法脱离这种套娃模式,然后foo函数执行返回到main函数吗?当然是有的。这就需要使用ROP攻击。ROP攻击全称是:Return Oriented Programming (ROP) attacks。

2024-07-17 00:15:00 1249

原创 从汇编层看64位程序运行——所见非所写(编译器的优化),别做无用代码优化

我们发现函数的输入和输出对编译器的优化没有什么影响。但是最后一个例子我们发现,一个函数如果对外部产生影响,则其内部逻辑才不会被抛弃。编译器会按照它认为最优的方式优化代码,导致我们的C语言代码和最终编译结果在逻辑层面有非常大的差别,但是最终执行结果却是一致的。所以很多时候,我们在优化代码的时候,要深入汇编层确认后再去做,否则可能做的就是无用功,因为聪明的编译器已经帮我们优化了很多代码了。

2024-07-16 00:30:00 1007

原创 从汇编层看64位程序运行——栈帧(Stack Frame)的组成

foo10函数的栈帧起始地址就是代码执行到+120处(+118行执行完,但是+120行没执行)时的rsp寄存器的值。这就意味着call指令压栈的Next RIP也属于子函数的栈帧,而通过栈向子函数传递参数的空间则属于上一个栈帧。比如在调用超过6个参数的函数时,子函数内部就会访问到上个栈帧中的数据,以获取第6个以外的其他参数。人们只是借用它来方便表述函数在运行过程中的栈的变化。之前+105,+109,+113和+117处的压栈空间,都是属于main函数的栈帧。这四篇的讲解,栈帧的组成基本清晰了。

2024-07-16 00:15:00 355

LuaCmdTest

我用于测试的一个lua脚本,没啥用,不用下载。

2012-11-27

同步双工管道

http://blog.csdn.net/breaksoftware/article/details/7001672文中的工程

2011-11-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除