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 String

def 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 while
        rate.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 String

def 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来控制手臂的运动。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>