Cpp(Python)和MATLAB差动驱动ROS Raspberry Pi全功能机器人原型

要点

  1. 使用代码语言C++、XML、Python和YAML
  2. C++处理:创建ROS包,创建ROS节点(C++),添加自定义信息和服务文件,使用ROS服务(C++):创建ROS动作服务器和客户端(C++),创建launch文件。
  3. XML处理:机器人建模ROS包、创建统一机器人描述格式(URDF)模型并添加物理和碰撞属性、RViz可视化三维机器人模型:与平移和倾斜关节交互、转换XML宏为URDF、创建七自由度机器人描述、创建差动驱动机器人模型。
  4. XML处理:Gazebo中模拟7自由的ROS机械臂,使用深度传感器模拟机械臂,Gazebo 模拟差动轮式机器人和远程移动机器人。
  5. C++和XML处理:CoppeliaSim和Webots模拟软件模拟ROS机器人,使用ROS消息,Webots模拟移动机器人,编写移动机器人控制器文件,使用 webots_ros 编写远程操作(teleop)节点。
  6. YAML处理:使用ROS MoveIt包,使用辅助工具生成MoveIt配置包,使用MoveIt包配置RViz可视化中运动规划,使用同步定位和映射(SLAM) 构建地图并在差速驱动机器人上运行,ROS amcl 包和静态地图实现自主导航。
  7. C++和Python处理:使用 MoveIt和Gazebo 感知,使用MoveIt检测机器人碰撞和执行拾放任务,ROS连接伺服电机,ROS MoveIt连接7自由度机械臂。
  8. C/C++处理:使用Arduino-ROS接口包,ROS-Arduino发布者和订阅者示例:使用加速度计和超声波距离传感器,里程计数据发布者,Raspberry Pi和Jetson Nano安装使用ROS。
  9. C++处理:ROS视觉包处理视觉信息和点云包处理点云数据,ROS连接USB网络摄像头,发布和订阅点云数据。
  10. C++处理:制作Raspberry Pi(或单板计算机)差动驱动 ROS 移动机器人:里程计、激光扫描器或视觉传感器、直流减速电机编码器、电机驱动器、驱动控制电路板、光电测量范围仪、Raspberry Pi 2相机、Raspberry Pi 4主板、Wi-Fi模块、陀螺仪。配置导航栈执行同步定位和映射(SLAM)和自适应蒙特卡罗定位
  11. C++和XML处理:创建Gazebo插件,创建基础世界域插件。
  12. C++处理:ROS控制器接口包,创建和编辑控制器接口包,在Gazebo中执行7自由度机械臂,使用RViz可视化面板,编辑RViz遥控插件
  13. MATLAB Simulink 中模拟ROS,MATLAB和Gazebo开发ROS应用,Simulink中发布ROS消息和订阅主题。

机器人编程

如您所知,机器人是一种带有传感器、执行器(电机)和计算单元的机器,它根据用户控制进行操作,或者可以根据传感器输入做出自己的决策。 可以说,机器人的大脑是一个计算单元。 它可以是微控制器或个人电脑。 机器人的决策和行动完全取决于运行机器人大脑的程序。 该程序可以是在微控制器上运行的固件,也可以是在个人电脑或单板计算机(如 Raspberry Pi)上运行的 C/C++ 或 Python 代码。 机器人编程是通过为机器人的大脑(即处理单元)编写程序使机器人工作的过程。

任何机器人的主要组件都是执行器和传感器。 执行器移动机器人的关节,提供旋转或线性运动。 伺服、步进和直流齿轮电机都是执行器品牌。 传感器提供机器人的状态和环境。 机器人传感器的示例包括车轮编码器、超声波传感器和摄像机。

执行器由电机控制器控制并与微控制器/PLC(可编程逻辑控制器)连接。 一些执行器通过 PC 的 USB 直接控制。 传感器还与微控制器或个人电脑连接。 超声波传感器和红外传感器与微控制器连接。 相机和激光扫描仪等高端传感器可以直接与 PC 连接。 有一个电源/电池为所有机器人组件供电。 有一个紧急停止按钮可以停止/重置机器人的操作。 机器人内部编程的两个主要部分是 PC 和微控制器/PLC。 PLC主要应用于工业机器人。

