首页 > 其他分享 >2024年睿抗机器人大赛智能侦查省赛(预选赛)总结中篇

2024年睿抗机器人大赛智能侦查省赛(预选赛)总结中篇

时间:2024-08-29 12:26:30浏览次数:12  
标签:info cam usb 2024 ws student 预选赛 省赛 ROS

2024年睿抗机器人大赛智能侦查省赛(预选赛)总结中篇

引言

通过上篇的分析,我们已经完成了睿抗机器人大赛省赛任务书的前两个部分,关于如何在win11下搭建yolov5环境并将其运用,后续我们会继续跟进,也欢迎大家留言,现在我们将继续分析省赛任务书余下的部分。

任务3:ROS程序题

任务描述:
使用ROS服务(Service)机制实现服务端与客户端的通信。比赛要求:编写代码实现ROS中的Service通讯:首先需要自定义srv文件,创建服务端与客户端;创建一个服务节点,该节点提供了一个查询服务,允许客户端通过发送学号来获取对应的人名和成绩信息。服务端节点可以通过读取一个存储学号、人名和成绩信息的数据库来提供查询功能。

任务分析:
以下我们将从新建工作空间开始,逐步分析如何解决上述任务的过程。

  1. 创建ROS工作空间
    首先,我们在一个新的ROS工作空间中设置我们的项目。
    在ubuntu系统主目录下打开终端,创建一个新的工作空间目录,这里命名为robotics_competition_ws:
mkdir -p ~/robotics_competition_ws/src
cd ~/robotics_competition_ws

再初始化这个新的catkin工作空间:

catkin_init_workspace
  1. 创建ROS包
    接着,我们创建一个新的ROS包来存放我们的服务和相关的文件。
    切换到src目录:
cd ~/robotics_competition_ws/src

使用catkin_create_pkg命令创建一个新包,这里命名为student_info_service:

catkin_create_pkg student_info_service rospy roscpp std_msgs

这里添加了rospy、roscpp和std_msgs作为依赖,可确保该包可以正常执行python脚本和c++文件以及订阅基本的话题。

  1. 定义srv文件
    我们再定义一个srv文件来描述服务接口。

在student_info_service包中创建一个srv目录:

mkdir -p student_info_service/srv

在srv目录下创建一个名为StudentInfo.srv的文件,内容如下:

# StudentInfo.srv
uint32 student_id
---
string name
float32 score
  1. 编写服务端代码
    接下来,我们再创建一个服务端节点,它会读取数据库并提供查询服务。以下是示例代码:
#!/usr/bin/env python
#encoding=utf-8
import rospy
from student_info_service.srv import StudentInfo, StudentInfoResponse

def handle_student_info(req):
    # 假设一个简单的字典作为数据库
    students = {
        1001: {'name': 'Alice', 'score': 85.5},
        1002: {'name': 'Bob', 'score': 90.0},
        1003: {'name': 'Charlie', 'score': 88.3}
    }
    
    if req.student_id in students:
        return StudentInfoResponse(students[req.student_id]['name'], students[req.student_id]['score'])
    else:
        return StudentInfoResponse("Unknown", -1.0)

def student_info_server():
    rospy.init_node('student_info_server')
    s = rospy.Service('get_student_info', StudentInfo, handle_student_info)
    print("Ready to serve student information.")
    rospy.spin()

if __name__ == "__main__":
    student_info_server()
  1. 编写客户端代码
    之后客户端节点将向服务端发送请求,并显示返回的结果。这里同样是基于python写的demo:
#!/usr/bin/env python
#encoding=utf-8
import rospy
from student_info_service.srv import StudentInfo

def get_student_info(student_id):
    rospy.wait_for_service('get_student_info')
    try:
        get_info = rospy.ServiceProxy('get_student_info', StudentInfo)
        resp = get_info(student_id)
        return resp.name, resp.score
    except rospy.ServiceException as e:
        print("Service call failed: %s"%e)

def main():
    rospy.init_node('student_info_client')
    student_id = int(input("Enter the student ID: "))
    name, score = get_student_info(student_id)
    print(f"Student ID {student_id}: Name = {name}, Score = {score}")

if __name__ == "__main__":
    main()
  1. 构建并运行
    现在我们构建工作空间并运行服务端和客户端。先返回到工作空间根目录:
cd ~/robotics_competition_ws

再构建工作空间:

catkin_make

启动ROS Master和ROS核心:

roscore 

运行服务端节点:

rosrun student_info_service student_info_server.py

运行客户端节点:

rosrun student_info_service student_info_client.py

任务里还涉及利用rosservice call,看到正确的数据输出,该要求类似于上面,只不过步骤有些许差别。构建完工作空间之后,先运行服务端:

