ROS_Python编程 之 案例代码核心解析(第三版)

QR 码视觉追踪案例分享:如何轻松将Python 集成到 ROS 中 本文通过使用myCobot机械臂进行QR码视觉追踪的实践案例分析,介绍如何将 python 文件导入到 ROS 系统中。 阅读详情

ROS_Python编程 之 案例代码核心解析(第三版)

时隔有一段时间咯,忙着学习课内知识还有ros重要框架、接口,代码方面稍有懈怠,请大家见谅哈。通过Handsfree mini机器人平台配套的中级教程,我对ros_python 自主巡逻案例 的知识做以下归纳:

4. 自主巡逻案例

handsfree mini 机器人工控机自带的ros系统有一份代码,是 multi_point_patrol.py,代码如下:

#!/usr/bin/env python
import tf
import math
import smach
import rospy
import actionlib
import geometry_msgs
import move_base_msgs.msg
import tf.transformations


def gen_new_movebase_goal(frame_id,
                          target_x,
                          target_y,
                          next_target_x,
                          next_target_y):
    goal = move_base_msgs.msg.MoveBaseGoal()
    goal.target_pose.header.frame_id = frame_id
    goal.target_pose.header.stamp = rospy.Time.now()
    goal.target_pose.pose.position.x = target_x
    goal.target_pose.pose.position.y = target_y

    # to make our robot face the next target point,
    # when we arrive the target point

    target_yaw = (math.atan2(next_target_y - target_y, next_target_x - target_x) % (math.pi*2))
    # 二维平面中的欧拉角只有偏航角yaw,翻滚角、俯仰角均为0
    target_quaternion = tf.transformations.quaternion_from_euler(0, 0, target_yaw) 
    goal.target_pose.pose.orientation.x = target_quaternion[0]
    goal.target_pose.pose.orientation.y = target_quaternion[1]
    goal.target_pose.pose.orientation.z = target_quaternion[2]
    goal.target_pose.pose.orientation.w = target_quaternion[3]
    return goal


class MoveToPoint(smach.State):
    def __init__(self, target_x, target_y, next_target_x, next_target_y):
        smach.State.__init__(self, outcomes=['next_point'])
        self.__target_x = target_x
        self.__target_y = target_y
        self.__next_target_x = next_target_x
        self.__next_target_y = next_target_y

    def execute(self, ud):
        goal = gen_new_movebase_goal('map',
                                     self.__target_x,
                                     self.__target_y,
                                     self.__next_target_x,
                                     self.__next_target_y)
        server_movebase.send_goal(goal)
        # todo: what should robot do when failed to finish the target point?
        is_server_availabel = server_movebase.wait_for_result()
        if is_server_availabel is False:
            return 'error_exit'
        else:
            return 'next_point'


if __name__ == '__main__':
    rospy.init_node('smach_serial_demo2',log_level=rospy.DEBUG)
    server_movebase = actionlib.SimpleActionClient('/move_base', move_base_msgs.msg.MoveBaseAction)
    connect_state = server_movebase.wait_for_server()
    points = [[10.58,35.83],  # target point 1  only need x and y
              [8.88,12.18],  # target point 2
              [18.04,21.29],  # target point 3
              [18.75,36.58]]  # target point 4
    if connect_state is not True:
        # please to ensure weather your move_base server is opened?
        rospy.logerr('can not connect to move_base server')
        exit(-1)
    rospy.logdebug('move base connect successfully!')
    size_points = len(points)
    name_target_point = ""
    name_next_target_point = ""
    smach_serial_demo2 = smach.StateMachine(outcomes=['successful'])
    with smach_serial_demo2:
        # to point in points list into state machine
        for target_point in range(0, size_points, 1):
            next_target_point = (target_point+1) % size_points
            name_target_point = 'POINT%d' % target_point
            name_next_target_point = 'POINT%d' % next_target_point
            smach.StateMachine.add(name_target_point,
              MoveToPoint(target_x=points[target_point][0],
                          target_y=points[target_point][1],
                          next_target_x=points[next_target_point][0],
                          next_target_y=points[next_target_point][1]),
                          transitions={'next_point': name_next_target_point})
    smach_serial_demo2.execute()
    rospy.loginfo("HandsFree smach_serial_demo 2 finish!")

