ubuntu16.04ros-用海龟机器人仿真循线系统

下载安装sudo apt-get install ros-kinetic-turtlebot ros-kinetic-turtlebot-apps ros-kinetic-turtlebot-interactions ros-kinetic-turtlebot-simulator ros-kinetic-kobuki-ftdi
在这里插入图片描述

sudo apt-get install ros-kinetic-rocon-*

在这里插入图片描述

echo "source /opt/ros/kinetic/setup.bash" >>~/.bashrc
source ~/.bashrc
rosdep update

在这里插入图片描述
1进入home目录,按下ctrl+h显示隐藏文件。进入.gezebo/models文件夹,将附件models压缩包解压到这个文件夹下
发现我的.gezebo目录下没有models文件,分析原因后
首先安装Git

sudo apt-get update
sudo apt-get install git

然后使用git clone命令克隆gazebo_models仓库到.gezebo/models目录。需要先创建:

mkdir -p ~/.gazebo/models
git clone https://github.com/osrf/gazebo_models.git ~/.gazebo/models

在这里插入图片描述
安装OpenNI相机驱动包和OpenNI启动包

sudo apt-get install ros-kinetic-openni-camera
sudo apt-get install ros-kinetic-openni-launch

启动 roscore 进程 roscore
启动仿真环境

roslaunch turtlebot_gazebo turtlebot_world.launch world_file:=/opt/ros/kinetic/share/turtlebot_gazebo/worlds/playground.world

启动传感器

rostopic echo scan -n 1

加载世界地图roslaunch turtlebot_gazebo turtlebot_world.launch
在rviz中显示

roslaunch turtlebot_rviz_launchers view_robot.launch --screen

在这里插入图片描述
在左侧选择显示深度相机数据DepthCloud,显示深度图片Image,在Image中选择rgb话题加载图片
在这里插入图片描述
设计循线路径
创建如下文件夹
在这里插入图片描述
将下列图片MyImage.png放进模型my_ground_plane/materials/textures下
在这里插入图片描述
在my_ground_plane文件下创建model.sdf文件和model.config文件,内容如下

model.config内容

<?xml version="1.0" encoding="UTF-8"?>
<model>
   <name>My Ground Plane</name>
   <version>1.0</version>
   <sdf version="1.4">model.sdf</sdf>
   <description>My textured ground plane.</decsription>
</model>
model.sdf内容如下

<?xml version="1.0" encoding="UTF-8"?>
<sdf version="1.4">
   <model name="my_ground_plane">
      <static>true</static>
      <link name="link">
	 <collision name="collision">
	    <geometry>
	       <plane>
		  <normal>0 0 1</normal>
		  <size>15 15</size>
	       </plane>
	    </geometry>
	    <surface>
	        <friction>
		   <ode>
		      <mu>100</mu>
		      <mu2>50</mu2>
		   </ode>
	        </friction>
	    </surface>
	 </collision>
	 <visual name="visual">
	    <cast_shadows>false</cast_shadows>
	    <geometry>
	       <plane>
		  <normal>0 0 1</normal>
		  <size>15 15</size>
	       </plane>
	    </geometry>
	    <material>
	       <script>
		  <uri>model://my_ground_plane/materials/scripts</uri>
	          <uri>model://my_ground_plane/materials/textures/</uri>
	          <name>MyGroundPlane/Image</name>
	       </script>
	    </material>
	 </visual>
      </link>
   </model>
</sdf>
	

然后打开gazebo

roslaunch turtlebot_gazebo turtlebot_world.launch

另开一个终端roslaunch turtlebot_rviz_launchers view_robot.launch --screen
点击gazebo左上角的insert插入刚建立的my_ground_plane模型
但是发现gazebo内没有刚建立的模型
可能是Gazebo未更新模型路径

export GAZEBO_MODEL_PATH=${GAZEBO_MODEL_PATH}:/你模型的路径/模型名

要使这个变量在每次打开新终端时都可用,添加

nano ~/.bashrc

添加上述 export 命令到文件的末尾,保存并关闭文件。然后重新加载.bashrc文件

source ~/.bashrc

验证环境变量

echo $GAZEBO_MODEL_PATH

发现有刚才添加的模型路径
重新启动gazebo
发现还是没有,于是试一下:模型文件夹位于ROS的工作空间中
我的工作空间命名为catkin_ws
首先将模型文件复制进工作空间的src下

cp -r /home/hh/.gazebo/models/my_ground_plane ~/catkin_ws/src/my_ground_plane