rosrun student_info_service server.py

在另一个终端窗口中,使用rosservice call命令来测试服务端能否正确返回数据。这里我们请求学号为1001的学生信息。

rosservice call /get_student_info "student_id: 1001"

之后可以看到终端响应:

service call successful
name: Alice
score: 85.5
  1. 测试
    在客户端节点中输入学生ID进行测试,观察输出结果是否符合预期。

  2. 注意事项
    上述所涉及的python脚本在执行前应该赋权限,即:

chmod +x /your_python_files_path/your_python_file_name.py

此外,ros1里面的python版本大多是2.7,属于比较旧的版本,如果python脚本里有涉及python3.0以上版本的代码段,在使用python your_python_file_name.py这种指令的时候应该改为以下:

python3 your_python_file_name.py

即指定使用python3.0以上版本的解释器去执行这个python脚本。

任务4:ROS基础操作题

任务描述:完成ROS相关的命令使用。
(1)任务1:乌龟轨迹再现,在提供的虚拟机中,使用rosbag录制一个名为run的小乌龟的路径bag文件。要求:提交录制的bag文件。
(2)任务2:ROS工作空间覆盖,在提供的虚拟机中,创建工作空间A,在工作空间中创建一个名为功能包usb_cam的功能包,创建工作空间B,在工作空间B中,进行源码下载功能包usb_cam,在opt下安装usb_cam,配置好环境,使得在使用roscd usb_cam命令后,终端会进入opt的路径。(工作空间A和B需自主命名)

任务分析:

  1. 任务1:乌龟轨迹再现
    新建终端先启动ROS环境,确保ROS已经安装并且环境变量已经设置好。
roscore

新建终端然后启动TurtleBot仿真环境:

rosrun turtlesim turtlesim_node

新建终端再使用teleop_twist_keyboard手动控制小乌龟移动,使其绘制出你想要录制的轨迹。

rosrun turtlesim turtle_teleop_key

新建终端使用rosbag命令来录制小乌龟的轨迹。

rosbag record -O run /turtle1/cmd_vel /turtle1/pose

这条命令将会录制/turtle1/cmd_vel(小乌龟的速度命令)和/turtle1/pose(小乌龟的位置)这两个话题,并将文件保存为run.bag。

此外,要指定rosbag记录文件的保存路径,可以使用-O或–output-prefix选项后面跟上路径和文件名。这里是如何指定保存路径的示例:

rosbag record -O /path/to/save/run /turtle1/cmd_vel /turtle1/pose

在这个命令中:-O /path/to/save/run 指定了文件的保存路径和文件名前缀。在这个例子中,文件将被保存到/path/to/save/目录下,并且文件名将以run开头。但首先确保路径存在,可以在记录之前创建该路径。

mkdir -p /path/to/save
rosbag record -O /path/to/save/run /turtle1/cmd_vel /turtle1/pose

这样,rosbag就会将文件保存到指定的路径下了。

  1. 任务2:ROS工作空间覆盖

先创建ROS工作空间A,在主目录下创建一个新的ROS工作空间,可以命名为ws_a,再切换到ws_a的src目录:

mkdir -p ~/ws_a/src
cd ~/ws_a/src

使用catkin_create_pkg命令创建一个名为usb_cam的功能包,并添加必要的依赖。

catkin_create_pkg usb_cam rospy rospy message_runtime

返回到ws_a的根目录构建工作空间:

cd ~/ws_a
catkin_make

然后创建ROS工作空间B,即创建一个新的ROS工作空间,命名为ws_b并切换到ws_b的src目录:

mkdir -p ~/ws_b/src
cd ~/ws_b/src

下载usb_cam的源码,假设其GitHub仓库地址为https://github.com/user/usb_cam.git。
具体网址可以通过ros.index去查询相应功能包,
这里提供网址:https://index.ros.org/search/?term=usb_cam
在这里插入图片描述
注意选择功能包的时候需要和自己的ros版本对应起来。
在上一个终端输入:

git clone https://github.com/ros-drivers/usb_cam.git

返回到ws_b的根目录,构建工作空间:

cd ~/ws_b
catkin_make

将ws_b中的usb_cam功能包安装到/opt/ros//share/usb_cam。

catkin_make install

配置环境变量,确保/opt/ros//share/usb_cam在ROS的搜索路径中。

source /opt/ros/<distro>/setup.bash

使用roscd命令验证路径是否正确指向/opt/ros//share/usb_cam。

roscd usb_cam

这条命令会将你带到/opt/ros//share/usb_cam目录下。
在这里插入图片描述

小结

以上内容均为个人实践结合网络上的参考资料完成,仅供参考。详细演示视频可以私信我,今天的分享暂时到这,后续的任务书分析将继续更新,以上内容均有视频参考,希望大家都可以流畅的使用ros进行自己的开发和应用!