其中,精髓如下:

# 精髓1 
smach_serial_demo2 = smach.StateMachine(outcomes=['successful'])

# 解析1 因地制宜地应用了smach状态机
# 在收到一个任务时,第一步也是最重要的一步,即进行准确完整的需求分析:在自主巡逻案例中,需求即让机器人在四个固定目标点之间按照固定顺序进行循环运动:1->2->3->0->1->2->……,在做完需求分析之后,不可避免要进行方案分析:在自主巡逻案例中,机器人需要执行复杂的计划,其中包含多种可以被明确描述的状态和状态转换,这不禁让人联想到 smach状态机

# 解析2 smach状态机知识提点及较复杂的smach状态机案例剖析

【 以下部分内容出自 ROS 重要框架、接口学习资源小汇总 中的 ROS进阶——SMACH状态机 (注:若侵权,请告知删除) 】

smach的使用:

Containers(容器):包含状态

  • StateMachine容器
  • Concurrence容器
  • Sequence容器
  • Iterator容器
  • 用actionlib封装容器

states(状态):基本操作单元

  • state通用状态
  • CBState
  • SimpleActionState(ROS)
  • ServiceState(ROS)
  • MonitorState(ROS)

容器:

StateMachine:

from smach import State,StateMachine

# define state Foo
# 继承通用状态,构建Foo状态
class Foo(State):
 def __init__(self):
     State.__init__(self, 
                    outcomes=['outcome1','outcome2'],
                    input_keys=['foo_counter_in'],
                    output_keys=['foo_counter_out'])
     self.counter = 0

 # 响应调用的函数
 def execute(self, userdata):
     rospy.loginfo('Executing state FOO')
     if self.counter < 3:
         self.counter += 1
         return 'outcome1'
     else:
         return 'outcome2'

# define state Bar
class Bar(State):
 def __init__(self):
     State.__init__(self, outcomes=['outcome1'])

 def execute(self, userdata):
     rospy.loginfo('Executing state BAR')
     return 'outcome1'

class main():
     rospy.init_node('smach_example_state_machine')

 # Create a SMACH state machine
 sm = StateMachine(outcomes=[])

 # Open the container
 with sm:
     # Add states to the container
     StateMachine.add('FOO', 
                       Foo(), 
                       transitions={'outcome1':'BAR', 
                                    'outcome2':'outcome4'},
                       remapping={'foo_counter_in':'sm_counter', 
                                  'foo_counter_out':'sm_counter'})
     StateMachine.add('BAR', 
                      Bar(), 
                      transitions={'outcome1':'FOO'})

     # 内部监视器
     intro_server = IntrospectionServer('sm_IntrospectionServer', sm, '/SM_ROOT')
     intro_server.start()

     # Execute the state machine
     sm_outcome = sm_vison_work.execute()

     rospy.spin()

     intro_server.stop()

说明:

  1. 初始化:
__init__(self, outcomes, input_keys=[], output_keys=[])
  • outcomes,转移
  • input_keys,输入值
  • output_keys,输出值
  1. 添加状态:
add(label, state, transitions=None, remapping=None)
  • label,状态名字
  • state,状态
  • transitions,状态机状态跳转
  • remapping,状态机的输入输出映射到整体空间中,用于数据传递,input_keys为输入,output_keys为输出

Concurrence:并行状态机

import roslib; roslib.load_manifest('smach_tutorials')
import rospy
import smach
import smach_ros

# define state Foo
class Foo(smach.State):
    def __init__(self):
        smach.State.__init__(self, outcomes=['outcome1','outcome2'])
        self.counter = 0

    def execute(self, userdata):
        rospy.loginfo('Executing state FOO')
        if self.counter < 3:
            self.counter += 1
            return 'outcome1'
        else:
            return 'outcome2'

