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

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进行自己的开发和应用!

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值