然后更新工作空间并重新编译

cd ~/catkin_ws
catkin_make

然后源更新后的工作空间,以便ROS能够识别新添加的模型

source devel/setup.bash

还是不行,最后我找到了一种直接放进去的办法,看下面
使用spawn_model服务来加载和放置模型

rosrun gazebo_ros spawn_model -file ~/catkin_ws/src/my_ground_plane/model.sdf -sdf -model my_ground_plane

点中物品右键删除,除了导入的地板和机器人
在这里插入图片描述


在这里插入图片描述
写脚本控制机器人循线
在这里插入图片描述

cd src/turtlrbot1/src
gedit follower_color_filter.py
rosrun turtlebot1 follower_color_filter.py

follower_color_filter.py如下:

#!/usr/bin/env python
 
# BEGIN ALL
 
import rospy, cv2, cv_bridge, numpy
 
from sensor_msgs.msg import Image
 
 
 
class Follower:
 
  def __init__(self):
 
    self.bridge = cv_bridge.CvBridge()
 
    self.image_sub = rospy.Subscriber('camera/rgb/image_raw',
 
                                      Image, self.image_callback)
 
    self.ori_pub = rospy.Publisher('ori', Image, queue_size=1)
 
    self.hsv_pub = rospy.Publisher('hsv', Image, queue_size=1)
 
    self.mask_pub = rospy.Publisher('mask', Image, queue_size=1)
 
  def image_callback(self, msg):
 
    # BEGIN BRIDGE
 
    # 将摄像头采集到的sensor_msgs/Image消息转换为OpenCV使用的对象
 
    # 将原始sensor_msgs/Image消息发布,用于RViz显示
 
    image = self.bridge.imgmsg_to_cv2(msg,desired_encoding='bgr8')
 
    self.ori_pub.publish(msg)
 
    # END BRIDGE
 
    # BEGIN HSV
 
    # 将RGB图像转换为HSV图像
 
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
 
    # 将HSV图像转换为sensor_msgs/Image消息并发布
 
    try:
 
       self.hsv_pub.publish(self.bridge.cv2_to_imgmsg(hsv))
 
    except cv_bridge.CvBridgeError as e:
 
       print(e)
 
    # END HSV
 
    # BEGIN FILTER
 
    # 使用黄色阈值判断色调,转换为二值图
 
    lower_yellow = numpy.array([ 26,  43, 46])
 
    upper_yellow = numpy.array([34, 255, 255])
 
    mask = cv2.inRange(hsv, lower_yellow, upper_yellow)
 
    # END FILTER
 
    masked = cv2.bitwise_and(image, image, mask=mask)
 
    # 发布mask消息
 
    try:
 
       self.mask_pub.publish(self.bridge.cv2_to_imgmsg(mask))
 
    except cv_bridge.CvBridgeError as e:
 
       print(e)
 
    cv2.waitKey(3)
 
 
 
rospy.init_node('follower')
 
follower = Follower()
 
rospy.spin()
 
# END ALL

运行时报错了 SyntaxError: Non-ASCII character '\xe5' in file /home/hh/turtlebot_ws/src/turtlrbot1/src/follower_color_filter.py on line 31, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
在代码开头加上一句 # -*- coding: utf-8 -*- 就可以啦
输入rostopic list查看是否有ori、hsv、mask话题,打开RViz

rosrun rviz rviz

点击界面左下角add按钮,在弹窗顶部选择by topic选项卡,分别点击/ori、/hsv、/mask下的image,添加image话题后,显示如下:
在这里插入图片描述
关闭这个后,编写运行follower_line.py

#!/usr/bin/env python
 
# BEGIN ALL
 
import rospy, cv2, cv_bridge, numpy
 
from sensor_msgs.msg import Image
 
from geometry_msgs.msg import Twist
 
 
 