# define state Bar
class Bar(smach.State):
    def __init__(self):
        smach.State.__init__(self, outcomes=['outcome1'])

    def execute(self, userdata):
        rospy.loginfo('Executing state BAR')
        return 'outcome1'

# define state Bas
class Bas(smach.State):
    def __init__(self):
        smach.State.__init__(self, outcomes=['outcome3'])

    def execute(self, userdata):
        rospy.loginfo('Executing state BAS')
        return 'outcome3'

def main():
    rospy.init_node('smach_example_state_machine')

    # Create the top level SMACH state machine
    sm_top = smach.StateMachine(outcomes=['outcome6'])

    # Open the container
    with sm_top:
        smach.StateMachine.add('BAS', Bas(),
                               transitions={'outcome3':'CON'})

        # Create the sub SMACH state machine
        sm_con = smach.Concurrence(outcomes=['outcome4','outcome5'],
                                   default_outcome='outcome4',
                                   outcome_map={'outcome5':
                                       { 'FOO':'outcome2',
                                         'BAR':'outcome1'}})

        # Open the container
        with sm_con:
            # Add states to the container
            smach.Concurrence.add('FOO', Foo())
            smach.Concurrence.add('BAR', Bar())

        smach.StateMachine.add('CON', sm_con,
                               transitions={'outcome4':'CON',
                                            'outcome5':'outcome6'})

    # Execute SMACH plan
    outcome = sm_top.execute()

if __name__ == '__main__':
    main()

函数说明:

  1. 初始化
__init__(self, outcomes, default_outcome, input_keys=[], output_keys=[], outcome_map={}, outcome_cb=None, child_termination_cb=None)
  • outcome_map,指定基于其子结果确定并发结果的策略,即可根据多个子结果的组合输出指定输出,若映射没有满足,则返回default_outcome

  • outcome_cb,called once when the last child state terminates. This callback returns the outcome of the concurrence state machine

  • child_termination_cb,called every time one of the child states terminates. In the callback function you can decide if the state machine should keep running (return False), or if it should preempt all remaining running states (return True)

  1. 添加状态
add(label, state, remapping={})
  • 和StateMachine类似,但少了transitions,这部分通过outcome_map实现

具体流程说明:(注意:区分状态和状态机;状态的outcomes是转移,状态机的outcomes是输出!!!)

  1. sm_top = smach.StateMachine(outcomes=[‘outcome6’])

37

  1. smach.StateMachine.add(‘BAS’, Bas(),transitions={‘outcome3’:‘CON’})

38

  1. sm_con = smach.Concurrence( outcomes=[‘outcome4’,‘outcome5’],
    default_outcome=‘outcome4’,
    outcome_map={‘outcome5’:
    { ‘FOO’:‘outcome2’, ‘BAR’:‘outcome1’}} )

39

  1. smach.Concurrence.add(‘FOO’, Foo())

  2. smach.Concurrence.add(‘BAR’, Bar())

40

  1. smach.StateMachine.add( ‘CON’, sm_con,
    transitions={‘outcome4’:‘CON’,
    ‘outcome5’:‘outcome6’} )

41

# 解析3 自主巡逻案例中的状态机
    with smach_serial_demo2:
        # to point in points list into state machine
        for target_point in range(0, size_points, 1):
            next_target_point = (target_point+1) % size_points
            name_target_point = 'POINT%d' % target_point
            name_next_target_point = 'POINT%d' % next_target_point
            smach.StateMachine.add(name_target_point,
                   MoveToPoint(target_x=points[target_point][0],
                               target_y=points[target_point][1],
                               next_target_x=points[next_target_point][0],
                               next_target_y=points[next_target_point][1]),
                               transitions={'next_point': name_next_target_point})

