Epuck2 在 ROS 下的运动控制

文章目录

  • 前言
  • 一、初始配置
  • 二、运动控制
  • 三、移动机器人
  • 总结


前言

在对Epuck2机器人进行完固件更新及IP地址查询后,接下来通过ROS来对Epuck2机器人进行运动控制。


一、初始配置

(1)创建一个 catkin 工作空间

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws/
catkin_make
source ./devel/setup.bash

(2)移至~/catkin_ws/src 并克隆 ROS e-puck2 驱动程序仓库:

cd ~/catkin_ws/src
git clone -b e-puck2_wifi https://github.com/gctronic/epuck_driver_cpp

(3)安装依赖

sudo apt-get install ros-kinetic-gmapping
sudo apt-get install ros-kinetic-rviz-imu-plugin

(4)打开终端,进入 catkin 工作区目录(~/catkin_ws)并发出命令

catkin_make

Epuck2档位置于位置 15 进行 WiFi 通信

二、运动控制

(1)通讯:启动 epuck2 前,将 epuck2 机器人和计算机连接到同一个WiFi 网络
(2)启动

roscore

打开终端并发出以下命令:

roslaunch epuck_driver_cpp epuck2_controller.launch epuck2_address:='172.20.10.8'

'172.20.10.8’是 epuck2 IP 地址,需要根据您的机器人进行相应更改。
如果一切顺利,机器人将准备好交换数据,rviz 将打开,显示从 e-puck2 驱动
程序节点发布的主题中收集的信息。

在这里插入图片描述
在这里插入图片描述

三、移动机器人

(1)单机器人
第一种方式是使用 rviz 界面:
在界面的左下方有一个 Teleop 面板,其中包含一个交互式方块,旨在与差动驱动机器人一起使用。通过单击此方块,您将移动机器人,例如通过单击右上角部分,然后机器人将向右移动

第二种方式是使用 ros-melodic-turtlebot-teleop ROS 包。

第三种方式是直接发布/mobile_base/cmd_vel 主题,比如下命令

rostopic pub -1 /mobile_base/cmd_vel geometry_msgs/Twist -- '[0.0, 0.0, 0.0]' '[0.0, 0.0, 4.0]'

(2)多机器人

代码如下:具体移动可见分享视频

import roslib;roslib.load_manifest('turbot3')
import rospy
from geometry_msgs.msg import Twist
from std_msgs.msg import String
import sys, select, os
import math
if os.name == 'nt':import msvcrt
else:import tty, termiosclass Teleop:def __init__(self):pub0 = rospy.Publisher('/epuck_robot_0/mobile_base/cmd_vel', Twist,queue_size=10)pub1 = rospy.Publisher('/epuck_robot_1/mobile_base/cmd_vel', Twist,queue_size=10)#pub2 = rospy.Publisher('epuck_robot_2/mobile_base/cmd_vel', Twist)#pub3 = rospy.Publisher('epuck_robot_3/mobile_base/cmd_vel', Twist)#pub4 = rospy.Publisher('epuck_robot_4/mobile_base/cmd_vel', Twist)rospy.init_node('turbot3')rate = rospy.Rate(rospy.get_param('~hz', 1))self.cmd = Nonepi = math.pidef move(forward, turn):cmd = Twist()cmd.linear.x = forwardcmd.linear.y = 0cmd.linear.z = 0cmd.angular.z = 0cmd.angular.z = 0cmd.angular.z = turnself.cmd = cmdreturn self.cmddef getKey():if os.name == 'nt':return msvcrt.getch()tty.setraw(sys.stdin.fileno())rlist, _, _ = select.select([sys.stdin], [], [], 0.1)if rlist:key = sys.stdin.read(1)else:key = ''termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)return keywhile not rospy.is_shutdown():key = getKey()if (key == '\x03'):breakelse:str = "%s" % rospy.get_time()rospy.loginfo(str)pub0.publish(move(0, 0))  # stoppub1.publish(move(0, 0))#pub2.publish(move(0, 0))#pub3.publish(move(0, 0))#pub4.publish(move(0, 0))rospy.sleep(3)pub0.publish(move(0, pi / 6))  # left 90pub1.publish(move(0, pi / 6))#pub2.publish(move(0, pi / 6))#pub3.publish(move(0, pi / 6))#pub4.publish(move(0, pi / 6))rospy.sleep(3)pub0.publish(move(0, 0))  # stoppub1.publish(move(0, 0))#pub2.publish(move(0, 0))#pub3.publish(move(0, 0))#pub4.publish(move(0, 0))rospy.sleep(3)pub0.publish(move(0.6, 0))pub1.publish(move(0.6, 0))#pub2.publish(move(0.05, 0))#pub3.publish(move(0.05, 0))#pub4.publish(move(0.05, 0))rospy.sleep(3)pub0.publish(move(0, 0))  # stoppub1.publish(move(0, 0))#pub2.publish(move(0, 0))#pub3.publish(move(0, 0))#pub4.publish(move(0, 0))rospy.sleep(3)pub0.publish(move(0, -pi / 6))pub1.publish(move(0, -pi / 6))#pub2.publish(move(0, -pi / 6))#pub3.publish(move(0, -pi / 6))#pub4.publish(move(0, -pi / 6))rospy.sleep(6)pub0.publish(move(0, 0))pub1.publish(move(0, 0))#pub2.publish(move(0, 0))#pub3.publish(move(0, 0))#pub4.publish(move(0, 0))rospy.sleep(3)pub0.publish(move(0.6, 0))pub1.publish(move(0.6, 0))#pub2.publish(move(0.05, 0))#pub3.publish(move(0.05, 0))#pub4.publish(move(0.05, 0))rospy.sleep(3)pub0.publish(move(0, 0))pub1.publish(move(0, 0))#pub2.publish(move(0, 0))#pub3.publish(move(0, 0))#pub4.publish(move(0, 0))rospy.sleep(3)pub0.publish(move(0, pi / 6))pub1.publish(move(0, pi / 6))#pub2.publish(move(0, pi / 6))#pub3.publish(move(0, pi / 6))#pub4.publish(move(0, pi / 6))rospy.sleep(3)pub0.publish(move(0, 0))pub1.publish(move(0, 0))#pub2.publish(move(0, 0))#pub3.publish(move(0, 0))#pub4.publish(move(0, 0))rospy.sleep(3)pub0.publish(move(-0.6, 0))pub1.publish(move(0.6, 0))#pub2.publish(move(-0.05, 0))#pub3.publish(move(0.05, 0))#pub4.publish(move(-0.05, 0))rospy.sleep(3)pub0.publish(move(0, 0))pub1.publish(move(0, 0))#pub2.publish(move(0, 0))#pub3.publish(move(0, 0))#pub4.publish(move(0, 0))rospy.sleep(3)pub0.publish(move(0.6, 0))pub1.publish(move(-0.6, 0))#pub2.publish(move(0.05, 0))#pub3.publish(move(-0.05, 0))#pub4.publish(move(0.05, 0))rospy.sleep(6)pub0.publish(move(0, 0))pub1.publish(move(0, 0))#pub2.publish(move(0, 0))#pub3.publish(move(0, 0))#pub4.publish(move(0, 0))rospy.sleep(3)pub0.publish(move(-0.6, 0))pub1.publish(move(0.6, 0))#pub2.publish(move(-0.05, 0))#pub3.publish(move(0.05, 0))#pub4.publish(move(-0.05, 0))rospy.sleep(3)twist = Twist()twist.linear.x = 0.0;twist.linear.y = 0.0;twist.linear.z = 0.0twist.angular.x = 0.0;twist.angular.y = 0.0;twist.angular.z = 0.0pub0.publish(twist)pub1.publish(twist)#pub2.publish(twist)#pub3.publish(twist)#pub4.publish(twist)if __name__ == '__main__':if os.name != 'nt':settings = termios.tcgetattr(sys.stdin)Teleop()

