仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】

这篇具有很好参考价值的文章主要介绍了仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

💫你好,我是辰chen,本文旨在准备考研复试或就业
💫本文内容是我为复试准备的第二个项目
💫欢迎大家的关注,我的博客主要关注于考研408以及AIoT的内容
🌟 预置知识:基本Python语法,基本linux命令行使用

以下的几个专栏是本人比较满意的专栏(大部分专栏仍在持续更新),欢迎大家的关注:

💥ACM-ICPC算法汇总【基础篇】
💥ACM-ICPC算法汇总【提高篇】
💥AIoT(人工智能+物联网)
💥考研
💥CSP认证考试历年题解

作业1

  1. rostopic 命令,让第二只小海龟也动起来
  2. 创建功能包,实现 ROS 节点: 在随机位置生成一个小海龟,生成后,以随机速度、半径、方向(顺时针or逆时针)持续转圈。并使用 rgt_graph,rgt_topic 等工具查看,确保与自己的理解一致。
    • 提示1:生成一个小海龟需要调用 turtlesim 功能包的服务,可以用 roscd turtlesim 进入该功能包,查看服务的定义。写代码时,用 from turtlesim.srv import Spawn, SpawnRequest, SpawnResponse 导入该服务。
    • 提示2:创建功能包时,也要在依赖中加入 turtlesim,如 catkin_create_pkg homework std_msgsorospy turtlesim
    • 提示3:生成小海龟后,要往哪个Topic 发送控制指令? Topic 的数据类型是什么? rostopic 命令可以查看当前有的 Topic 的数据类型,用 -h 参数自己探索一下吧😘
  3. 将上述节点运行多个,生成多个小海龟。你遇到了什么问题?什么原因导致?能否想到解决方法?

答案1

1.操作命令行如下:

# 创建第一只小海龟
roscore
rosrun turtlesim turtlesim_node

# 让第一只小海龟一直转圈
rostopic pub -r 1 /turtle1/cmd_vel geometry_msgs/Twist "linear:
  x: 1.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 1.0"

# 创建第二只小海龟
rosservice call /spawn "x: 5.0
y: 3.0
theta: 0.0
name: ''" 

# 用 rostopic 命令让第二只小海龟一直转圈
rostopic pub -r 1 /turtle2/cmd_vel geometry_msgs/Twist "linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 1.0"

仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】,仿真机器人-深度学习CV和激光雷达感知,考研,# 复试项目,机器人,考研,深度学习,ROS,CV,项目,智能驾驶


2.分析问题要求:在随机位置生成一个小海龟,生成后,以随机速度、半径、方向(顺时针or逆时针)持续转圈。

两个关键:生成海龟,控制持续运动。

我们来思考一下这两个操作应该使用 Service 还是 Topic:
决定使用服务(Service)还是主题(Topic)通常取决于你想要进行的操作的性质和通信模式。在ROS中,服务和主题用于不同的通信模式:

使用服务(Service):
当操作是请求-响应模式,即发送一个请求并期待一个响应,而这个操作不是连续进行的,应该使用服务。
服务适用于一次性的、离散的操作。比如,需要“生成一只小海龟”,这是一个一次性的操作,发送请求,服务完成操作并给出一个响应(比如成功或失败的消息,或者生成的海龟的ID)。
服务是同步的,客户端会在服务处理请求并返回响应之前阻塞(等待)。

使用主题(Topic):
如果你的操作涉及连续的数据流或状态更新,你应该使用主题。
主题适用于发布/订阅模型,当信息源(发布者)有新的数据时,它会不断地发布消息,而感兴趣的接收方(订阅者)会接收这些消息。比如,传感器数据的发布,或者机器人位置的持续更新。
主题是异步的,数据的发布和接收是独立进行的,订阅者不会阻塞等待发布者发布消息。
例子中,“生成一只小海龟”是一个一次性的操作:请求生成海龟,然后操作完成。这种情况下,使用服务是合适的,因为发送一个请求并期待一个响应,这与服务的请求-响应模型相匹配。
如果操作是持续监控海龟的位置或状态如第二个需求:持续转圈,并且海龟的信息是持续变化的,那么使用主题会更合适,可以订阅一个主题,并持续接收海龟状态的更新。

