2024年睿抗机器人大赛智能侦查省赛(预选赛)总结中篇
引言
通过上篇的分析,我们已经完成了睿抗机器人大赛省赛任务书的前两个部分,关于如何在win11下搭建yolov5环境并将其运用,后续我们会继续跟进,也欢迎大家留言,现在我们将继续分析省赛任务书余下的部分。
任务3:ROS程序题
任务描述:
使用ROS服务(Service)机制实现服务端与客户端的通信。比赛要求:编写代码实现ROS中的Service通讯:首先需要自定义srv文件,创建服务端与客户端;创建一个服务节点,该节点提供了一个查询服务,允许客户端通过发送学号来获取对应的人名和成绩信息。服务端节点可以通过读取一个存储学号、人名和成绩信息的数据库来提供查询功能。
任务分析:
以下我们将从新建工作空间开始,逐步分析如何解决上述任务的过程。
- 创建ROS工作空间
首先,我们在一个新的ROS工作空间中设置我们的项目。
在ubuntu系统主目录下打开终端,创建一个新的工作空间目录,这里命名为robotics_competition_ws:
mkdir -p ~/robotics_competition_ws/src
cd ~/robotics_competition_ws
再初始化这个新的catkin工作空间:
catkin_init_workspace
- 创建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++文件以及订阅基本的话题。
- 定义srv文件
我们再定义一个srv文件来描述服务接口。
在student_info_service包中创建一个srv目录:
mkdir -p student_info_service/srv
在srv目录下创建一个名为StudentInfo.srv的文件,内容如下:
# StudentInfo.srv
uint32 student_id
---
string name
float32 score
- 编写服务端代码
接下来,我们再创建一个服务端节点,它会读取数据库并提供查询服务。以下是示例代码:
#!/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()
- 编写客户端代码
之后客户端节点将向服务端发送请求,并显示返回的结果。这里同样是基于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()
- 构建并运行
现在我们构建工作空间并运行服务端和客户端。先返回到工作空间根目录:
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
-
测试
在客户端节点中输入学生ID进行测试,观察输出结果是否符合预期。 -
注意事项
上述所涉及的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:乌龟轨迹再现
新建终端先启动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就会将文件保存到指定的路径下了。
- 任务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