总结

以上就是Epuck2 在 ROS 下的运动控制,本文仅仅简单介绍了Epuck2的简单控制,后面想办法将编队算法应用在Epuck2机器人上进行测试。

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

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

相关文章

cmd常用指令

cmd全称Command Prompt,中文译为命令提示符。 命令提示符是在操作系统中,提示进行命令输入的一种工作提示符。 在不同的操作系统环境下,命令提示符各不相同。 在windows环境下,命令行程序为cmd.exe,是一个32位的命令…

通俗易懂的Python循环讲解

循环用于重复执行一些程序块。从上一讲的选择结构,我们已经看到了如何用缩进来表示程序块的隶属关系。循环也会用到类似的写法。 for循环 for循环需要预先设定好循环的次数(n),然后执行隶属于for的语句n次。 基本构造是 for 元素 in 序列: statemen…

ClickHouse中的设置的分类

ClickHouse中的各种设置 ClickHouse中的设置有几百个,下面对这些设置做了一个简单的分类。

C语言疑难题:杨辉三角形、辗转相除求最大公约数、求π的近似值、兔子问题、打印菱形

杨辉三角形&#xff1a;打印杨辉三角形的前10行 /* 杨辉三角形&#xff1a;打印杨辉三角形的前10行 */ #include<stdio.h> int main(){ int i,j; int a[10][10]; printf("\n"); for(i0;i<10;i){ a[i][0]1; a[i][i]1; …

提升Java IO性能!探究BufferedOutputStream的奥秘

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java IO相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

【系统架构师】-第4章-信息安全技术

1、基础知识 五要素&#xff1a; (1)机密性&#xff1a;确保信息不暴露给未授权的实体或进程。 (2)完整性&#xff1a;只有得到允许的人才能修改数据&#xff0c;并且能够判别出数据是否已被篡改。 (3)可用性&#xff1a;得到授权的实体在需要时可访问数据&#xff0c;即攻击…

力扣刷题Days20-151. 反转字符串中的单词(js)

目录 1,题目 2&#xff0c;代码 1&#xff0c;利用js函数 2&#xff0c;双指针 3&#xff0c;双指针加队列 3&#xff0c;学习与总结 1&#xff0c;正则表达式 / \s /&#xff1a; 2&#xff0c;结合使用 split 和正则表达式&#xff1a; 1,题目 给你一个字符串 s &am…