class MoveToPoint(smach.State):
    def __init__(self, target_x, target_y, next_target_x, next_target_y):
        smach.State.__init__(self, outcomes=['next_point'])
        self.__target_x = target_x
        self.__target_y = target_y
        self.__next_target_x = next_target_x
        self.__next_target_y = next_target_y

# 解析3.1 
smach.State.__init__(self, outcomes=['next_point'])
# 在 for target_point in range(0, size_points, 1): 循环中,每调用一次MoveToPoint(),都会为 状态机smach_serial_demo2 的新状态定义 转移next_point

# 解析3.2
for target_point in range(0, size_points, 1):
    next_target_point = (target_point+1) % size_points
    name_target_point = 'POINT%d' % target_point
    name_next_target_point = 'POINT%d' % next_target_point
# target_point: 			0 -> 1 -> 2 -> 3
# next_target_point: 		1 -> 2 -> 3 -> 0
# name_target_point: 		'POINT0' -> 'POINT1' -> 'POINT2' -> 'POINT3'
# name_next_target_point:   'POINT1' -> 'POINT2' -> 'POINT3' -> 'POINT0'

因此,此案例中的自主巡逻路径如下:

42

# 解析3.3
smach.StateMachine.add(name_target_point,
                       MoveToPoint(target_x=points[target_point][0],
                                   target_y=points[target_point][1],
                                   next_target_x=points[next_target_point][0],
                                   next_target_y=points[next_target_point][1]),
                      transitions={'next_point': name_next_target_point})

因此,此案例中构成的状态机如下:

43

Python在ROS2开发核心通信接口详解 本文系统介绍了ROS2开发中的Python通信工具与实现方法。主要内容包括:1)常用通信工具整理,涵盖串口、网络、Web等协议支持工具及适用场景;2)ROS2核心通信接口详解,包括定时器、文件操作、串口/以太网通信等实现代码;3)高级通信模式如多节点同步、零拷贝优化;4)性能优化策略及多线程实现;5)机器人通信网关实战案例。文章还总结了Python在ROS2开发中的最佳实践、性能关键点和未来发展趋势,为开发者提供了全面的技术参考。 阅读详情

相关推荐

ROS2发展历程与Python编程实战指南

摘要:ROS2作为新一代机器人操作系统,通过DDS通信架构实现去中心化设计,解决了ROS1的单点故障和实时性等问题。本文详细介绍了ROS2的发展历程、Python开发环境配置、面向对象编程实践以及节点开发深度技巧。重点内容包括:基于Python的异步编程模型、类型注解强化、OOP封装模式、通信机制解析、参数动态管理等工程化实践。同时提供了SLAM导航机器人项目实战案例,涵盖系统架构、核心代码实现及性能优化方案展望ROS2与Python融合开发的未来趋势,强调异步化整合和AI模型部署优化将成为发展方向。

bother3000的博客 1080

ROS笔记七(基于Python、Kinetic):通信机制——动作(action)

前言: 动作使用话题实现,其本质上相当于一个规定了一系列话题(目标、结果、反馈等)的组合使用方法的高层协议。相较于服务的同步通信机制,动作机制则是异步的。动作适用于大部分请求/响应式交互场景,尤其是执行过程不能立即完成。 catkin_ws工作空间下my_code程序包里的文件目录结构: 1.定义一个动作服务器: ...

java0fu的博客 1485

ROS与ROS2的区别、Python2和Python3之间差异

ROS(Robot Operating System)和ROS2(Robot Operating System 2)是由Open Robotics开发的机器人操作系统,它们都是用于构建机器人应用程序的开源平台。尽管它们具有相似的目标,但在设计、功能、性能以及兼容性等方面存在显著的区别。

FL1717的博客 1217

python机器人开发教程_ROS与Python入门教程-actionlib-开发简单的action服务端

ROS与Python入门教程-actionlib-开发简单的action服务端说明使用simple_action_server库创建Python的Fibonacci(斐波那契数列)action服务端计算Fibonacci数列的顺序,得到计算后的数列介绍actionlib_tutorials/simple_action_servers/fibonacci_server.py代码#! /usr/bin...