综上,我们将问题分析为:使用 Service 创建一个海龟,使用 Topic 使得海龟持续转圈


之前有过介绍,生成海龟曾调用过 Spawn 这个服务,也就是说,我们不需要像之前介绍的那样建立一个 Service Client 以及一个 Service Server,我们只需要建立一个 Service Client 即可,至于 Service Server 节点,其实就是 turtlesim 这个模拟器(模拟器本身就是一个节点)该节点提供的 Spawn。

生成一个海龟可能遇到的问题:不知道用什么样的数据去调用服务【正确调用一个ROS服务的关键之一是知道该服务期望接收的参数(请求部分)以及它将返回的参数(响应部分)。每个ROS服务都有一个定义好的服务类型,这个服务类型定义了请求和响应的结构。】

解决思路:我们知道是有生成海龟这个服务在的(Spawn),关键在于如何调用:

roscore
rosrun turtlesim turtlesim_node
rossrv list
rossrv show turtlesim/Spawn

rosservice 更侧重于与运行中的服务进行交互和管理,而 rossrv 则更侧重于服务消息类型的查看和管理。

由此可以看到服务类型的定义:
仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】,仿真机器人-深度学习CV和激光雷达感知,考研,# 复试项目,机器人,考研,深度学习,ROS,CV,项目,智能驾驶
--- 用来分割服务的请求和返回值

还有一个方法可以看到服务类型的定义:

roscd turtlesim/
ls
cd srv
ls
vim Spawn.srv

仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】,仿真机器人-深度学习CV和激光雷达感知,考研,# 复试项目,机器人,考研,深度学习,ROS,CV,项目,智能驾驶
仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】,仿真机器人-深度学习CV和激光雷达感知,考研,# 复试项目,机器人,考研,深度学习,ROS,CV,项目,智能驾驶
和第一种方法得到的结果是一样的,这里还有一行注释,意为 name 是可选的,不对 name 操作会自动创建一个无重的命名。

根据提示创建一个功能包:

cd ~/learn_ws/src
catkin_create_pkg turtle_work std_msgs rospy turtlesim

cd ..
catkin_make
source devel/setup.bash

仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】,仿真机器人-深度学习CV和激光雷达感知,考研,# 复试项目,机器人,考研,深度学习,ROS,CV,项目,智能驾驶
仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】,仿真机器人-深度学习CV和激光雷达感知,考研,# 复试项目,机器人,考研,深度学习,ROS,CV,项目,智能驾驶

#! /usr/bin/env python
# coding utf-8
import rospy
import random
import math
from geometry_msgs.msg import Twist
from turtlesim.srv import Spawn, SpawnRequest, SpawnResponse

if __name__ == '__main__':
    rospy.init_node("spawn_by_py")

    # 给服务传递的参数
    request = SpawnRequest()
    request.x = 8 * random.random()
    request.y = 8 * random.random()
    request.theta = math.pi * random.uniform(-1, 1)
    request.name = "own_turtle_1"

    # 请求服务
    rospy.loginfo('waitting for serviceL /spawn ...')
    rospy.wait_for_service('/spawn')

    try:
        service = rospy.ServiceProxy("/spawn", Spawn)
        response: SpawnResponse = service(request)
    except rospy.ServiceException as e:
        rospy.logerr(f'Service call failed: {e}')
        exit(-1)

    rospy.loginfo(f"spawn new turtle: {response.name}")

    # 创建速度控制的 Topic 发布者
    pub = rospy.Publisher(request.name+'/cmd_vel', Twist, queue_size=10)

    # 发布的信息变量
    control_msg = Twist()
    control_msg.linear.x = 5 * random.random()
    control_msg.angular.z = random.choice([1, -1]) * random.uniform(0.5, 5)

    rate = rospy.Rate(10)
    while not rospy.is_shutdown():
        rospy.loginfo(control_msg)
        pub.publish(control_msg)
        rate.sleep()

代码解释:

import rospy
import random
import math
from geometry_msgs.msg import Twist
from turtlesim.srv import Spawn, SpawnRequest, SpawnResponse

