首页 > 其他分享 >Epuck2 在 ROS 下的运动控制

Epuck2 在 ROS 下的运动控制

时间:2024-03-17 18:31:39浏览次数:14  
标签:move publish pub3 pub2 pub0 rospy 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机器人上进行测试。

标签:move,publish,pub3,pub2,pub0,rospy,Epuck2,ROS,运动
From: https://blog.csdn.net/qq_45252077/article/details/136786318

相关文章

  • ROS2 自学之接口
    一、什么是接口std_msgs/msg/Stringstd_msgs/msg/UInt32在学习话题的时候,我们就已经接触到了如上两个接口,这两个接口分别是对应了字符串类型和u_int32的接口,所谓接口就是ROS2中提前定义好的一种规范。类似于充电器接口,尽管不同厂家制造的充电器不同,但他们都统一执行一种规......
  • ros2学习之报错分析:
    CMakeGeneratestepfailed. Buildfilescannotberegeneratedcorrectly.gmake:***[Makefile:267:cmake_check_build_system]错误1---Failed  <<<village_wang[0.43s,exitedwithcode2]Summary:0packagesfinished[0.56s] 1packagefailed:v......
  • robot_sim_demo: Cannot locate rosdep definition for [yocs_cmd_vel_mux]
    提纲1、问题描述2、解决方法3、原因分析1、问题描述下载了ROS-Academy-for-Beginners后,开始用rosdep安装依赖,但是发现执行官方文档提供的依赖安装命令:rosdepinstall--from-pathssrc--ignore-src--rosdistro=kinetic-y,后出现了错误,如下所示:zzl@zzl-virtual-machine:~......
  • unity--控制小球运动与销毁
    和上一章一样,先建立一个模型在test里继续写代码驱动。在上一章已经描述过如何让小球前后左右移动了。这次我换了一个更完美点的模型,和上章大差不差。再往里放入一个cube,将其rename成Enemy。在他跟处找到AddTag添加一个Enmey,并选择这个tag。player有Rigidbody,给物体一个作......
  • ROS——集成开发环境搭建
    1.4ROS集成开发环境搭建和大多数开发环境一样,理论上,在ROS中,只需要记事本就可以编写基本的ROS程序,但是工欲善其事必先利其器,为了提高开发效率,可以先安装集成开发工具和使用方便的工具:终端、IDE....1.4.1安装终端在ROS中,需要频繁的使用到终端,且可能需要同时开启多个......
  • 二维逆运动学 – 代码
    介绍在本系列的前一部分中,我们讨论了具有两个自由度的机械臂的反向运动学问题;如下图所示。在这种情况下,机械臂的长度和 通常是已知的。如果我们必须到达的点是 ,那么配置就变成了一个三角形,其中所有边都是已知的。然后,我们推导出了角度和的方程,它控制着机械臂关节的旋转:(1......
  • 二维逆运动学 – 数学
    如果您已经关注此博客一段时间,您可能已经注意到一些反复出现的主题。逆向运动学绝对是其中之一,我已经专门写了一整套关于如何将其应用于机械臂和触手的系列文章。如果您还没有读过它们,请不要担心:这个新系列将是独立的,因为它从一个新的角度回顾了逆运动学的问题。您可以在此处阅......
  • ros2中Qos的C++配置方法
    1.dds_debug.hpp#ifndefDDS_DEBUG__DDS_DEBUG_HPP_#defineDDS_DEBUG__DDS_DEBUG_HPP_#include<rclcpp/rclcpp.hpp>#include<rclcpp/qos.hpp>#include<rmw/types.h>#include<sensor_msgs/msg/imu.hpp>constrmw_qos_profile_tmy_cus......
  • ROS——其他ROS版本安装
    1.2.6资料:其他ROS版本安装我们的教程采用的是ROS的最新版本noetic,不过noetic较之于之前的ROS版本变动较大且部分功能包还未更新,因此如果有需要(比如到后期实践阶段,由于部分重要的功能包还未更新,需要ROS降级),也会安装之前版本的ROS,在此,建议选用的版本是melodic或kinetic。接......
  • 一运动身上就痒,到底是什么原因?
    转载自公众号懒兔子:今年夏天我开少儿中医夏令营的时候,有位妈妈过来问我,她说她一运动,脸上、脖子上、手臂上就会出很多风疹块,红色,很痒。但是等休息一会儿,身体的温度慢慢降下去之后,风疹块也会随之消失,像从来没有来过一样。而且她的风疹块全部出现在肝胆经循行的位置,她问我是不是和......