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

news2025/4/3 4:53:47

下载安装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 -*-
结束啦!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.3 Postman环境变量与全局变量

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 变量类型2 环境变量&#xff08;Environment Variables&#xff09;3 全局变量&#xff08;Global Variables&#xff09;4 环境变量与全局变量的区别 前言 为了提高测试的灵活…

概率论得学习和整理27:关于离散的数组 随机变量数组的均值,方差的求法3种公式,思考和细节。

目录 1 例子1&#xff1a;最典型的&#xff0c;最简单的数组的均值&#xff0c;方差的求法 2 例子1的问题&#xff1a;例子1只是1个特例&#xff0c;而不是普遍情况。 2.1 例子1各种默认假设&#xff0c;导致了求均值和方差的特殊性&#xff0c;特别简单。 2.2 我觉得 加权…

模型 QFD(质量功能展开/质量屋)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。将客户需求转化为产品设计。 1 模型 QFD&#xff08;质量功能展开&#xff09;的应用 1.1 电信服务及网络维护过程质量改进QFD应用案例 背景介绍&#xff1a; 随着中国加入WTO和国家对电信管制的普遍…

ECharts柱状图-柱图38,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

Android XR 应用程序开发 | 从 Unity 6 开发准备到应用程序构建的步骤

在本文中 将解释为 Android XR 开发做准备的步骤&#xff0c;从下载 Unity 6 到项目和构建。 &#xff08;这次我将解释使用 Mac 的设置&#xff0c;但 Windows 的过程通常相同。 &#xff09; 如果您的许可证是 Personal&#xff0c;您仍然可以使用 Unity 开发 Android XR 应…

204页PPT金税四期监管要求与最新政策及风险防范-培训课件

这份资料是关于金税四期监管要求、最新政策及风险防范的培训课件&#xff0c;包含204页PPT内容。核心内容涉及金税四期的发展历程、与金税三期的主要变化、指挥决策系统、税务风险预警指标、重点监控行为、税务稽查重点领域、避税方法及处罚、以及企业自查和税务风险管控原理。…

比较器基本玩法

1 红外水龙头 1 比较器的工作特性 2 红外接收二极管的工作原理 1 红外发射二极管和红外接收二极管 2 红外接收二极管接收到&#xff0c;产生的电流是100uA&#xff0c;即电压等于4V 3 自动出水水龙头 4 比较器内部结构 1 有一些比较器需要加上拉电阻&#xff08;类似开漏输…

基于Qt的登陆界面设计

目标 自由发挥登录界面的应用场景&#xff0c;实现一个登录窗口的界面。 要求&#xff1a;每行代码都要有注释 代码 // 设置窗口大小为600x400像素 this->resize(600,400); // 设置窗口标题为"TheWitcher 巫师3&#xff1a;狂猎" this->setWindowTitle(&qu…

数据库建模工具 PDManer

数据库建模工具 PDManer 1.PDManer简介2.PDManer使用 1.PDManer简介 PDManer&#xff08;元数建模&#xff09;是一款功能强大且易于使用的开源数据库建模工具。它不仅支持多种常见数据库&#xff0c;如MySQL、PostgreSQL、Oracle、SQL Server等&#xff0c;还特别支持国产数据…

排序算法深度好文(图解 + 代码解析 + 误区 QA )——学排序看这一篇就够了!!!

排序算法 一、概述 1. 内部排序 (1) 冒泡排序 (2) 选择排序 a. 简单选择排序 b. 堆排序 (3) 插入排序 a. 直接插入排序 b. 希尔排序 (4) 快速排序 快速排序 hoare 版本 快速排序挖坑法 优化一随机化快速排序 优化二中位数三分法 (5) 归并排序 (6) 基数排序 2. …

【C语言程序设计——基础】顺序结构程序设计(头歌实践教学平台习题)【合集】

目录&#x1f60b; <第1关&#xff1a;顺序结构的应用> 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果&#xff1a; <第2关&#xff1a;交换变量值> 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果&#xff1a; <第…

git stash 的文件如何找回

在Git中&#xff0c;如果你使用了git stash命令来保存你的工作进度&#xff0c;但之后想要找回这些被stash的文件&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1. 查看stash列表 首先&#xff0c;使用git stash list命令来查看当前保存的所有stash记录。这个命令会列出…

【报表查询】.NET开源ORM框架 SqlSugar 系列

文章目录 前言实践一、按月统计没有为0实践二、 统计某月每天的数量实践三、对象和表随意JOIN实践四、 List<int>和表随意JOIN实践五、大数据处理实践六、每10分钟统计Count实践七、 每个ID都要对应时间总结 前言 在我们实际开发场景中&#xff0c;报表是最常见的功能&a…

基于asp.net游乐园管理系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…

电脑上怎么运行手机APP(电脑上运行手机APP的4种方法)

玩家可能不愿意在小屏幕上使用 Android 应用程序。此外&#xff0c;某些游戏玩家可能更喜欢在更大的屏幕上寻找刺激的体验&#xff0c;例如 PC 提供的体验&#xff0c;这可以增强他们的乐趣。因此&#xff0c;他们可能对如何在 PC 上流畅地运行 Android 应用程序感到好奇。本指…

oscp学习之路,Kioptix Level1靶场小白速通教程

oscp学习之路&#xff0c;Kioptix Level1靶场小白速通教程 有意向学习oscp的可以私信我一起交流学习 1.前期准备 首先下载好靶场文件&#xff0c;通过nmap进行扫描&#xff0c;确定IP地址和开放端口 发现IP是192.168.201.129,开放的端口为22,80,111,139,443,1024这几个端口。访…

【Ubuntu】设置静态Ip

查看网卡 ifconfig | grep -A 5 -B 2 192 修改配置文件 sudo vim /etc/netplan/00-installer-config.yamlnetwork:ethernets:enp0s3:dhcp4: noaddresses:- 192.168.1.100/24gateway4: 192.168.1.1nameservers:addresses:- 8.8.8.8- 8.8.4.4​​​​​

演员念真主演电视剧《依依向北风》获奖

2024年12月17日&#xff0c;南京广播电视集团和江苏12家城市台的领导、嘉宾&#xff0c;全国其他省市电视台嘉宾&#xff0c;影视公司代表、项目主创团队代表等&#xff0c;相聚南京国际青年会议酒店&#xff0c;举行江苏城市联合公司“城市之星”项目资源推介会暨2024年度“城…

Word使用分隔符实现页面部分分栏

文章目录 Word使用分隔符实现页面部分分栏分隔符使用页面设置 Word使用分隔符实现页面部分分栏 分隔符使用 word中的分隔符&#xff1a; 前面不分栏&#xff0c;后面分栏(或前面分栏&#xff0c;后面不分栏)&#xff0c;只需要在分隔位置处插入分隔符&#xff1a;“连续”即…

Sensapex 微纳米显微平台:高精度、低漂移、模块化的科研引擎

Sensapex微纳米显微平台以其卓越的技术性能&#xff0c;成为科研领域的重要工具。其高精度定位技术确保了实验结果的可靠性&#xff0c;低漂移设计适应了长时间复杂实验的需求。模块化设计为用户提供了灵活性&#xff0c;可根据不同实验需求自由组合。Sensapex微纳米显微平台广…