简而言之,我们可以说机器人编程是对机器人内部的 PC/SBC 和微控制器 PCL 进行编程,以使用执行器和各种传感器的反馈来执行特定的应用程序。 机器人应用包括拾取和放置物体、将机器人从A移动到B。多种编程语言可以对机器人进行编程。 C/C++、Python、Java、C# 等用于 PC。 微控制器使用嵌入式 C、Arduino 中使用的接线语言(基于 C++)和 Mbed 编程 。 工业机器人应用程序使用 SCADA 或供应商专有的编程语言,例如 ABB 和 KUKA。 该编程是通过工业机器人的示教器完成的。 RAPID 是 ABB 工业机器人用于自动化机器人应用的编程语言。

机器人编程为机器人创造了智能,用于自我决策、实施 PID 等控制器来移动关节、自动执行重复任务以及创建机器人视觉应用程序。

任何编程语言都可以对机器人进行编程,但良好的社区支持、性能和原型设计时间使 C++ 和 Python 成为最常用的语言。

以下是机器人编程所需的一些功能:

  • 线程:机器人中有许多传感器和执行器。 我们可能需要一种多线程兼容的编程语言,以便在不同线程中处理不同的传感器和执行器。 这称为多任务处理。 每个线程可以相互通信以交换数据。
  • 高级面向对象编程:正如您所知,面向对象编程语言更加模块化,代码可以轻松重用。 与非面向对象的编程语言相比,代码维护也很容易。 这些品质为机器人创造了更好的软件。
  • 低级设备控制:高级编程语言还可以访问低级设备,例如GPIO(通用输入/输出)引脚,串行端口、并行端口、USB、SPI 和 I2C。 编程语言C/C++ 和 Python 等都可以控制低级设备,这就是为什么这些语言更喜欢像 Raspberry Pi 这样的单板计算机。
  • 原型设计的难易程度:机器人算法原型设计的难易程度绝对是选择编程语言的一个选择。 Python 是快速构建机器人算法原型的不错选择。
  • 进程间通信:机器人有很多传感器和执行器。 我们可以使用多线程架构或者编写一个独立的程序来完成每个任务; 例如,一个程序从相机拍摄图像并检测人脸,另一个程序将数据发送到嵌入式板。 这两个程序可以相互通信以交换数据。 此功能创建多个程序而不是多线程系统。 多线程系统比并行运行多个程序更复杂。 套接字编程是进程间通信的一个例子。
  • 性能:如果我们使用高带宽传感器,例如深度相机和激光扫描仪,处理数据所需的计算资源显然很高。 好的编程语言只需分配合适的计算资源,而不需要加载计算资源。 C++ 语言是处理此类场景的不错选择。
  • 社区支持:在选择任何编程语言进行机器人编程时,请确保该语言有足够的社区支持,包括论坛和博客。
  • 第三方库的可用性:第三方库的可用性可以让我们的开发变得简单; 例如,如果我们想做图像处理,我们可以使用像OpenCV这样的库。 如果你的编程语言有OpenCV支持,那么做图像处理应用就更容易了。
  • 现有的机器人软件框架支持:现有的机器人软件框架(例如ROS)可以对机器人进行编程。 如果您的编程语言支持 ROS,那么构建机器人应用程序原型会更容易。

ROS