weixin_39873741的博客 509

ROS2中的Python编程完全指南:从零基础到机器人开发实战

本文介绍了Python编程与ROS2机器人开发的核心内容。首先讲解了Python基础语法,包括数据类型、控制流、函数定义和面向对象编程。然后详细说明了ROS2开发环境搭建步骤,包括Ubuntu系统配置、ROS2安装和工具链设置。重点阐述了ROS2节点创建、四种通信机制(话题/服务/动作/参数)的实现方法,以及面向对象在ROS2中的高级应用。最后通过智能巡逻机器人实战项目,展示了系统架构设计、关键代码实现和调试优化技巧。文章还提供了进阶学习路径和常用Python库推荐,强调Python在ROS2开发中的高效性

bother3000的博客 1539

1 ROS2编程基础

全面介绍ROS(Robot Operating System)的使用,包括基础概念、安装配置、编程技巧以及在机器人开发中的实际应用。掌握基于ROS的机器人软件开发能力,并能够利用ROS进行机器人的感知、决策和控制。

weixin_58199582的博客 1905

ROS python教程-actionlib-编写简单的action客户端及服务器

适用环境 ROS中的服务service是一问一答的形式,你来查询了,我就返给你要的信息。 action也有服务的概念,但是它不一样的地方是:不是一问一答,而多了一个反馈,它会不断反馈项目进度。如navigation下的move_base package,你设定了目标点,反馈信息可能是机器人在规划路径上的即时位姿,直到机器人到达目标点,返回SUCCEEDED消息。 所以action lib适用于...

David's Tweet 4527

ros学习(2-2):ros节点创建(python)

参考 Python创建简单的ROS节点: 用Python实现ROS节点(这里也说明了用Python写ROS功能包也是需要CMakelists.txt的) https://blog.youkuaiyun.com/sinat_16643223/article/details/114057998 Python创建ROS节点(使用自定义消息): ROS学习笔记(十一) roscpp介绍(一) https://blog.youkuaiyun.com/weixin_44682965/article/details/107748350

gyxx1998的博客 9433

vscode开发ROS(16)-python实现自定义动作action

python实现自定义动作action写在最前自定义动作新建Server节点新建Client节点运行Server和Client后记 写在最前 此篇博客为vscode开发系列ros第9篇vscode开发ROS(9)-ROS服务通信机制(srv)的python实现版本, 请对照进行查看. 自定义动作 此处是直接采用第11篇中的, 自定义heatWater.action服务, 具体过程, 请查看该篇,...

MSNH2012的博客 817

c++引入ros库,以及编写c++版本的ros案例代码

【代码】c++引入ros库,以及编写c++版本的ros案例代码。

pvmsmfchcs的博客 736

python网络编程(第3版)配套代码_python网络编程(第3版)配套代码_

《Python网络编程(第3版)》原书配套代码

ROS_Python编程 之 案例代码核心解析(第四版)

ROS_Python编程 之 案例代码核心解析(第四版) 通过Handsfree mini机器人平台配套的中级教程,我对ros_python 进阶编程 的知识做以下归纳: 文章目录ROS_Python编程 之 案例代码核心解析(第四版)5. 进阶编程5.1 get_angular_odom.py5.2 nav_obstacle.py5.3 nav_square.py 5. 进阶编程 handsfree mini 机器人工控机自带的ros系统一共有三份代码,分别是 get_angular_odom.py,na

MuscleMonk的博客 1904

VS2022 中 std::mutex 静态初始化陷阱:一次诡异崩溃的排查记录

VS2022中使用std::mutex时遇到的静态初始化陷阱问题。该问题源于VS2022 17.4版本为std::mutex添加constexpr支持后,全局静态初始化可能导致系统资源未就绪时锁失效或崩溃。文章分析了问题现象、影响范围,并提供了解决方案。最后给出了排查清单和核心建议

qq_34552942的博客 952

ROS_Python编程 之 案例代码核心解析(第一版)

