当前位置: 首页 > news >正文

网站后台管理方便吗品牌建设和品牌打造

网站后台管理方便吗,品牌建设和品牌打造,aso优化方法,网上商城网站建设方案7.5.1 需求及设计 又到了小鱼老师带着做最佳实践项目了。需求#xff1a;做一个在各个房间不断巡逻并记录图像的机器人。 到达目标点后首先通过语音播放到达目标点信息#xff0c; 再通过摄像头拍摄一张图片保存到本地。 7.5.2 编写巡检控制节点 在chapt7_ws/src下新建功…7.5.1 需求及设计 又到了小鱼老师带着做最佳实践项目了。需求做一个在各个房间不断巡逻并记录图像的机器人。 到达目标点后首先通过语音播放到达目标点信息 再通过摄像头拍摄一张图片保存到本地。 7.5.2 编写巡检控制节点 在chapt7_ws/src下新建功能包添加rclpy和nav2_simple_commander依赖。 目录src/autopartol_robot/autopartol_robot/新建文件patrol_node.py from geometry_msgs.msg import PoseStamped,Pose from nav2_simple_commander.robot_navigator import BasicNavigator,TaskResult import rclpy from rclpy.node import Node import rclpy.time from tf2_ros import TransformListener, Buffer #坐标监听器 from tf_transformations import quaternion_from_euler,euler_from_quaternion# 欧拉角转换class PatrolNode(BasicNavigator):def __init__(self,node_namepatrol_node):super().__init__(node_name)self.buffer_ Buffer()self.listner_ TransformListener(self.buffer_,self)#声明相关参数self.declare_parameter(initial_point,[0.0, 0.0, 0.0])self.declare_parameter(target_points,[0.0, 0.0, 0.0, 1.0, 1.0, 1.57])self.initial_point_ self.get_parameter(initial_point).valueself.initial_points_ self.get_parameter(target_points).valuedef get_pose_by_xyyaw(self, x, y, yaw):# 通过x,y,yaw return PoseStamped对象 pose PoseStamped()pose.header.frame_id mappose.pose.position.x xpose.pose.position.y yquat quaternion_from_euler(0,0,yaw)pose.pose.orientation.x quat[0]pose.pose.orientation.y quat[1]pose.pose.orientation.z quat[2]pose.pose.orientation.w quat[3]return posedef init_robot_pose(self):#初始化机器人位姿self.initial_point_ self.get_parameter(initial_point).valueinit_pose self.get_pose_by_xyyaw(self.initial_point_[0],self.initial_point_[1],self.initial_point_[2]) self.setInitialPose(init_pose)self.waitUntilNav2Active()#等待导航可用def get_target_points(self):#通过参数值获取目标点集合points []self.target_points_ self.get_parameter(target_points).valuefor index in range(int(len(self.target_points_)/3)):x self.target_points_[index*3]y self.target_points_[index*31]yaw self.target_points_[index*32]points.append([x,y,yaw])self.get_logger().info(f获取到目标点{index}-{x},{y},{yaw})return points def nav_to_pose(self,target_pose):#导航到指定位姿self.waitUntilNav2Active()self.goToPose(target_pose)while not self.isTaskComplete():feedback self.getFeedback()self.get_logger().info(f剩余距离:{feedback.distance_remaining })reslut self.getResult()self.get_logger().info(f导航结果:{reslut}) def get_cuurent_pose(self):#通过TF获取当前位姿while rclpy.ok():try:result self.buffer_.lookup_transform(map,base_footprint,rclpy.time.Time(seconds0),rclpy.time.Duration(seconds1))transform result.transformself.get_logger().info(f平移:{transform.translation})# self.get_logger().info(f旋转:{transform.rotation})# ratation_euler euler_from_quaternion([# transform.rotation.x,# transform.rotation.y,# transform.rotation.z,# transform.rotation.w]# )# self.get_logger().info(f平移rpy:{ratation_euler})return transformexcept Exception as e:self.get_logger().warn(f获取坐标转换异常{str(e)})def main():rclpy.init()patrol PatrolNode() #节点patrol.initial_pose()while rclpy.ok():points patrol.get_target_points()for point in points:x,y,yaw point[0],point[1],point[2]target_pose patrol.get_pose_by_xyyaw(x,y,yaw)patrol.nav_to_pose(target_pose)rclpy.shutdown() 基本上吧之前的单接口调用综合起来。 为方便参数配置在src/autopartol_robot/新建目录config新增配置文件 patrol_config.yaml patrol_node:ros__parameters:initial_point: [0.0, 0.0, 0.0]target_points: [0.0,0.0,0.0,1.0,2.0,3.14,-4.5,1.5,1.57,-8.0,-5.0,1.57,1.0,-5.0,3.14,] 注意目标点的选取是机器人可达的位置不能选到障碍物。 启动gazebo模拟器启动nav2. 再启动patrol_node ros2 run autopartol_robot patrol_node --ros-args --params-file /home/bohu/chapt7/chapt7_ws/install/autopartol_robot/share/autopartol_robot/config/patrol_config.yaml 会发现等一会开始初始化地图后开始沿着设定目标点运动。效果如下 也有异常情况机器人靠墙太近gazebo看出距离墙还有段距离但是在rviz里面局部代价地图有一点变形导致机器以为有障碍物卡住的现象。 7.5.3 添加语音播报功能 在chatpt7_ws/src下新建功能包autopatrol_interfaces,功能包下新建目录srv,srv新新建接口文件 speachText.srv string text # 合成文字 --- bool result # 合成结果 在CMakeLists.txt注册并在package.xml添加标签 member_of_grouprosidl_interface_packages/member_of_group 重新构建 src/autopartol_robot/autopartol_robot/目录下新建文件speaker.py import rclpy from rclpy.node import Node from autopatrol_interfaces.srv import SpeachText import espeakngclass Speaker(Node):def __init__(self):super().__init__(speaker)self.speech_service_ self.create_service(SpeachText,speech_text,self.speech_text_callback)self.speaker_ espeakng.Speaker()self.speaker_.voice zhdef speech_text_callback(self,request,response):self.get_logger().info(f正在朗读 {request.text})self.speaker_.say(request.text)self.speaker_.wait()response.result Truereturn responsedef main():rclpy.init()node Speaker()rclpy.spin(node)rclpy.shutdown() 修改patrol_node.py,增加语音合成调用 from geometry_msgs.msg import PoseStamped,Pose from nav2_simple_commander.robot_navigator import BasicNavigator,TaskResult import rclpy from rclpy.node import Node import rclpy.time from tf2_ros import TransformListener, Buffer #坐标监听器 from tf_transformations import quaternion_from_euler,euler_from_quaternion# 欧拉角转换 from autopatrol_interfaces.srv import SpeachTextclass PatrolNode(BasicNavigator):def __init__(self,node_namepatrol_node):super().__init__(node_name)self.buffer_ Buffer()self.listner_ TransformListener(self.buffer_,self)#声明相关参数self.declare_parameter(initial_point,[0.0, 0.0, 0.0])self.declare_parameter(target_points,[0.0, 0.0, 0.0, 1.0, 1.0, 1.57])self.initial_point_ self.get_parameter(initial_point).valueself.initial_points_ self.get_parameter(target_points).valueself.speech_client_ self.create_client(SpeachText,speech_text)def get_pose_by_xyyaw(self, x, y, yaw):# 通过x,y,yaw return PoseStamped对象 pose PoseStamped()pose.header.frame_id mappose.pose.position.x xpose.pose.position.y yquat quaternion_from_euler(0,0,yaw)pose.pose.orientation.x quat[0]pose.pose.orientation.y quat[1]pose.pose.orientation.z quat[2]pose.pose.orientation.w quat[3]return posedef init_robot_pose(self):#初始化机器人位姿self.initial_point_ self.get_parameter(initial_point).valueinit_pose self.get_pose_by_xyyaw(self.initial_point_[0],self.initial_point_[1],self.initial_point_[2]) self.setInitialPose(init_pose)self.waitUntilNav2Active()#等待导航可用def get_target_points(self):#通过参数值获取目标点集合points []self.target_points_ self.get_parameter(target_points).valuefor index in range(int(len(self.target_points_)/3)):x self.target_points_[index*3]y self.target_points_[index*31]yaw self.target_points_[index*32]points.append([x,y,yaw])self.get_logger().info(f获取到目标点{index}-{x},{y},{yaw})return points def nav_to_pose(self,target_pose):#导航到指定位姿self.waitUntilNav2Active()self.goToPose(target_pose)while not self.isTaskComplete():feedback self.getFeedback()self.get_logger().info(f剩余距离:{feedback.distance_remaining })reslut self.getResult()self.get_logger().info(f导航结果:{reslut}) def get_cuurent_pose(self):#通过TF获取当前位姿while rclpy.ok():try:result self.buffer_.lookup_transform(map,base_footprint,rclpy.time.Time(seconds0),rclpy.time.Duration(seconds1))transform result.transformself.get_logger().info(f平移:{transform.translation})# self.get_logger().info(f旋转:{transform.rotation})# ratation_euler euler_from_quaternion([# transform.rotation.x,# transform.rotation.y,# transform.rotation.z,# transform.rotation.w]# )# self.get_logger().info(f平移rpy:{ratation_euler})return transformexcept Exception as e:self.get_logger().warn(f获取坐标转换异常{str(e)})def speech_text(self,text):#调用服务合成语音while not self.speech_client_.wait_for_service(timeout_sec1):self.get_logger().info(wait for speech service)request SpeachText.Request()request.text textfuture self.speech_client_.call_async(request)rclpy.spin_until_future_complete(self,future)if future.result() is not None:result future.result().resultif result:self.get_logger().info(f语音合成成功{text})else:self.get_logger().warn(f语音合成失败{text})else:self.get_logger().warn(语音合成服务请求失败)def main():rclpy.init()patrol PatrolNode() #节点patrol.speech_text(正在准备初始化位置)patrol.init_robot_pose()patrol.speech_text(初始化位置完成)while rclpy.ok():points patrol.get_target_points()for point in points:x,y,yaw point[0],point[1],point[2]target_pose patrol.get_pose_by_xyyaw(x,y,yaw)patrol.speech_text(textf准备前往目标点{x},{y})patrol.nav_to_pose(target_pose)rclpy.shutdown() 效果跟上面类似日志输出多了语音的 [speaker-2] [INFO] [1737017187.818829250] [speaker]: 正在朗读 准备前往目标点1.0,2.0 [patrol_node-1] [INFO] [1737017191.194245817] [patrol_node]: 语音合成成功准备前往目标点1.0,2.0 [patrol_node-1] [INFO] [1737017195.311579068] [patrol_node]: Nav2 is ready for use! [patrol_node-1] [INFO] [1737017195.314096555] [patrol_node]: Navigating to goal: 1.0 2.0... [patrol_node-1] [INFO] [1737017195.509438991] [patrol_node]: 剩余距离:0.2445448786020279 [patrol_node-1] [INFO] [1737017195.612344544] [patrol_node]: 剩余距离:2.230710744857788 [patrol_node-1] [INFO] [1737017195.716231929] [patrol_node]: 剩余距离:2.230710744857788 [patrol_node-1] [INFO] [1737017195.819218225] [patrol_node]: 剩余距离:2.230710744857788 [patrol_node-1] [INFO] [1737017195.923079415] [patrol_node]: 剩余距离:2.230710744857788  7.5.4订阅图像并记录 from geometry_msgs.msg import PoseStamped,Pose from nav2_simple_commander.robot_navigator import BasicNavigator,TaskResult import rclpy from rclpy.node import Node import rclpy.time from tf2_ros import TransformListener, Buffer #坐标监听器 from tf_transformations import quaternion_from_euler,euler_from_quaternion# 欧拉角转换 from autopatrol_interfaces.srv import SpeachText from sensor_msgs.msg import Image #消息接口 from cv_bridge import CvBridge #图像转换 import cv2 #保存图像class PatrolNode(BasicNavigator):def __init__(self,node_namepatrol_node):super().__init__(node_name)self.buffer_ Buffer()self.listner_ TransformListener(self.buffer_,self)#声明相关参数self.declare_parameter(initial_point,[0.0, 0.0, 0.0])self.declare_parameter(target_points,[0.0, 0.0, 0.0, 1.0, 1.0, 1.57])self.initial_point_ self.get_parameter(initial_point).valueself.initial_points_ self.get_parameter(target_points).valueself.speech_client_ self.create_client(SpeachText,speech_text)# 订阅与保存图像相关定义self.declare_parameter(image_save_path, )self.image_save_path self.get_parameter(image_save_path).valueself.bridge CvBridge()self.latest_img_ Noneself.image_sub_ self.create_subscription(Image,/camera_sensor/image_raw,self.img_callback,1)def img_callback(self,msg):self.latest_img_ msgdef record_img(self):if self.latest_img_ is not Node:pose self.get_cuurent_pose()cv_image self.bridge.imgmsg_to_cv2(self.latest_img_)cv2.imwrite(f{self.image_save_path}img_{pose.translation.x:3.2f}_{pose.translation.y:3.2f}.png,cv_image) def get_pose_by_xyyaw(self, x, y, yaw):# 通过x,y,yaw return PoseStamped对象 pose PoseStamped()pose.header.frame_id mappose.pose.position.x xpose.pose.position.y yquat quaternion_from_euler(0,0,yaw)pose.pose.orientation.x quat[0]pose.pose.orientation.y quat[1]pose.pose.orientation.z quat[2]pose.pose.orientation.w quat[3]return posedef init_robot_pose(self):#初始化机器人位姿self.initial_point_ self.get_parameter(initial_point).valueinit_pose self.get_pose_by_xyyaw(self.initial_point_[0],self.initial_point_[1],self.initial_point_[2]) self.setInitialPose(init_pose)self.waitUntilNav2Active()#等待导航可用def get_target_points(self):#通过参数值获取目标点集合points []self.target_points_ self.get_parameter(target_points).valuefor index in range(int(len(self.target_points_)/3)):x self.target_points_[index*3]y self.target_points_[index*31]yaw self.target_points_[index*32]points.append([x,y,yaw])self.get_logger().info(f获取到目标点{index}-{x},{y},{yaw})return points def nav_to_pose(self,target_pose):#导航到指定位姿self.waitUntilNav2Active()self.goToPose(target_pose)while not self.isTaskComplete():feedback self.getFeedback()self.get_logger().info(f剩余距离:{feedback.distance_remaining })reslut self.getResult()self.get_logger().info(f导航结果:{reslut}) def get_cuurent_pose(self):#通过TF获取当前位姿while rclpy.ok():try:result self.buffer_.lookup_transform(map,base_footprint,rclpy.time.Time(seconds0),rclpy.time.Duration(seconds1))transform result.transformself.get_logger().info(f平移:{transform.translation})# self.get_logger().info(f旋转:{transform.rotation})# ratation_euler euler_from_quaternion([# transform.rotation.x,# transform.rotation.y,# transform.rotation.z,# transform.rotation.w]# )# self.get_logger().info(f平移rpy:{ratation_euler})return transformexcept Exception as e:self.get_logger().warn(f获取坐标转换异常{str(e)})def speech_text(self,text):#调用服务合成语音while not self.speech_client_.wait_for_service(timeout_sec1):self.get_logger().info(wait for speech service)request SpeachText.Request()request.text textfuture self.speech_client_.call_async(request)rclpy.spin_until_future_complete(self,future)if future.result() is not None:result future.result().resultif result:self.get_logger().info(f语音合成成功{text})else:self.get_logger().warn(f语音合成失败{text})else:self.get_logger().warn(语音合成服务请求失败)def main():rclpy.init()patrol PatrolNode() #节点patrol.speech_text(正在准备初始化位置)patrol.init_robot_pose()patrol.speech_text(初始化位置完成)while rclpy.ok():points patrol.get_target_points()for point in points:x,y,yaw point[0],point[1],point[2]target_pose patrol.get_pose_by_xyyaw(x,y,yaw)patrol.speech_text(textf准备前往目标点{x},{y})patrol.nav_to_pose(target_pose)patrol.speech_text(textf已到达目标点{x},{y},准备记录图像)patrol.record_img()patrol.speech_text(textf图像记录完成)rclpy.shutdown() 重新构建后运行拍照效果如下
http://www.hkea.cn/news/14565046/