ROS 是一个免费的开源机器人软件框架,可用于商业和研究应用。 ROS框架提供以下机器人编程功能:

  • 进程之间的消息传递接口:ROS提供了消息传递接口来在两个程序或进程之间进行通信。 例如,相机处理图像并找到图像中的坐标,然后将这些坐标发送到跟踪器进程。 跟踪器进程通过使用电机来跟踪图像。 如前所述,这是机器人编程所需的功能之一。 它被称为进程间通信,因为两个进程正在相互通信。
  • 类似操作系统的功能:顾名思义,ROS 并不是一个真正的操作系统。 它是一个提供一些操作系统功能的元操作系统。 这些功能包括多线程、低级设备控制、包管理和硬件抽象。 硬件抽象层使程序员能够对设备进行编程。 优点是我们可以为不同供应商以相同方式工作的传感器编写代码。 所以,当我们使用新的传感器时,我们不需要重写代码。 包管理帮助用户以称为包的单元来组织软件。 每个包都有用于特定任务的源代码、配置文件或数据文件。 这些软件包可以分发并安装在其他计算机上。
  • 高级编程语言支持和工具:ROS的优势在于它支持机器人编程中使用的流行编程语言,包括C++、Python和Lisp。 对 C#、Java、Node.js 等语言提供实验性支持。 ROS 为这些语言提供了客户端库,这意味着程序员可以使用所提到的语言获得 ROS 功能。 例如,如果用户想要实现使用 ROS 功能的 Android 应用程序,则可以使用 rosjava 客户端库。 ROS 还提供了构建机器人应用程序的工具。 有了这些工具,我们可以用一个命令构建许多包。 这种灵活性有助于程序员花更少的时间为其应用程序创建构建系统。
  • 第三方库的可用性:ROS框架集成了最流行的第三方库; 例如,针对机器人视觉集成了OpenCV,针对3D机器人感知集成了PCL。 这些库使 ROS 变得更强大,程序员可以在其上构建强大的应用程序。
  • 现成的算法:这是一个有用的功能。 ROS 已经实现了流行的机器人算法,例如 PID 、SLAM(同时定位和建图)以及路径规划器,例如 A *、Dijkstra 和 AMCL(自适应蒙特卡罗本地化)。 ROS 中的算法实现列表还在继续。现成的算法减少了机器人原型设计的开发时间。
  • 易于原型设计:ROS 的优势之一是现成的算法。 除此之外,ROS 还拥有可以轻松地与任何机器人重复使用的软件包; 例如,我们可以通过定制 ROS 存储库中现有的移动机器人包来轻松原型化我们自己的移动机器人。 我们可以轻松地重用 ROS 存储库,因为大多数软件包都是开源的,并且可重用于商业和研究目的。 因此,这可以减少机器人软件开发时间。
  • 广泛的工具和模拟器:ROS 使用许多命令行和 GUI 工具构建,用于调试、可视化和模拟机器人应用程序。 这些工具对于使用机器人非常有用。

Python编程ROS

为了演示 ROS 消息系统如何在机器人系统中进行通信,我们可以编写一段简单的 Python 代码来实现两个 ROS 节点:一个用于发布消息,一个用于订阅消息。

以下是发布者节点的代码:

import rospy
from std_msgs.msg import Stringdef publisher():rospy.init_node('publisher', anonymous=True)pub = rospy.Publisher('object_detection', String, queue_size=10)rate = rospy.Rate(1)while not rospy.is_shutdown():message = "Object detected at location (x, y)"pub.publish(message)# Sleep for a whilerate.sleep()if __name__ == '__main__':try:publisher()except rospy.ROSInterruptException:pass

在这段代码中,我们首先导入必要的ROS库,包括用于初始化节点的rospy和用于定义消息类型的String。然后,我们定义发布者函数,该函数用名称初始化节点并为“object_detection”主题创建发布者。我们还将发布消息的速率设置为每秒一次。

在 while 循环中,我们定义要发布的消息,在本例中是一个简单的字符串,指示传感器检测到的对象的位置。然后,我们使用 pub.publish() 方法将消息发布到“object_detection”主题。

最后,我们将发布者函数包装在 try-except 块中以处理可能发生的任何异常。

这是订阅者节点的代码:

import rospy
from std_msgs.msg import Stringdef subscriber(data):rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)def listener():rospy.init_node('subscriber', anonymous=True)rospy.Subscriber('object_detection', String, subscriber)rospy.spin()if __name__ == '__main__':listener()

在此代码中,我们导入必要的 ROS 库并定义订阅者函数,每当在“object_detection”主题上收到消息时就会调用该函数。在订阅者函数中,我们只需使用 rospy.loginfo() 方法打印接收到的消息。然后,我们定义侦听器函数,该函数用名称初始化节点并为“object_detection”主题创建订阅者。我们还调用 rospy.spin() 方法来保持节点运行并监听消息。

ROS 提供了一套用于控制机器人系统的工具,包括电机、伺服系统和其他执行器的控制器。 ROS 还包括用于路径规划、运动控制和导航的工具。为了演示如何使用 ROS 来控制机器人系统,我们可以编写一个简单的 Python 代码,使用 ROS 控制器来控制机器人手臂。首先,我们需要安装控制机器人手臂所需的 ROS 软件包。在这个例子中,我们将使用 ros_control 和 ros_controllers 包。

安装软件包后,我们可以为机器人手臂控制代码创建 ROS 软件包,并添加必要的文件和配置。 在包中,我们将创建一个启动文件来启动控制器,以及一个配置文件来配置控制器和机器人手臂。

这是启动控制器的示例启动文件:

<launch><arg name="robot_description" default="$(find robot_arm_control)/urdf/robot_arm.urdf" /><param name="robot_description" textfile="$(arg robot_description)" /><node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" args="joint_state_controller robot_state_publisher"/><node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" respawn="false" output="screen"><param name="use_gui" value="false"/></node><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="false" output="screen"><param name="publish_frequency" value="30.0"/></node><node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false" output="screen" args="joint_trajectory_controller"/>
</launch>

在此代码中,我们启动controller_manager包来生成控制器,并启动joint_state_publisher和robot_state_publisher节点来发布机器人手臂的状态。 我们还启动joint_trajectory_controller来控制手臂的运动。

参阅一:计算思维
参阅二:亚图跨际

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis的Lua脚本

Redis提供了Lua脚本功能&#xff0c;在一个脚本中编写多条Redis命令&#xff0c;确保多条redis命令执行时的原子性。&#xff08;让判断线程标识和释放锁原子执行&#xff09; 1.下载lua插件 2.创建lua文件 3.调用lua脚本 public void unlock() {//调用lua脚本原子性的判断线…

CSS中元素的层叠顺序

层叠顺序&#xff0c;英文称作 stacking order&#xff0c;表示元素发生层叠时有着特定的垂直显示顺序。下面是盒模型的层叠规则&#xff1a; 对于上图&#xff0c;由上到下分别是&#xff1a; &#xff08;1&#xff09;背景和边框&#xff1a;建立当前层叠上下文元素的背景…

【Qt】四种绘图设备详细使用

绘图设备有4个: **绘图设备是指继承QPainterDevice的子类————**QPixmap QImage QPicture QBitmap(黑白图片) QBitmap——父类QPixmapQPixmap图片类&#xff0c;主要用来显示&#xff0c;它针对于显示器显示做了特殊优化&#xff0c;依赖于平台的&#xff0c;只能在主线程…

Linux系统——web服务拓展练习

目录 一、实验环境搭建 1. Centos 7-5——Client 2. Centos 7-1——网关服务器 3. Centos 7-2——Web1 4. Centos 7-3——Web2 5. Centos 7-4——Nginx 二、在Nginx服务器上搭建LNMP服务&#xff0c;并且能够对外提供Discuz论坛服务&#xff1b;在Web1、Web2服务器上搭建…

数据集下载汇总

国家数据网 https://data.stats.gov.cn/ 国家数据是国家统计局发布统计信息的网站&#xff0c;包含了我国经济、民生、农业、工业、运输、旅游、教育、科技、卫生等多个方面的数据&#xff0c;并且在月度、季度、年度都有覆盖&#xff0c;较为全面和权威&#xff0c;对于社会…

【数据库-黑马笔记】基础-函数和约束

本文参考b站黑马数据库视频,总结详细全面的笔记 ,可结合视频观看27~36集 MYSQL 的基础知识框架如下 目录 一、 函数 1、字符串函数 2、数值函数 3、日期函数 4、流程函数 5、小结: 二、约束 1、概述 2、 约束演示 3、外键约束 4、外键删除更新行为 5、小结: …

如何查看自己电脑显卡的内存

ctrlaltdelete 打开任务管理器&#xff0c;然后打开性能页面,你会看到一个GPU内存&#xff0c;这个是自己GPU的内存&#xff0c;也叫专用GPU内存&#xff0c;而那个共享GPU 内存是不够用的时候借用电脑的内存。 下面是专用GPU内存和共享GPU内存的具体区别 专用GPU内存和共享GPU…

HarmonyOS 数据持久化 关系型数据库之 增删改逻辑编写

好 上文 HarmonyOS 数据持久化 关系型数据库之 初始化操作 我们讲了 关系型数据库初始化 那么 本文 我们来编写 增删改 相关代码 打开我们的项目 打开到 我们之前写的这个 relationalClass 类 然后 我们在 initTaskDB 下面再定义一个函数 叫 addTask 的函数 用来执行添加逻辑 …

【论文笔记】Mamba: Linear-Time Sequence Modeling with Selective State Spaces

原文链接&#xff1a;https://arxiv.org/abs/2312.00752 1. 引言 基石模型&#xff08;FM&#xff09;的主干网络通常是序列模型&#xff0c;处理任意的输入序列。但现代FM主要基于Transformer这一序列模型&#xff0c;及其核心的注意力。但是&#xff0c;自注意力仅能在上下…