ROS_Python编程 之 案例代码核心解析 通过Handsfree mini机器人平台配套的中级教程,我对ros_python编程实现 传感器数据读取、运动控制、自主导航 的知识做以下归纳: 文章目录ROS_Python编程 之 案例代码核心解析1. 传感器数据读取1.1 获取机器人底层硬件基本信息并打印1.2 获取IMU数据,并转化成欧拉角打印1.3 获取激光雷达数据并打印1.4 获取摄像头数据,并用opencv_python库显示2. 控制机器人移动2.1 控制机器人直线运动2.2 控制机器人转向运

MuscleMonk的博客 2917

学习海康VisionMaster之圆查找

(1):ROI选中位置修正,并且修正信息需要选择刚刚创建的位置修正组件输出信息,这里的话后续的检测窗口一般都需要做这一步,因为大部分的应用场景都是需要用到实时跟踪的。圆查找模块是用于查找指定区域的圆,并且会输出该圆的相关参数信息,比如圆中心点,圆半径,圆是否存在等信息。7):剔除点数:和高级参数里面的剔除距离搭配使用的,就是过滤较远的边缘点,让拟合圆心出来的轮廓更加接近。中的圆查找,相当于就是拟合圆心,这个在视觉软件中的应用也是非常广泛的,通常用于定位,测量项目。

yuhouxiyang的专栏 2104

测试人必看!正交表与Allpairs工具对比:如何选择最适合你的组合测试方案?

本文深入对比了正交表、PICT与Allpairs三种主流组合测试方案,帮助测试人员根据项目场景做出最佳选择。文章分析了各自的核心原理、优劣势及适用场景,特别强调了在涉及复杂约束时PICT工具的强大功能,并提供了从原理学习到CI/CD集成的实战选型指南。

weixin_29224309的博客 268

ROS_Python编程 之 案例代码核心解析(第二版)

ROS_Python编程 之 案例代码核心解析(第二版) 通过Handsfree mini机器人平台配套的中级教程,我对ros_python编程实现 自主导航 的知识做以下归纳: 文章目录ROS_Python编程 之 案例代码核心解析(第二版)3. 导航发送目标点3.1 set_goal.py3.2 set_two_goal.py3.3 set_four_goals.py 3. 导航发送目标点 通过 ros 的 navigation 接口向 move_base 导航系统发送 goal,让机器人导航到目标点。

MuscleMonk的博客 1669

Meta DINOv3实战指南:如何用7B参数ViT模型提升你的视觉任务性能(附Hugging Face部署教程)

本文提供了Meta DINOv3 7B参数ViT模型的实战部署指南。文章详细解析了该自监督视觉模型的优势,并重点演示了如何在Hugging Face平台上高效加载这一大规模模型,同时给出了图像分类、语义分割等下游任务的性能提升技巧与代码示例,帮助开发者在实际视觉任务中应用这一前沿技术。

pz89012345的博客 325

ROS基础学习—话题、服务、动作编程

在ROS(Robot Operating System)中,工作空间(Workspace)是一个用户可以用来组织并构建自定义ROS软件包的文件夹结构。通常,这个工作空间被称为,得名于ROS的构建系统catkin。一个典型的catkin工作空间包含以下几个部分:src (source)目录:这是工作空间的核心目录,包含所有的ROS软件包源代码。当你创建一个新的ROS工作空间时,会从创建这个目录开始。任何你下载或创建的自定义ROS软件包都应该放在这个目录下。build目录。

LX567567的博客 2000

qt医疗信息系统(HIS)

**UI 组件**: QWidget、QTextBrowser、QTableWidget、QGraphicsView 等。- **网络通信**: Qt Network (TCP/IP)- **DICOM 处理**: DCMTK 3.6.7。- **数据库**: SQLite (轻量、跨平台)**数据库文件**: `hospital.db`- **开发框架**: Qt 6 (C++)- 医疗影像 (DICOM) 查看器。**医疗影像 (DICOM) 查看器****电子病历 (EMR) 浏览器**

