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

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,如下图
# -*- coding: utf-8 -*-
结束啦!!!

相关文章:

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>&#xff0c;这通常与预编译头文件的处理、GCC 版本或者头文件搜索路径有关。下面…...

HTML综合案例

为了前端考试。 效果图&#xff1a; HTML代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

TanStack——为现代前端开发提供高性能和灵活的工具

TanStack 是一个由社区主导的开源项目集合&#xff0c;专注于为现代前端开发提供高性能和灵活的工具。它包括多个流行的 JavaScript 和 TypeScript 库&#xff0c;主要用于处理表格、查询、虚拟化、状态管理等功能。 文章目录 1、TanStack Query&#xff1a;1.1 useQuery&#…...

Java爬虫️ 使用Jsoup库进行API请求有什么优势?

在Java的世界里&#xff0c;Jsoup库以其强大的HTML解析能力而闻名。它不仅仅是一个简单的解析器&#xff0c;更是一个功能齐全的工具箱&#xff0c;为开发者提供了从网页抓取到数据处理的一站式解决方案。本文将深入探讨使用Jsoup库进行API请求的优势&#xff0c;并提供代码示例…...

React源码02 - 基础知识 React API 一览

1. JSX到JavaScript的转换 <div id"div" key"key"><span>1</span><span>2</span> </div>React.createElement("div", // 大写开头会当做原生dom标签的字符串&#xff0c;而组件使用大写开头时&#xff0c;这…...

COMSOL with Matlab

文章目录 基本介绍COMSOL with MatlabCOMSOL主Matlab辅Matlab为主Comsol为辅 操作步骤常用指令mphopenmphgeommghmeshmphmeshstatsmphnavigatormphplot常用指令mphsavemphlaunchModelUtil.clear 实例教学自动另存新档**把语法套用到边界条件**把语法套用到另存新档 函数及其微分…...

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

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

PostgreSQL数据库访问限制详解

pg_hba.conf 文件是 PostgreSQL 数据库系统中非常重要的一个配置文件&#xff0c;它用于定义哪些用户&#xff08;或客户端&#xff09;可以连接到 PostgreSQL 数据库服务器&#xff0c;以及他们可以使用哪些认证方法进行连接。 pg_hba.conf 的名称来源于 "Host-Based Aut…...

【test linux】创建一个ext4类型的文件系统

创建一个ext4类型的文件系统 dd 是一个非常强大的命令行工具&#xff0c;用于在Unix/Linux系统中进行低级别的数据复制和转换。这条命令的具体参数含义如下&#xff1a; if/dev/zero&#xff1a;指定输入文件&#xff08;input file&#xff09;为 /dev/zero&#xff0c;这是一…...

如何在繁忙的生活中找到自己的节奏?

目录 一、理解生活节奏的重要性 二、分析当前生活节奏 1. 时间分配 2. 心理状态 3. 身体状况 4. 生活习惯 1. 快慢适中 2. 张弛结合 3. 与目标相符 三、掌握调整生活节奏的策略 1. 设定优先级 2. 合理规划时间 3. 学会拒绝与取舍 4. 保持健康的生活方式 5. 留出…...

AI-PR曲线

PR曲线 人工智能里面的一个小概念。 2.3 性能度量&#xff08;查全率&#xff0c;查准率&#xff0c;F1&#xff0c;PR曲线与ROC曲线&#xff09; 预测出来的是一个概率&#xff0c;不能根据概率来说它是正类还是负类&#xff0c;要有一个阈值。 查准率&#xff08;Precision&…...

Guava 提供了集合操作 `List`、`Set` 和 `Map` 三个工具类

入门示例 guava 最佳实践 学习指南 以下是使用Google Guava库中的工具方法来创建和操作List、Set、Map集合的一些示例&#xff1a; List相关操作 创建List 使用Lists.newArrayList()创建一个新的可变ArrayList实例。List<Integer> list Lists.newArrayList(1, 2, 3);/…...

深入解析 Elasticsearch 集群配置文件参数

在自建 Elasticsearch 集群时&#xff0c;我们需要通过 elasticsearch.yml 文件对节点角色、网络设置、集群发现和数据存储路径等进行灵活配置。配置项的合理设置对集群的稳定性、性能与扩展性影响深远。本文将以一个示例配置文件为蓝本&#xff0c;逐条解析各参数的含义与建议…...

WebMvcConfigurer和WebMvcConfigurationSupport(MVC配置)

一:基本介绍 WebMvcConfigurer是接口&#xff0c;用于配置全局的SpringMVC的相关属性&#xff0c;采用JAVABean的方式来代替传统的XML配置文件&#xff0c;提供了跨域设置、静态资源处理器、类型转化器、自定义拦截器、页面跳转等能力。 WebMvcConfigurationSupport是webmvc的…...

用 javascript 来回答宇宙外面是什么

宇宙外面是什么呢? 估计这个问题要困扰很多人, 让我们用一段 javascript 代码来回答一下. 一, 从一段代码说起 var 地球 {名字 : "地球",女友 : "月亮",外面 : {名字 : "太阳系",老大 : "太阳",老二 : {名字 : "木星",二…...

我的性能优化经验

专业方向&#xff1a;App cpu/memory/gpu/流畅度/响应时间的优化&#xff0c;Anr&#xff0c;Framework CarPowerManagementService模块的&#xff08;STR&#xff09;&#xff0c;从0~1完成性能监控体系搭建&#xff0c;完成3大版本迭代高质量性能交付 响应时间&#xff1a; …...

XSLT 编辑 XML

XSLT 编辑 XML 介绍 XSLT&#xff08;可扩展样式表语言转换&#xff09;是一种用于转换XML文档的语言。它允许开发人员将XML数据转换为其他格式&#xff0c;如HTML、PDF或纯文本。XSLT通过使用XPath查询来定位XML文档中的元素&#xff0c;并对这些元素应用转换规则。在本教程…...

数智读书笔记系列010 生命3.0:人工智能时代 人类的进化与重生

书名&#xff1a;生命3.0 生命3.0&#xff1a;人工智能时代,人类的进化与重生 著者&#xff1a;&#xff3b;美&#xff3d;迈克斯•泰格马克 迈克斯・泰格马克 教育背景与职业 教育背景&#xff1a;迈克斯・泰格马克毕业于麻省理工学院&#xff0c;获物理学博士学位。职业经…...

Transfomer的各层矩阵

一、输入 输入一句话&#xff1a;Hello CYZLAB the inspired world 每个单词为一个token 二、Embedding 这里的词向量维度为6&#xff0c;矩阵的行数为token数&#xff0c;列数是词向量的维度 这列是注释不算hello122694CYZLAB222372the222596inspired132440world431273 …...

代码随想录第51天

99.岛屿数量 深搜 import java.util.*;class Main{static int[][] directions {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};static boolean[][] visited;public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int m sc.nextInt();int…...

基础库httpx的使用

urllib 库和 requests 库的使用&#xff0c;已经可以爬取绝大多数网站的数据&#xff0c;但对于某些网站依然无能为力。什么情况?这些网站强制使用HTTP/2.0协议访问&#xff0c;这时 urllib 和requests 是无法爬取数据的&#xff0c;因为它们只支持 HTTP/1.1&#xff0c;不支持…...

c++中如何保持结构体的线程安全?3D坐标的线程安全:从理论到最优解

使用mutex的困扰 struct Point3d {std::mutex mtx;double x, y, z;void set(double nx, double ny, double nz) {std::lock_guard<std::mutex> lock(mtx);x nx; y ny; z nz;} };这种方案虽然安全&#xff0c;但性能开销确实不小。每次访问都需要加锁解锁&#xff0c;…...

Zabbix6.0升级为6.4

为了体验一些新的功能&#xff0c;比如 Webhook 和问题抑制等&#xff0c;升级个小版本。 一、环境信息 1. 版本要求 一定要事先查看官方文档&#xff0c;确认组件要求的版本&#xff0c;否则版本过高或者过低都会出现问题。 2. 升级前后信息 环境升级前升级后操作系统CentOS…...

答题考试系统v1.6.1高级版源码分享+uniapp+搭建测试环境

一.系统介绍 一款基于FastAdminThinkPHPUniapp开发的小程序答题考试系统&#xff0c;支持多种试题类型、多种试题难度、练题、考试、补考模式&#xff0c;提供全部前后台无加密源代码&#xff0c;支持私有化部署 二.测试环境 系统环境&#xff1a;CentOS、 运行环境&#x…...

【Lua热更新】下篇 -- 更新中

上篇链接&#xff1a;【Lua热更新】上篇 文章目录 三、xLua热更新&#x1f4d6;1.概述&#x1f4da;︎2.导入xLua框架&#x1f516;3. C#调用Lua3.1Lua解析器3.2Lua文件夹的重定向3.3Lua解析器管理器3.4全局变量获取3.5全局函数获取3.6映射到List和Dictionary3.7映射到类3.8映…...

射频测试入门学习(三)——程控仪器是怎样和电脑连接通信的

目录 一、程控仪器需要哪些条件 二、可程控仪器 三、专业的仪器通信软件、驱动 四、编程语言 五、电脑控制仪器条件汇总 六、仪器指令查询 七、结语 一、程控仪器需要哪些条件 1、需要具备硬件条件(可程控的仪器、个人计算机(PC)) 2、专业的仪器通信软件、驱动 3、…...

并发控制之Semaphore

Semaphore 作用 信号量&#xff0c;用于控制同时访问特定资源的线程数量&#xff0c;通过协调各个线程&#xff0c;以确保对共享资源的访问不会导致冲突或数据不一致等问题&#xff0c;有点类似令牌桶&#xff0c;内部维护一组许可证&#xff0c; acquire获取许可证&#xf…...

第R3周:RNN-心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 &#x1f37a;要求&#xff1a; 1 本地读取并加载数据。 2 了解循环神经网络&#xff08;RNN&#xff09;的构建过程 3 测试集accuracy到达87% &#x1f37b;拔…...

【数值特性库】入口文件

数值特性库入口文件为lib.rs。该文件定义一系列数字特性的trait&#xff08;特征&#xff09;&#xff0c;这些特性可以被不同的数字类型实现&#xff0c;从而提供一套通用的数值操作方法。下面是对代码中关键部分的解释&#xff1a; 一、基础设置 #![doc(html_root_url “h…...