rospy: ROS 的 Python 库,用于节点初始化、消息发布等。
random: 生成随机数。
math: 数学函数库,此处用于访问 π π π 值。
geometry_msgs.msg: ROS 标准消息类型,此处用于发送速度控制指令。
turtlesim.srv: Turtlesim 特有的服务类型,用于创建新的乌龟。

if __name__ == '__main__':
    rospy.init_node("spawn_by_py")

定义 Python 的主执行块。
初始化 ROS 节点,节点名为 “spawn_by_py”。

    request = SpawnRequest()
    request.x = 8 * random.random()
    request.y = 8 * random.random()
    request.theta = math.pi * random.uniform(-1, 1)
    request.name = "own_turtle_1"

创建 SpawnRequest 对象,并为其属性赋值。这些值用于设定新乌龟的初始位置(x 和 y 坐标,范围是 [0, 8])和方向(theta,即朝向,范围是 [- π π π, π π π]),以及名称(“own_turtle_1”)。random.random() 用于生成一个随机浮点数。这个数在 0.0 到 1.0 之间(包含 0.0,但不包含 1.0)random.uniform(a, b) 用于生成一个随机浮点数 N,使得 a ≤ N ≤ b。其结果包括区间的两端点 a 和 b。math.pi * random.uniform(-1, 1) 故可以生成 [- π π π, π π π]

    rospy.loginfo('waitting for serviceL /spawn ...')
    rospy.wait_for_service('/spawn')

rospy.loginfo() 是 ROS 中的一个日志函数,用于打印信息级别的日志。在 ROS 中,日志有不同的级别,如 info, warn, error, 等等,以表示不同严重程度的信息。rospy.loginfo('waitting for serviceL /spawn ...') : rospy.loginfo 表示这是一条信息级别的日志,通常用于提供正常的程序运行信息。waiting for service /spawn … 是要打印的日志内容,通常用于告知用户程序正在等待 /spawn 服务可用。
调用rospy.wait_for_service等待 /spawn 服务可用。这是 Turtlesim 提供的服务,用于生成新的乌龟,

    try:
        service = rospy.ServiceProxy("/spawn", Spawn)
        response: SpawnResponse = service(request)
    except rospy.ServiceException as e:
        rospy.logerr(f'Service call failed: {e}')
        exit(-1)

创建一个服务客户端,连接到 /spawn 服务。如果服务调用成功,将返回一个SpawnResponse对象;如果服务调用失败(比如服务不可用),将打印错误信息并退出程序。
rospy.ServiceProxy: 这是一个在 ROS 中创建服务客户端的构造函数。服务客户端用于调用服务。第一个参数 "/spawn" : 这是服务的名称。第二个参数 Spawn: 这是服务的类型。
response: 这是一个变量,用于存储服务调用的响应。SpawnResponse: 这是响应的类型。在这种情况下,它是服务Spawn的响应部分。service(request) : 这是实际调用服务的部分。service是之前声明的服务客户端,request 是发送给服务的请求消息,它是一个 SpawnRequest 类型的对象,包含了创建新乌龟所需的数据(比如位置、方向和名称)。response: SpawnResponse: 这个冒号在 Python 中用于类型注解,表示变量 response 应该是 SpawnResponse 类型。
rospy.logerr() 是 ROS 中的一个日志函数,用于在节点的日志中记录错误信息。

    rospy.loginfo(f"spawn new turtle: {response.name}")

打印日志,显示新生成的乌龟的名称。

    pub = rospy.Publisher(request.name+'/cmd_vel', Twist, queue_size=10)