寒寒豆豆软件公司的博客 339

用 SE84 反查 SAP 消息号:弹窗一闪而过也能抓到 Message ID 和 Number 的小技巧

SAP开发技巧:通过消息文本反查Message ID和编号 在SAP开发中,经常遇到系统只显示错误消息文本而缺少技术信息的情况。本文介绍两种实用方法: 使用SE84工具:通过输入带通配符的短文本(如"错误文本")反向查找消息类和编号 直接查询T100表:利用消息文本在T100表中检索完整的消息技术信息 这些技巧特别适用于处理弹窗消息、框架层错误等无法直接获取技术细节的场景。掌握消息ID和编号后,开发者可以更高效地进行问题定位、代码调试和错误处理,尤其在SAP Gateway、RAP等现代

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 375

ROS编程深入理解(Python)

这是最核心的命令,相当于启动一台机器,深入理解就是,启动rosmaster,这个是方便节点之间通信的,详细请看我的ROS通信那篇文章。此时,我们想分析一下当前的运动轨迹,则可以使用上面的命令,输出的是一个不断更新的pose状态波动图,用来分析机器人的轨迹。上面命令用来查看话题命令的帮助,当然基本上所有你不懂的命令,都可以用这个-h,包括linux中的,这是一个通用做法。可以查看当前运行的话题,我们可以知道,通常用于移动通信的话题是/cmd_vel,如果启动了小海龟,就可以看到。一个srv文件描述一个服务。

qq_22472441的博客 1944

使用 FastAPI 和 LangGraph 构建生产级智能体 AI 系统

这是一本关于使用 FastAPI 和 LangGraph 构建生产级智能体 AI 系统的详细书籍,全文约 10 万字。《Production-Grade Agentic AI System Design and Implementation: Building Agentic AI Systems Using FastAPI and LangGraph》随着人工智能(AI)技术的迅猛发展,智能体(Agent)作为能够自主感知、推理、决策和行动的实体,正逐渐成为构建复杂智能系统的核心。从个性化推荐、客户服务到

AI天才研究院 349

【亲测免费】 探索ROS 2的无限可能:《ROS 2机器人编程实战》代码项目推荐

探索ROS 2的无限可能:《ROS 2机器人编程实战》代码项目推荐 项目介绍 《ROS 2机器人编程实战——基于现代C++和Python 3》是一本引领读者深入理解ROS 2框架的实用指南。本书不仅提供了丰富的理论知识,还通过具体的代码示例,帮助读者在实践中掌握ROS 2的核心概念和技术。为了进一步辅助学习,本书的配套代码项目——ros2_for_beginners_code,将书中每一个章节的示...

gitblog_00775的博客 981

提示词编程在自动化内容审核中的应用

文章标题 提示词编程在自动化内容审核中的应用 关键词:提示词编程,自动化内容审核,人工智能,算法原理,系统架构设计,项目实战 摘要 本文旨在探讨提示词

AI天才研究院 1254

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

我是如何从零开始搭建一个双模式可视化编程平台:从Python到ROS2的技术实践

本文介绍了一个双模式可视化编程平台,支持Python通用编程和ROS2机器人编程的无缝切换。平台基于现代化Web技术栈(Next.js 13.4+、TypeScript、React DnD等),采用Zustand进行高效状态管理,实现了拖拽式编程体验。核心创新包括:1)统一界面支持两种编程模式;2)优化的拖拽系统与智能磁吸连接算法;3)渐进式学习路径设计,从基础编程过渡到机器人开发。该平台解决了现有工具局限,为初学者提供了从入门到专业的平滑过渡,特别适合8-16岁学习者。目前已完成基础架构搭建,正在完善细节

lovely_yoshino的博客 6708

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: ROS 重要框架、接口学习资源小汇总
下一篇: ROS_Python编程 之 案例代码核心解析(第四版)
ROS开发小白
博客等级 码龄6年 88粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值