相关文章:

  • 通过ip访问网站需要怎么做企业宣传片模板
  • 松阳县建设局网站电子商务网站建设与管理案例
  • 做网站怎么那么难房子装修设计图用什么软件
  • 开封网站建设流程与开发步骤西安网站设计培训试听
  • 吉林市网站建设招标织梦制作wap网站
  • 国外网站怎么建设永康网站建设zjyuxun
  • 单页营销网站设计织梦网站安装视频
  • 万州网站推广用rp怎么做网站功能按钮
  • 网站上线模板临沂建网站哪家好
  • 南上海网站建设网站需要什么
  • 网站机房建设解决方案做pc端网站怎么样
  • title 镇江网站建设广州免费核酸检测地点
  • 大朗镇住房规划建设局网站app开发用什么编程语言
  • 网站右侧浮动广告代码立水桥大型网站建设
  • 自己做的网站首页变成符号了京东商城官网入口
  • 网站建设哪家服务周到云南网站开发网络公司前10
  • 淘客网站怎么做啊网站建设域名是什么意思
  • 做微官网什么网站好河北省建设机械协会网站首页
  • 最好看的免费网站源码网站导航的分类有哪些
  • 石家庄市住房和城乡建设局官方网站php制作招聘网站
  • 信息流广告素材网站重庆网站搭建方案
  • 自助外贸网站建设学校网站建设板块分析
  • 提供营销型网站移动端手机网站建设
  • 分销网站建立什么网站立刻买东西
  • php做电子商城网站网站开发设计思想报告
  • 南阳哪里做网站网站权重的提升
  • 找网站建设客户莘县网站
  • 数据上传网站临海做网站的公司
  • 建设网站的公司兴田德润在哪里博客网站哪个权重高
  • 湖北专业网站建设如何选择丹阳网站建设