创建了一个 ROS 发布者(Publisher),向一个特定的主题(Topic)发布消息(用于向控制乌龟移动的主题发送消息)request.name+'/cmd_vel :这是打算发布消息的主题名:request.name 是一个字符串,包含了之前创建的乌龟的名称,'/cmd_vel' 是一个常用于控制机器人速度的标准 ROS 主题。它经常用于接收速度指令(如线性速度和角速度)。通过将这两部分连接起来,代码将会向特定乌龟的速度控制主题发送消息。Twist:这指定了将要发布到该主题的消息类型。Twist 是一个标准的 ROS 消息类型,它包含了线性和角速度向量,用于控制机器人的运动。queue_size=10:这个参数设置了发布者的队列大小。队列用于存储在实际发送之前准备发送的消息。queue_size=10 意味着如果出于某种原因消息不能立即发送(例如,订阅者没有迅速接收消息),那么最多可以存储10条消息。如果超过这个数量,最旧的消息将会被丢弃。
总的来说:这行代码创建了一个名为 pub 的新发布者,它会向特定乌龟的 cmd_vel 主题发布 Twist 类型的消息。这允许你的节点控制乌龟的移动,通过指定其线性和角速度。队列大小设置为10,意味着在极端情况下,它会在丢弃最旧消息前缓存最多10条消息。

    control_msg = Twist()
    control_msg.linear.x = 5 * random.random()
    control_msg.angular.z = random.choice([1, -1]) * random.uniform(0.5, 5)

因为题目要求的是转圈,所以它的线速度和角速度是固定的,随意取一次即可。
创建 Twist 类型的消息 control_msg,并为其线性和角速度赋随机值。线性速度(linear.x)范围是[0, 5],角速度(angular.z)范围是[-5, -0.5] ∪ [0.5, 5]。random.choice([1, -1]) 会随机选择 1 或 -1,这代表一个方向(正向或负向)。random.uniform(0.5, 5) 生成一个随机的大小或强度。将这两个数相乘,结果是一个介于 -5 到 -0.5 或 0.5 到 5 之间的数,具体取决于第一部分选择的是 1 还是 -1。

    rate = rospy.Rate(10)

创建 Rate 对象,以 10Hz 的频率运行循环。

    while not rospy.is_shutdown():
        rospy.loginfo(control_msg)
        pub.publish(control_msg)
        rate.sleep()

主循环。在ROS没有关闭的情况下,不断执行以下操作:
打印 control_msg日志。
通过pub.publish发布control_msg到cmd_vel主题,控制乌龟的移动。
通过rate.sleep等待一段时间,以保持10Hz的循环频率。
pub.publish(control_msg)
pub: 是之前创建的一个发布者(Publisher)对象。在ROS中,发布者用于发送消息给任何订阅了相应主题的节点。
.publish: .publish 是发布者对象的一个方法。这个方法用于实际发送消息。调用这个方法时,消息会被发送到创建发布者时指定的主题。
(control_msg): control_msg 是要发布的消息。由上述代码中的定义,control_msg 是一个 Twist 类型的消息
总的来说pub.publish(control_msg) 这行代码是ROS通信机制中的核心操作之一,它允许节点之间通过主题来交换消息,这是实现分布式系统和模块化设计的关键。

此时我们可以再来看一下计算图:

roscore
rosrun turtlesim turtlesim_node
rosrun rqt_graph rqt_graph

仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】,仿真机器人-深度学习CV和激光雷达感知,考研,# 复试项目,机器人,考研,深度学习,ROS,CV,项目,智能驾驶
运行一下看看效果:

chmod +x src/turtle_work/src/*
source devel/setup.bash
rosrun turtle_work work.py 

仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】,仿真机器人-深度学习CV和激光雷达感知,考研,# 复试项目,机器人,考研,深度学习,ROS,CV,项目,智能驾驶

海龟运行

因为是随机生成的位置这些信息,可以再运行一次查看:
仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】,仿真机器人-深度学习CV和激光雷达感知,考研,# 复试项目,机器人,考研,深度学习,ROS,CV,项目,智能驾驶


3.我们按照题目要求新建一个窗口再生成一只小海龟,会报错如下:
仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】,仿真机器人-深度学习CV和激光雷达感知,考研,# 复试项目,机器人,考研,深度学习,ROS,CV,项目,智能驾驶
报错原因是第一次执行时(创建第二只海龟)创建了代码中 "own_turtle_1" 名字的海龟,再次调用的时候(创建第三只海龟)由于名字是一样的,所以会创建失败,因为是不能有重名的,在计算图中,所有的资源都需要唯一命名,解决方法见下篇博客。


上述所有内容出处如下,博主在此基础上仅为添加个人理解:
本项目为北大团队出品【项目三:深度学习&仿真机器人 - 丘丘老师】原创(部分代码为开源代码)。课程团队:B站ID【M学长的考研top帮】UID【3546580235848566】复试项目班QQ大群:885884619,负责人QQ:674799975文章来源地址https://www.toymoban.com/news/detail-812672.html

到了这里,关于仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 强化学习:MuJoCo机器人强化学习仿真入门(1)

        声明 :我们跳过mujoco环境的搭建,搭建环境不难,可自行百度 下面开始进入正题(需要有一定的python基础与xml基础):  下面进入到建立机器人模型的部分: 需要先介绍URDF模型文件和导出MJCF格式  介绍完毕,下面开始进行mujoco仿真: 首先将这4个文件复制到.mujoco/muj

    2024年01月24日
    浏览(55)
  • [机器人相关学习记录] KUKA 的仿真工具

    KUKA Sim Pro v3.1.2 和 Workvisual 的区别 项目 KUKA Sim Pro v3.1.2 Workvisual 功能 专注于机器人仿真和编程 集成机器人仿真、编程和监控 适用场景 适用于机器人研发、调试和教育 适用于机器人生产、调试、维修和管理 界面 简洁,侧重于机器人仿真和编程操作 更为全面,包含机器人状态

    2024年04月27日
    浏览(45)
  • ROS学习笔记16:机器人系统建模与仿真

    一、概述: 1.机器人系统仿真:         是通过计算机对实体机器人系统进行模拟的技术,在 ROS 中,仿真实现涉及的内容主要有三:对机器人建模(URDF)、创建仿真环境(Gazebo)以及感知环境(Rviz)等系统性实现。 (1)仿真优势:低成本、高效、高安全性。 (2)仿真缺陷:仿

    2024年02月09日
    浏览(47)
  • (无人机方向)ros学习之路ROS 机器人系统仿真_导航仿真概述

    一:导航仿真概述 导航是机器人系统中最重要的模块之一,比如现在较为流行的服务型室内机器人,就是依赖于机器人导航来实现室内自主移动的,本章主要就是介绍仿真环境下的导航实现,主要内容有: 导航相关概念 导航实现:机器人建图(SLAM)、地图服务、定位、路径规划…

    2024年02月02日
    浏览(58)
  • 干货 | 浅谈机器人强化学习--从仿真到真机迁移

    “ 对于机器人的运动控制,强化学习是广受关注的方法。本期技术干货,我们邀请到了小米工程师——刘天林,为大家介绍机器人(以足式机器人为主)强化学习中的sim-to-real问题及一些主流方法。 ” 一、前言 设计并制造可以灵活运动的足式机器人,一直是工程师追逐的梦

    2024年02月05日
    浏览(41)
  • 机器人仿真-gazebo学习笔记(4)xacro和传感器添加

    URDF文件不具备代码复用的特性(在上一篇文章也能发现,其实左右轮是极其相似的但还是要单独描述),一个复杂的机器人模型会拥有大量了的传感器和关节组件,这时候使用URDF文件就太难阅读了。精简化、可复用、模块化的xacro文件来了。 1.优势: ·精简模型代码: xacro是一

    2024年02月06日
    浏览(62)
  • 大象机器人人工智能套装2023版深度学习协作机器人、先进机器视觉与应用场景

    介绍当前的版本 今天我们要介绍的是aikit2023,aikit2023是aikit的全新升级版。 AIkit 2023 是一套集视觉,定位抓取、自动分拣模块为一体的入门级人工智能套装。 该套装基于python平台,可通过开发软件实现机械臂的控制,简单易学,能够快速入门学习人工智能基础知识,启发创新

    2024年02月13日
    浏览(65)
  • 【深度学习】大模型卷到机器人上了

    当一项变革性技术出现后,以此为基础的技术就会像雨后春笋般蔓延。 就像Transformer出现后,以此为基础的大语言模型ChatGPT,视觉基础模型Segment Anything相继横空出世,并展现出强大的涌现能力。生成式AI可谓百花齐鸣,争相绽放。 继纯语言,纯视觉大模型后,多模态大模型

    2024年02月07日
    浏览(39)
  • 竞赛项目 深度学习的智能中文对话问答机器人

    🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的中文对话问答机器人 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 整个项目分为 数据清洗 和 建立模型两个部分。 (1)主要定义了seq2seq这样

    2024年02月13日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包