class Follower:
 
  def __init__(self):
 
    self.bridge = cv_bridge.CvBridge()
 
    self.image_sub = rospy.Subscriber('camera/rgb/image_raw',
 
                                      Image, self.image_callback)
 
    self.cmd_vel_pub = rospy.Publisher('cmd_vel',
 
                                       Twist, queue_size=1)
 
    self.circle_pub = rospy.Publisher('circle', Image, queue_size=1)
 
    self.twist = Twist()
 
  def image_callback(self, msg):
 
    # 检测黄色线条
 
    image = self.bridge.imgmsg_to_cv2(msg,desired_encoding='bgr8')
 
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
 
    lower_yellow = numpy.array([ 26,  43, 46])
 
    upper_yellow = numpy.array([34, 255, 255])
 
    mask = cv2.inRange(hsv, lower_yellow, upper_yellow)
 
    # 获取图像尺寸信息:高度、宽度、通道数
 
    h, w, d = image.shape
 
    # 限定关注范围,检测边线
 
    search_top = 3*h/4
 
    search_bot = 3*h/4 + 20
 
    mask[0:search_top, 0:w] = 0
 
    mask[search_bot:h, 0:w] = 0
 
    M = cv2.moments(mask)
 
    if M['m00'] > 0:
 
      cx = int(M['m10']/M['m00'])
 
      cy = int(M['m01']/M['m00'])
 
      # 绘制目标点
 
      cv2.circle(image, (cx, cy), 20, (0,0,255), -1)
 
      # BEGIN CONTROL
 
      # 计算中心偏差值
 
      err = cx - w/2
 
      self.twist.linear.x = 0.2
 
      # 根据偏差值修改角速度大小,实现转向跟随
 
      self.twist.angular.z = -float(err) / 100
 
      self.cmd_vel_pub.publish(self.twist)
 
      # END CONTROL
 
    try:
 
       self.circle_pub.publish(self.bridge.cv2_to_imgmsg(image))
 
    except cv_bridge.CvBridgeError as e:
 
       print(e)
 
cv2.waitKey(3)
 
 
 
rospy.init_node('follower')
 
follower = Follower()
 
rospy.spin()
 
# END ALL

运行巡线脚本

rosrun turtlebot1 follower_line.py

打开rviz
如上点开circle话题里的Image,如下图
# -*- coding: utf-8 -*-
结束啦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/939497.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8目标检测(六)_封装API接口

YOLOv8目标检测(一)_检测流程梳理&#xff1a;YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集&#xff1a;YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型&#xff1a;YOLOv8目标检测(三)_训…

中后台管理信息系统:Axure12套高效原型设计框架模板全解析

中后台管理信息系统作为企业内部管理的核心支撑&#xff0c;其设计与实现对于提升企业的运营效率与决策能力具有至关重要的作用。为了满足多样化的中后台管理系统开发需求&#xff0c;一套全面、灵活的原型设计方案显得尤为重要。本文将深入探讨中后台管理信息系统通用原型方案…

uniapp使用腾讯地图接口的时候提示此key每秒请求量已达到上限或者提示此key每日调用量已达到上限问题解决

要在创建的key上添加配额 点击配额之后进入分配页面&#xff0c;分配完之后刷新uniapp就可以调用成功了。

【一篇搞定配置】如何在Ubuntu上配置单机/伪分布式Hadoop

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;各种软件安装与配置_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1.…

利用Python爬虫实现数据收集与挖掘

Python爬虫是一种自动化程序&#xff0c;可以模拟浏览器行为&#xff0c;自动地从互联网上抓取、分析和收集数据。Python爬虫通常使用requests、selenium等库来发送HTTP请求&#xff0c;获取网页内容&#xff0c;并使用BeautifulSoup、lxml等库来解析网页&#xff0c;提取所需的…

语音识别失败 chrome下获取浏览器录音功能,因为安全性问题,需要在localhost或127.0.0.1或https下才能获取权限

环境&#xff1a; Win10专业版 谷歌浏览器 版本 131.0.6778.140&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; 问题描述&#xff1a; 局域网web语音识别出现识别失败 chrome控制台出现下获取浏览器录音功能&#xff0c;因为安全性问题&#xff0c;需要在…

springboot444新冠物资管理系统的设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装新冠物资管理系统软件来发挥其高效地信息处理的作用&#x…

arcgisPro将面要素转成CAD多段线

1、说明&#xff1a;正常使用【导出为CAD】工具&#xff0c;则导出的是CAD三维多线段&#xff0c;无法进行编辑操作、读取面积等。这是因为要素面中包含Z值&#xff0c;导出则为三维多线段数据。需要利用【复制要素】工具禁用M值和Z值&#xff0c;再导出为CAD&#xff0c;则得到…

当我用影刀AI Power做了一个旅游攻略小助手

在线体验地址&#xff1a;旅游攻略小助手https://power.yingdao.com/assistant/ca1dfe1c-9451-450e-a5f1-d270e938a3ad/share 运行效果图展示&#xff1a; 话不多说一起看下效果图&#xff1a; 智能体的截图&#xff1a; 工作流截图&#xff1a; 搭建逻辑&#xff1a; 其实这…

