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, termios


class 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 = None
        pi = math.pi

        def move(forward, turn):
            cmd = Twist()
            cmd.linear.x = forward
            cmd.linear.y = 0
            cmd.linear.z = 0
            cmd.angular.z = 0
            cmd.angular.z = 0
            cmd.angular.z = turn
            self.cmd = cmd
            return self.cmd

        def 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 key

        while not rospy.is_shutdown():
            key = getKey()
            if (key == '\x03'):
                break
            else:
                str = "%s" % rospy.get_time()
                rospy.loginfo(str)

                pub0.publish(move(0, 0))  # stop
                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))  # left 90
                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))  # stop
                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))  # stop
                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(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.0
        twist.angular.x = 0.0;twist.angular.y = 0.0;twist.angular.z = 0.0
        pub0.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机器人上进行测试。

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

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

相关文章

2023年蓝桥杯模拟省赛——列名

目录 题目链接:2.列名 - 蓝桥云课 (lanqiao.cn) 思路 高级思路:进制转换 难点一 难点二 难点三 总结 题目链接:2.列名 - 蓝桥云课 (lanqiao.cn) 思路 先来看我的暴力的思路吧 主要有以下步骤: 初始化一个长度为3的数组res用…

WEB前端项目开发——(一)(2024)

目录 1 通过Git Bash安装 vue-cli 2 创建项目 3 解决Git Bash方向键失效 4 重新进行项目创建 5 浏览器输入地址查看 6 案例——简单修改v3-calendar中的内容 7 测试页面效果 本篇文章介绍通过了Git Bash创建v3-calendar项目,之后对v3-calendar进行简单…

ChatGPT国内镜像站大全

#今天在知乎看到一个问题:“平民不参与内测的话没有账号还有机会使用ChatGPT吗?” 从去年GPT大火到现在,关于GPT的消息铺天盖地,真要有心想要去用,途径很多,别的不说,国内GPT的镜像站到处都是&…

【GPT-SOVITS-04】SOVITS 模块-鉴别模型解析

说明:该系列文章从本人知乎账号迁入,主要原因是知乎图片附件过于模糊。 知乎专栏地址: 语音生成专栏 系列文章地址: 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

【C语言】linux内核软中断

一、什么是软中断? 内核中的软中断(Softirqs)和任务下半部(Tasklets)是Linux内核中用于在中断上下文之外处理中断服务的一种底层机制。这些机制解决了不能在中断服务例程(ISR)中执行耗时操作或…

ChatGPT :确定性AI源自于确定性数据

ChatGPT 幻觉 大模型实际应用落地过程中,会遇到幻觉(Hallucination)问题。对于语言模型而言,当生成的文本语法正确流畅,但不遵循原文(Faithfulness),或不符合事实(Factua…

Linux下进程的调度与切换

🌎进程的调度与切换 文章目录: 进程的调度与切换 进程切换 进程调度       活动状态进程队列       位图判断       过期队列 总结 前言: 在Linux操作系统中,进程的调度与切换是操作系统核心功能之一&#xff…

【LabVIEW FPGA入门】流水线

LabVIEW中流水线 在当今多核处理器和多线程应用程序的世界中,程序员在开发应用程序时需要不断思考如何最好地利用尖端 CPU 的强大功能。尽管用传统的基于文本的语言构建并行代码可能难以编程和可视化,但 NI LabVIEW 等图形开发环境越来越多地允许工程师和…

学习笔记 | 微信小程序项目day02

今日学习内容 安装uni-ui跟uni-helper/uni-ui-types配置pinia持久化请求工具类的拦截器请求工具类的请求函数 安装uni-ui跟uni-helper/uni-ui-types npm install -g cnpm --registryhttps://registry.npmmirror.com npm set registry https://registry.npmmirror.com npm i …

电脑充电器能充手机吗?如何给手机充电?

电脑充电器可以给手机充电吗? 电脑充电器可以给手机充电,但前提是电脑充电器的功率输出与手机的功率匹配且接口匹配。 假设电脑充电器的输出功率为5V/2A,手机也支持5V/2A的输入功率。 只要接口匹配,就可以使用电脑充电器给手机充…

2024智慧农场系统微信小程序前端如何上传以及配置

2024智慧农场系统微信小程序前端如何上传以及配置 首先下载微信开发者工具 下载好以后打开,然后导入项目 前端修改:siteinfo.js 里面的域名信息 改完之后开始在微信开发者工具中开发工具中编译、上传、发布即可

vim | 介绍vim以及配置vimrc文件

好像熟练使用vim 是玩linux 必修课 当然,初代玩家能在vim 完成编辑 并保存已是入门了,想当初在大学的时候,死活转不过来,玩不过来,甚至有些恐惧 但后来,弄清楚原理,反倒觉得简简单单已是完美了。…

19. UE5 RPG使用GameplayEffect的Attribute Based Modifiers

前几篇文章我也说了GE的基础使用,但是,对一些属性的应用没有述说,后续,我将一点一点的将它们如何使用书写下来。 这一篇,主要就讲解一下Attribute Based Modifiers使用,先说一下它的应用场景,一…

C++ -- 多态

多态 1. 多态的概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 2. 多态的定义及实现 2.1多态的构成条件 多态是在不同继承关系的类对象,去调用同一函…

实现界面跳转及注册界面编写(AndroidStudio)

目录 一、代码 二、最后效果 一、代码 1.先新建一个activity文件 2.注册界面的代码如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:la…

Docker学习之数据管理(超详解析)

Docker存储资源类型&#xff1a; 用户在使用 Docker 的过程中&#xff0c;势必需要查看容器内应用产生的数据&#xff0c;或者需要将容器内数据进行备份&#xff0c;甚至多个容器之间进行数据共享&#xff0c;这必然会涉及到容器的数据管理&#xff1a; &#xff08;1&#xff…

Java代码基础算法练习-判断素数-2024.03.17

任务描述&#xff1a; 输入一个数x&#xff0c;判断它是否是素数。 提示&#xff1a;素数是只能被1和它本身整除的数&#xff0c;1不是素数。 任务要求&#xff1a; 代码示例&#xff1a; package march0317_0331;import java.util.Scanner;public class March0317 {public …

LeetCode 面试经典150题 55.跳跃游戏

题目&#xff1a; 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 思路…

django实现api接口

&#xff08;前期准备&#xff09;第一步&#xff1a;虚拟环境 在windows上使用virtualenvwrapper。 pip install virtualenvwrapper-win 接着&#xff0c;添加环境变量。 echo %WORKON_HOME% 接下来就是创建虚拟环境&#xff0c;假如创建myenv mkvirtualenv myenv 进入…

RabbitMQ——死信队列和延迟队列

文章目录 RabbitMQ——死信队列和延迟队列1、死信队列2、基于插件的延迟队列2.1、安装延迟队列插件2.2、代码实例 RabbitMQ——死信队列和延迟队列 1、死信队列 死信队列&#xff08;Dead Letter Queue&#xff0c;DLQ&#xff09;是 RabbitMQ 中的一种重要特性&#xff0c;用…