EVMProxyInspect:一款功能强大的多链EVM代理检测工具

关于EVMProxyInspect EVMProxyInspect是一款针对以太坊EVM代理的检测工具&#xff0c;该工具可以帮助广大研究人员在多链生态中检测EVM代理。 该工具能够展示类似etherscan这样的工具是如何检测代理的&#xff0c;并且允许我们自行进行代理检测。需要注意的是&#xff0c;该工…

Python:在 Ubuntu 上安装 pip的方法

目录 1、检测是否已安装pip 2、更新软件源 3、安装 4、检测是否安装成功 pip和pip3都是Python包管理工具&#xff0c;用于安装和管理Python包。 在Ubuntu上&#xff0c;pip和pip3是分别针对Python2和Python3版本的pip工具。 pip3作用&#xff1a;自动下载安装Python的库文…

网络安全攻防演练:提升应急响应能力的关键步骤

01、全力以赴&#xff0c;一切为了客户更好的安全 &#xff08;1&#xff09;满足合规要求 网络安全法、地方性法规、等保2.0相关标准等均对此有明确的要求。 &#xff08;2&#xff09;了解安全“真实”现状 “真实”是我们认识事务的终极目标&#xff0c;如果我们能更真实地…

Linux(Centos7)安装Docker 教程

目录 1&#xff0c;卸载旧版本2&#xff0c;安装docker软件包3,设置镜像仓库地址4,安装最新版Docker Engine容器5&#xff0c;启动Docker 要安装Docker Engine&#xff0c;您需要CentOS 7或8的维护版本。不支持或未测试存档版本。 1&#xff0c;卸载旧版本 sudo yum remove do…

webUI自动化之元素及浏览器操作

一、元素定位方式 1、元素属性定位&#xff1a; 1 element driver.find_element_by_id(self, id)    该类方法已经过时&#xff0c;新的方法如下&#xff1a; element driver.find_element(By.ID, ID 值)        # 用元素的 ID 属性定位element driver.find_eleme…

C++ 疑难点

C疑难点 this指针 调用成员函数时&#xff0c;成员函数通过一个名为 this 的隐式参数来访问调用它的那个对象&#xff0c;用请求该函数的对象地址初始化 this &#xff0c;this 的指向总是自己这个对象&#xff0c;所以 this 是一个常量指针 Box* get_address() //得到thi…

一大波你可能不知道的 Linux 网络工具

如果要在你的系统上监控网络&#xff0c;那么使用命令行工具是非常实用的&#xff0c;并且对于 Linux 用户来说&#xff0c;有着许许多多现成的工具可以使用&#xff0c;如&#xff1a;nethogs, ntopng, nload, iftop, iptraf, bmon, slurm, tcptrack, cbm, netwatch, collectl…

idea:springboot项目搭建

目录 一、创建项目 1、File → New → Project 2、Spring Initializr → Next 3、填写信息 → Next 4、web → Spring Web → Next 5、填写信息 → Finish 6、处理配置不合理内容 7、注意事项 7.1 有依赖包&#xff0c;却显示找不到依赖&#xff0c;刷新一下maven 7.…

linux系统docker历史以及对虚拟机的区别

docker历史及与容器的区别 docker容器历史对paas降维打击容器和虚拟机的区别容器应用场景 docker容器历史 容器概念始于 1979 年提出的 UNIX chroot&#xff0c;它是一个 UNIX 操作系统的系统调用&#xff0c;将一个进程及其子进程的根目录改变到文件系统中的一个新位置&#…

社交媒体的未来图景:探索Facebook的数字化之旅

随着科技的迅猛发展&#xff0c;数字化社交已经成为了我们日常生活中不可或缺的一部分。在这个数字化时代&#xff0c;社交媒体平台扮演着重要角色&#xff0c;其中Facebook作为社交媒体的先锋&#xff0c;不断探索创新之路&#xff0c;引领着数字化社交的未来发展。本文将深入…

CF1520 Round 719 (Div. 3) 补题报告

Codeforces Round 719 (Div. 3) A. Do Not Be Distracted! A. 不要分心&#xff01; 题意 给定一个字符串&#xff0c;相同的字母只能相互连接出现&#xff0c;不得出现后再次单独出现&#xff0c;判断字符串是否合规 思路 用桶记录字符出现的次数&#xff0c;判断再次出…