计算机组成原理的学习笔记(2)--数据的表示和运算·其一

学习笔记 前言 本文主要是对于b站尚硅谷的计算机组成原理的学习笔记&#xff0c;仅用于学习交流。 正文 1. 浮点数表示 浮点数结构&#xff1a; 符号位&#xff08;1 位&#xff09;&#xff1a;表示数值的正负。 阶码&#xff08;8 位&#xff09;&#xff1a;表示指数部…

网络安全渗透有什么常见的漏洞吗?

弱口令与密码安全问题 THINKMO 01 暴力破解登录&#xff08;Weak Password Attack&#xff09; 在某次渗透测试中&#xff0c;测试人员发现一个网站的后台管理系统使用了非常简单的密码 admin123&#xff0c;而且用户名也是常见的 admin。那么攻击者就可以通过暴力破解工具&…

【AI图像生成网站Golang】项目测试与优化

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与优化 六、项目测试与优化 在开发过程中&#xff0c;性能优化是保证项目可扩展性和用户体验的关键步骤。本文将详细介绍我如何使用一…

数据库与缓存数据一致性方案【终极版】

核心流程 1. 删除数据库同步删除缓存&#xff1a; 缩小可能发生脏数据的时间窗 2. Binlog MQ删除缓存&#xff1a; 兜底所有入口&#xff0c;避免遗漏删除缓存场景&#xff0c;同时通过MQ的消息重试保证缓存一定删除成功 3. 监听Binlog延迟N秒进行数据一致性校验&#xf…

RK3576 介绍

RK3576 介绍 1 介绍1.1 概述1.2 RK3576、RK3588、RK3568 和 RK3399 的参数对比 2 DataSheet2.1 RK35762.2 RK35882.3 RK35682.4 RK3399 参考 1 介绍 1.1 概述 ARM 64位高性能八核通用处理器&#xff0c;丰富的PCIE/USB3.0/SATA/GMAC等各类高速及CAN FD/DSMC/UART/SPI/I2C/I3C…

01、NodeJS学习笔记,第一节:Node.js初识与内置模块

一、初识Node.js与内置模块 ##网址 https://nodejs.org##npm包 https://www.npmjs.com/ &#xff08;搜索&#xff09;https://registry.npmjs.org/ &#xff08;下载&#xff09;1、初识Node.js ##思考&#xff1a;为什么JavaScript可以在浏览器中被执行因为浏览器…

【数据集】50种汽车零件分类识别数据集10382张YOLO+VOC格式(已增强)

数据集格式&#xff1a;VOC格式YOLO格式 压缩包内含&#xff1a;3个文件夹&#xff0c;分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计&#xff1a;10382 Annotations文件夹中xml文件总计&#xff1a;10382 labels文件夹中txt文件总计&#xff1a;10382 标签种类数…

深度学习0-前置知识

一、背景 AI最大&#xff0c;它的目的是通过让机器模仿人类进而超越人类&#xff1b; ML次之&#xff0c;它是AI的一个分支&#xff0c;是让机器模仿人类的一种方法。开发人员用大量数据和算法“训练”机器&#xff0c;让机器自行学会如何执行任务&#xff0c;它的成功取决于…

arcgis for js实现地图截图、地图打印

地图截图 效果 实现 复制运行即可 要实现复杂的截图保存可以参考 官网案例 <!DOCTYPE html> <html lang"zn"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" />…

如何用上AI视频工具Sora,基于ChatGPT升级Plus使用指南

没有GPT&#xff0c;可以参考这个教程&#xff1a;详情移步至底部参考原文查看哦~ 1.准备工作 详情移步至底部参考原文查看哦~ 详情移步至底部参考原文查看哦~ 4.Sora使用 详情移步至底部参考原文查看哦 参考文章&#xff1a;【包教包会】如何用上AI视频工具Sora&#xff…

FFmpeg 安装教程(Windows 系统)

1. 前言 FFmpeg 是一个用于处理视频、音频等多媒体文件的开源工具包。它支持几乎所有的多媒体格式转换、剪辑和编辑&#xff0c;是开发者和多媒体工作者必备的工具。本文详细讲解如何在 Windows 系统上安装 FFmpeg 并进行基本配置。 2. 下载 FFmpeg 安装包 打开 Dpwnload FFmp…