ChatGPT提示词方法的原理

关于提示词&#xff0c;我之前的一些文章可以参考&#xff1a; 【AIGC】AI作图最全提示词prompt集合&#xff08;收藏级&#xff09;https://giszz.blog.csdn.net/article/details/134815245?ydrefereraHR0cHM6Ly9tcC5jc2RuLm5ldC9tcF9ibG9nL21hbmFnZS9hcnRpY2xlP3NwbT0xMDExL…

RunnerGo测试平台的安装和使用

文章适用于想RunnerGo入门的同学&#xff0c;本人主要是后端&#xff0c;这里做一个入门的学习记录。想深入适用RunnerGo的同学可以参考官网文档&#xff1a; https://wiki.runnergo.cn/docs/ 这里我测试的代码是之前搭建的一个前后端分离小demo&#xff0c;代码地址是https:/…

Rocket MQ 从入门到实践

为什么要使用消息队列&#xff0c;解决什么问题&#xff1f;&#xff08;消峰、解藕、异步&#xff09; 消峰填谷 客户端》 网关 〉 消息队列》秒杀服务 异步解耦 消息队列中的重要概念理解。&#xff08;主题、消费组、队列&#xff0c;游标&#xff1f;&#xff09; 主题&…

Vulnhub - Toppo

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog Toppo 靶机下载地址&#xff1a;Toppo: 1 ~ VulnHub 搭建&#xff1a;创建任意虚拟机&#xff0c;然后…

【网络编程基础(一)】网络基础和SOCKET

这里写目录标题 1、网络三要素2、IPV4和IPV6区别3、网络交互3.1、交互模型图3.2、基础通信协议3.3、OSI参考模型与TCP/IP参考模型对应关系 4、SOCKET网络套接字4.1、SOCKET分类4.2、基于流式套接字的编程流程4.3、网络通信雏形4.4、socket函数4.4.1、socket函数示例 4.5、bind函…

idea 的基本配置

一、安装目录介绍 其中&#xff1a;bin 目录下&#xff1a; 二、配置信息目录结构 这是 IDEA 的各种配置的保存目录。这个设置目录有一个特性&#xff0c;就是你删除掉整个目录之后&#xff0c;重新启动 IntelliJ IDEA 会再自动帮你生成一个全新的默认配置&#xff0c;所以很多…

串的模式匹配(简单匹配、KMP以及手工算next/nextval)

简单模式匹配 思路&#xff1a;主串和字串进行匹配&#xff0c;设置i、j、k&#xff08;主串、子串和匹配起始下标&#xff09;主串和子串一开始都是从第一个位置&#xff08;k i&#xff09;&#xff0c;若当前主串和子串匹配成功那么i、j&#xff0c;若匹配不成功k、j 1&am…

24计算机考研调剂 | 宁波大学

北京信息科技大学接收调剂研究生 2024中国科学院宁波材料所与高校联合培养硕士研究生项目介绍 考研调剂招生信息 中国科学院宁波材料技术与工程研究所&#xff08;简称“宁波材料所”&#xff09;成立于2004年4月&#xff0c;是由中国科学院、浙江省人民政府、宁波市人民政府三…

算法第二十九天-森林中的兔子

森林中的兔子 题目要求 解题思路 重点&#xff1a;某个兔子回答x的时候&#xff0c;那么数组中最多循序x1个同花色的兔子同时回答x 我们可以通过举例子得出一下的规律&#xff1a; 我们统计数组中所有回答x的兔子的数量n&#xff1a; 若n%(x1)0&#xff0c;说明我们此时只需…

每日一题——LeetCode1694.重新格式化电话号码

方法一 模拟&#xff1a; 首先去除number里面的破折号和空格&#xff0c;取出纯数字组成的字符串str。 对于str每三个数分成一组&#xff0c;加一个破折号&#xff0c;当str的长度小于等于4时再分情况讨论&#xff0c;如果等于4就分为22形式&#xff0c;如果小于4&#xff0c…

哥斯拉流量webshell分析-->ASP/PHP

哥斯拉流量webshell分析 哥斯拉是继菜刀、蚁剑、冰蝎之后的又一个webshell利器&#xff0c;这里就不过多介绍了。 哥斯拉GitHub地址&#xff1a;https://github.com/BeichenDream/Godzilla 很多一线师傅不太了解其中的加解密手法&#xff0c;无法进行解密&#xff0c;这篇文章…

zabbix配置

1 下载zabbix 1 配置yum源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release- 5.0-1.el7.noarch.rpm yum clean all yum makecache fast 完成后会出现zabbix.repo文件 2安装zabbix服务 yum -y install zabbix-server-mysql zabbix-web-mysql z…

OpenHarmony—自适应布局

针对常见的开发场景&#xff0c;方舟开发框架提炼了七种自适应布局能力&#xff0c;这些布局可以独立使用&#xff0c;也可多种布局叠加使用。 下面我们依次介绍这几种自适应布局能力。 拉伸能力 拉伸能力是指容器组件尺寸发生变化时&#xff0c;增加或减小的空间全部分配给容…