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 ALLimport rospy, cv2, cv_bridge, numpyfrom sensor_msgs.msg import Imageclass 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 FILTERmasked = 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 ALLimport rospy, cv2, cv_bridge, numpyfrom sensor_msgs.msg import Imagefrom geometry_msgs.msg import Twistclass 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/4search_bot = 3*h/4 + 20mask[0:search_top, 0:w] = 0mask[search_bot:h, 0:w] = 0M = 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/2self.twist.linear.x = 0.2# 根据偏差值修改角速度大小,实现转向跟随self.twist.angular.z = -float(err) / 100self.cmd_vel_pub.publish(self.twist)# END CONTROLtry: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,如下图

结束啦!!!
相关文章:
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…...
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误 您在 Ubuntu 20.04 上编译 OpenCV 3.2 时遇到的错误与 C 标准库的头文件配置问题有关。错误消息指出系统无法找到 <stdlib.h>,这通常与预编译头文件的处理、GCC 版本或者头文件搜索路径有关。下面…...
HTML综合案例
为了前端考试。 效果图: HTML代码: <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...
TanStack——为现代前端开发提供高性能和灵活的工具
TanStack 是一个由社区主导的开源项目集合,专注于为现代前端开发提供高性能和灵活的工具。它包括多个流行的 JavaScript 和 TypeScript 库,主要用于处理表格、查询、虚拟化、状态管理等功能。 文章目录 1、TanStack Query:1.1 useQuery&#…...
Java爬虫️ 使用Jsoup库进行API请求有什么优势?
在Java的世界里,Jsoup库以其强大的HTML解析能力而闻名。它不仅仅是一个简单的解析器,更是一个功能齐全的工具箱,为开发者提供了从网页抓取到数据处理的一站式解决方案。本文将深入探讨使用Jsoup库进行API请求的优势,并提供代码示例…...
React源码02 - 基础知识 React API 一览
1. JSX到JavaScript的转换 <div id"div" key"key"><span>1</span><span>2</span> </div>React.createElement("div", // 大写开头会当做原生dom标签的字符串,而组件使用大写开头时,这…...
COMSOL with Matlab
文章目录 基本介绍COMSOL with MatlabCOMSOL主Matlab辅Matlab为主Comsol为辅 操作步骤常用指令mphopenmphgeommghmeshmphmeshstatsmphnavigatormphplot常用指令mphsavemphlaunchModelUtil.clear 实例教学自动另存新档**把语法套用到边界条件**把语法套用到另存新档 函数及其微分…...
【报表查询】.NET开源ORM框架 SqlSugar 系列
文章目录 前言实践一、按月统计没有为0实践二、 统计某月每天的数量实践三、对象和表随意JOIN实践四、 List<int>和表随意JOIN实践五、大数据处理实践六、每10分钟统计Count实践七、 每个ID都要对应时间总结 前言 在我们实际开发场景中,报表是最常见的功能&a…...
PostgreSQL数据库访问限制详解
pg_hba.conf 文件是 PostgreSQL 数据库系统中非常重要的一个配置文件,它用于定义哪些用户(或客户端)可以连接到 PostgreSQL 数据库服务器,以及他们可以使用哪些认证方法进行连接。 pg_hba.conf 的名称来源于 "Host-Based Aut…...
【test linux】创建一个ext4类型的文件系统
创建一个ext4类型的文件系统 dd 是一个非常强大的命令行工具,用于在Unix/Linux系统中进行低级别的数据复制和转换。这条命令的具体参数含义如下: if/dev/zero:指定输入文件(input file)为 /dev/zero,这是一…...
如何在繁忙的生活中找到自己的节奏?
目录 一、理解生活节奏的重要性 二、分析当前生活节奏 1. 时间分配 2. 心理状态 3. 身体状况 4. 生活习惯 1. 快慢适中 2. 张弛结合 3. 与目标相符 三、掌握调整生活节奏的策略 1. 设定优先级 2. 合理规划时间 3. 学会拒绝与取舍 4. 保持健康的生活方式 5. 留出…...
AI-PR曲线
PR曲线 人工智能里面的一个小概念。 2.3 性能度量(查全率,查准率,F1,PR曲线与ROC曲线) 预测出来的是一个概率,不能根据概率来说它是正类还是负类,要有一个阈值。 查准率(Precision&…...
Guava 提供了集合操作 `List`、`Set` 和 `Map` 三个工具类
入门示例 guava 最佳实践 学习指南 以下是使用Google Guava库中的工具方法来创建和操作List、Set、Map集合的一些示例: List相关操作 创建List 使用Lists.newArrayList()创建一个新的可变ArrayList实例。List<Integer> list Lists.newArrayList(1, 2, 3);/…...
深入解析 Elasticsearch 集群配置文件参数
在自建 Elasticsearch 集群时,我们需要通过 elasticsearch.yml 文件对节点角色、网络设置、集群发现和数据存储路径等进行灵活配置。配置项的合理设置对集群的稳定性、性能与扩展性影响深远。本文将以一个示例配置文件为蓝本,逐条解析各参数的含义与建议…...
WebMvcConfigurer和WebMvcConfigurationSupport(MVC配置)
一:基本介绍 WebMvcConfigurer是接口,用于配置全局的SpringMVC的相关属性,采用JAVABean的方式来代替传统的XML配置文件,提供了跨域设置、静态资源处理器、类型转化器、自定义拦截器、页面跳转等能力。 WebMvcConfigurationSupport是webmvc的…...
用 javascript 来回答宇宙外面是什么
宇宙外面是什么呢? 估计这个问题要困扰很多人, 让我们用一段 javascript 代码来回答一下. 一, 从一段代码说起 var 地球 {名字 : "地球",女友 : "月亮",外面 : {名字 : "太阳系",老大 : "太阳",老二 : {名字 : "木星",二…...
我的性能优化经验
专业方向:App cpu/memory/gpu/流畅度/响应时间的优化,Anr,Framework CarPowerManagementService模块的(STR),从0~1完成性能监控体系搭建,完成3大版本迭代高质量性能交付 响应时间: …...
XSLT 编辑 XML
XSLT 编辑 XML 介绍 XSLT(可扩展样式表语言转换)是一种用于转换XML文档的语言。它允许开发人员将XML数据转换为其他格式,如HTML、PDF或纯文本。XSLT通过使用XPath查询来定位XML文档中的元素,并对这些元素应用转换规则。在本教程…...
数智读书笔记系列010 生命3.0:人工智能时代 人类的进化与重生
书名:生命3.0 生命3.0:人工智能时代,人类的进化与重生 著者:[美]迈克斯•泰格马克 迈克斯・泰格马克 教育背景与职业 教育背景:迈克斯・泰格马克毕业于麻省理工学院,获物理学博士学位。职业经…...
Transfomer的各层矩阵
一、输入 输入一句话:Hello CYZLAB the inspired world 每个单词为一个token 二、Embedding 这里的词向量维度为6,矩阵的行数为token数,列数是词向量的维度 这列是注释不算hello122694CYZLAB222372the222596inspired132440world431273 …...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