标签:info,cam,usb,2024,ws,student,预选赛,省赛,ROS
From: https://blog.csdn.net/winner0111/article/details/141635416

相关文章

  • AWTF2024A Moving Slimes 题解
    发现史莱姆不合并也不会影响答案,所以就不用考虑合并了。这样处理之后,史莱姆的移动可以看作是受到与其不在同一位置的史莱姆的吸引所完成的,每只史莱姆可以给其他史莱姆一个单位的吸引力。因为每只史莱姆提供的吸引力是恒定的,所以考虑把吸引力放在它们的重心上,设\(pre_i\)表示坐......
  • 【优技教育】Oracle 19c OCP 082题库(第3题)- 2024年修正版
    考试科目:1Z0-082考试题量:90通过分数:60%考试时间:150min本文为(CUUG原创)整理并解析,转发请注明出处,禁止抄袭及未经注明出处的转载。原文地址:http://www.cuug.com/index.php?s=/home/article/detail/id/3386.html第3题:3、Choosetwo.Whichistrueaboutthe&and&&prefi......
  • RFFT:数据与代码已开源,京东推出广告图生成新方法 | ECCV 2024
    论文将多模态可靠反馈网络(RFNet)结合到一个循环生成图片过程中,可以增加可用的广告图片数量。为了进一步提高生产效率,利用RFNet反馈进行创新的一致条件正则化,对扩散模型进行微调(RFFT),显著增加生成图片的可用率,减少了循环生成中的尝试次数,并提供了高效的生产过程,而不牺牲视觉吸引力。......
  • Ynoi 做题笔记(2024 年暑假)
    P9992[YnoiEasyRound2024]TEST_130之前大概想出来了,但是没想清楚。发现每次询问\(w,d\)就相当于算\(w\)子树里离\(w\)距离不超过\(d\)的点的贡献之和,\(w\)的贡献是\(d+1\)(因为\(N(w,0),N(w,1),\ldots,N(w,d)\)都可以),\(w\)往下第一层的每个点分别的贡......
  • PCSR:已开源,三星提出像素级路由的超分辨率方法 | ECCV 2024
    基于像素级分类器的单图像超分辨率方法(PCSR)是一种针对大图像高效超分辨率的新方法,在像素级别分配计算资源,处理不同的恢复难度,并通过更精细的粒度减少冗余计算。它还在推断过程中提供可调节性,平衡性能和计算成本而无需重新训练。此外,还提供了使用K均值聚类进行自动像素分配以及后......
  • 2024.8.28 总结
    上午做了一个很板的广义SAM题,算是练了一下广义SAM,当时基本上能自己写出广义SAM了,但是还是写错了两个地方(好像是把p写成了q)。大概是做完这道题之后我去看了看lr的博客,发现他的博客里有计划。于是我也写了一个最近的计划。在这之后我就去挑了个较基础的SA题来写。后缀......
  • 2024年最新版Typora免费使用教程心得
    在数字化时代,写作已成为我们日常沟通、知识分享的重要手段。然而,繁琐的排版格式常常让人望而却步。幸运的是,Markdown编辑器以其简洁的语法和高效的排版功能,为我们带来了福音。Typora是一款功能强大的文本编辑器,它采用所见即所得的编辑方式,能够让用户快速地编辑各种文本格式,包括Mar......
  • 2024-8月总结
    一转眼就到8月了。其实之前一直想写个总结,但是一直拖延。今天不拖了,来写吧。一看日子,竟然离上一次总结恰好也是三个月。 ##工作工作好像也没什么好说的,可能确实没什么激情了。这三个月花了大力气完成了年度计划中的一部分。算是不小的一部分吧。偶尔也有一些疑难问题要解......
  • P10786 [NOI2024] 百万富翁
    思路:先考虑Sub1的部分分,暴力算法:暴力询问所有\(i<j\)的数对\((i,j)\)。则一个\(i\)为最大值当且仅当\((i,j)\)的返回值都是\(i\)且在\(i\)之前没有满足此条件的位置。则设\(\operatorname{F}(n)=\frac{n(n-1)}{2}\)表示暴力找出\(n\)个数中的最大值需要......
  • EPIC Institute of Technology Round Summer 2024 (Div. 1 + Div. 2) VP记录
    EPICInstituteofTechnologyRoundSummer2024(Div.1+Div.2)VP记录A一眼\((n-1)m+1\)。B最后的数列是固定的,每个数与最后数列的数相减后,对差值求和再加上最大值即可。C唐诗C题,获得\(3\)发罚时。只有一个数右边的数归零了,它才会归零。右往左扫,如果右边......