启智CV机器人 | 麦克纳姆轮底盘运动学实验

来源: 云巴巴 2020-04-30 17:24:42

 

启智CV机器人是一套侧重机器人软件算法学习的机器人模块化套件。采用免螺丝的独特装配方式,缩短装配手工时间。在有限的实验课时里,可以快速搭建起机器人硬件本体,而将主要精力集中于ROS软件学习丶机器视觉算法的实验学习。

一、开发环境、组装

  • 结构组成

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

  • 系统版本

启智CV机器人同时支持基于基于Ubuntu 14.04的Indigo版本以及基于Ubuntu 16.04的Kinetic版本。

  • IDE

开发环境:RoboWare Studio。

  • 组装图

麦克纳姆轮底盘的轮子有两种,主轮上的小轮安装方向不一样。其中左前轮和右后轮的轮子类型一致,小轮的排布形状如下:

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

右前轮和左后轮的类型一致,小轮的排布形状如下:

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

四个麦克纳姆轮轮组的电机模块都有各自的ID,需要按照特定的顺序进行排布。

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

如图所示,以摄像头朝向为机器人的前方,电机模组的排布顺序是:

  • 左前侧安装的电机模块的ID为1;

  • 右前侧安装的电机模块的ID为2;

  • 右后侧安装的电机模块的ID为3;

  • 左后侧安装的电机模块的ID为4;

机器人组装完毕后,将四个电机模块使用线缆串联,并和主控制器的电机插头连接。

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

二、代码编辑

1、从机载电脑的Ubuntu桌面左侧的启动栏里点击“RoboWare Studio”的图标,启动RoboWare Studio。

2、启智机器人的主控电脑出厂前会设置好工作区,所以当RoboWare Studio启动后,会在界面左上部分显示“CATKIN_WS”这个工作区。

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

如果显示的是“无打开的工作区”,那么需要进行工作区创建,点击“创建工作区”按钮,创建新的工作区。

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

鼠标右键点击CATKIN_WS工作区里的“src”目录,点击“新建ROS包”。

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

为这个新建的ROS包输入名字和依赖项:“mecanum_control_package roscpp std_msgs”,其中mecanum_control_package是新建的包的名字,后面的几项是这个包需要的依赖项。

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

在新建的mecanum_control_package包下面,自动生成了一个src目录(注意和CATKIN_WS的src目录区分开),用来装我们即将编写的节点源码文件。鼠标右键点击mecanum_control_package下的src目录(注意和CATKIN_WS的src目录区分开),选择“新建CPP源文件”。

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

输入文件名“mecanum_control_node.cpp”,按下回车键确认。

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

回车键按下时,会弹出以下列表:

    ● 加入到新的库文件中

    ● 加入到新的可执行文件

这里我们选择“加入到新的可执行文件”

此时mecanum_control_package下的src目录会生成一个名为mecanum_control_node.cpp的文件,同时RoboWare Studio右侧的工作区可以输入文本字符了,我们将在这个文本工作区里编写速度控制节点的源代码。

3、在RoboWare Studio右侧的工作区编写mecanum_control_node.cpp的代码:

#include <ros/ros.h>

#include <geometry_msgs/Twist.h>

 

static int state = 0;

 

int main(int argc, char** argv)

{

    ros::init(argc, argv, " mecanum_control");

    ros::NodeHandle n;

    ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("/cmd_vel", 10);

    ros::Rate loop_rate(0.5);

    geometry_msgs::Twist vel_cmd;

 

    while(ros::ok())

    {

        switch(state)

        {

            case 0:

                vel_cmd.linear.x = 0;

                vel_cmd.linear.y = 0;

                vel_cmd.linear.z = 0;

                vel_cmd.angular.x = 0;

                vel_cmd.angular.y = 0;

                vel_cmd.angular.z = 0;

                vel_pub.publish(vel_cmd);

                printf("[启智CV] 停止\n");

                state ++;

                break;

            case 1:

                vel_cmd.linear.x = 0.1;

                vel_pub.publish(vel_cmd);

                printf("[启智CV] 前进\n");

                state ++;

                break;

            case 2:

                vel_cmd.linear.x = 0;

                vel_cmd.linear.y = -0.1;

                vel_pub.publish(vel_cmd);

                printf("[启智CV] 右平移\n");

                state ++;

                break;

            case 3:

                vel_cmd.linear.x = -0.1;

                vel_cmd.linear.y = 0;

                vel_pub.publish(vel_cmd);

                printf("[启智CV] 后退\n");

                state ++;

                break;

            case 4:

                vel_cmd.linear.x = 0;

                vel_cmd.linear.y = 0.1;

                vel_pub.publish(vel_cmd);

                printf("[启智CV] 左平移\n");

                state ++;

                break;

            case 5:

                vel_cmd.linear.x = 0;

                vel_cmd.linear.y = 0;

                vel_pub.publish(vel_cmd);

                printf("[启智CV] 结束\n");

                break;

        }

        ros::spinOnce();

        loop_rate.sleep();

    }

    return 0;

}

(1)  代码的开始部分,先include了两个头文件,一个是ros的系统头文件,另一个是运动速度消息类型geometry_msgs::Twist的定义文件。

(2)  然后定义一个状态变量state,这个变量将会作为后面控制机器人运动状态变化的信号量,初值赋为0。

(3)  ROS节点的主体函数是int main(int argc, char** argv),其参数定义和其他C++程序一样。

(4)  main函数里,首先调用ros::init(argc, argv, "mecanum_control");进行该节点的初始化操作,函数的第三个参数是节点名称。

(5)  接下来声明一个ros::NodeHandle对象n,并用n生成一个广播对象vel_pub,调用的参数里指明了vel_pub将会在主题“/cmd_vel”里广播geometry_msgs::Twist类型的消息。我们对机器人的控制,就是通过这个广播形式实现的。

(6)  在这个程序里,我们将会以一个固定的周期向底盘发送速度值,所以需要定义一个ros::Rate对象loop_rate,在构造参数里,我们给了0.5这个初始值,意思是每秒里发送0.5次速度值,也就是2秒钟发送一次速度值,这样留了足够的时间给我们观察机器人运动。

(7)  为了发送速度值,声明一个geometry_msgs::Twist类型的消息对象vel_cmd,并将速度值赋值到这个对象里。其中:

vel_cmd.linear.x是机器人前后平移运动速度,正值往前,负值往后,单位是“米/秒”;

vel_cmd.linear.y是机器人左右平移运动速度,正值往左,负值往右,单位是“米/秒”;

vel_cmd.angular.z(注意angular)是机器人自转速度,正值左转,负值右转,单位是“弧度/秒”;

其他值对启智机器人来说没有意义,所以都赋值为零。

(8)  为了连续不断的发送速度,使用一个while(ros::ok())循环,以ros::ok()返回值作为循环结束条件可以让循环在程序关闭时正常退出。

(9)  在while循环里,使用switch对state状态变量的不同取值进行分支程序构建,形成一个有限状态机。在不同的分支里,对vel_cmd进行不同赋值,并使用广播对象vel_pub将其发布到主题“/cmd_vel”上去。机器人的核心节点会从这个主题接收我们发过去的速度值,并转发到硬件机体去执行。我们为有限状态机设置了六个状态:

state状态值

对应的行为

0

机器人的初始状态为停止状态

1

机器人以0.1米/秒的速度向前移动

2

机器人以0.1米/秒的速度向右移动

3

机器人以0.1米/秒的速度向后移动

4

机器人以0.1米/秒的速度向左平移

5

机器人停下来不再移动

程序将这六个状态执行一遍之后,会停留在最后一个状态,结束执行。

(10)  调用ros::spinOnce()函数给其他回调函数得以执行(本例程未使用回调函数)。

(11)  调用loop_rate.sleep()来控制while循环的运行周期,在构建loop_rate时我们赋了初值0.2,意思是每秒循环0.2次,也就是每5秒while循环一次。

(12)  程序编写完后,代码并未马上保存到文件里,此时会看到界面右上编辑区的文件名“mecanum_control_node.cpp”右侧有个白色小圆点,标示此文件并未保存。

代码编写完毕后,按下键盘组合键“Ctrl + S”保存代码文件,界面右上编辑区的文件名标题“mecanum_control_node.cpp”右侧的白色小圆点变成了白色关闭按钮,说明代码文件变更内容已经保存进文件,然后可以开始编译了。

三、代码编译与执行

1、编译过程。

下面开始进行代码文件的编译操作,启动一个终端程序,键入如下命令进入ROS的工作空间:

cd catkin_ws/

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

然后再执行如下命令开始编译:

catkin_make

启智CV机器人 | 麦克纳姆轮底盘运动学实验

稍等片刻,直到显示编译进度“[100%]”字样,表示编译成功。

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

2、修改机器人的底盘控制模式。

启智CV机器人采用模块化可重组的底盘结构,所以底盘类型会存在多种可能,每种类型的控制方式各有差别,所以在软件上,通过一个配置文件来进行底盘类型的配置。该文件在文件夹“~/catkin_ws/src/wpb_cv/wpb_cv_bringup/config”下,文件名为“settings.yaml”,可以在RoboWare Studio里编译。在这个配置文件的前面几行,可以看到“chassis_type”这个变量,其取值含义见第四节实验内容。在这里,我们使用的是“麦克纳姆轮模式”,所以需要给配置文件里的“chassis_type”赋值“mecanum”。然后按下键盘组合键“Ctrl + S”对配置文件的修改结果进行保存。

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

3、运动执行

(1)启动启智机器人的核心节点。

从Ubuntu桌面左侧的启动栏里点击“Terminal”终端图标,启动终端程序(也可以通过同时按下键盘组合键“Ctrl + Alt + T”来启动)。输入以下指令:

输入以下指令:

roslaunch wpb_cv_bringup minimal.launch

按下回车键后,会显示节点初始化信息:

启智CV机器人 | 麦克纳姆轮底盘运动学实验

 

注意:启动机器人核心节点后,需要从初始化信息里确认底盘类型是否正确,比如这里的初始化信息最后显示“[设置]麦克纳姆轮底盘”。如果提示的底盘类型不正确,请检查上一步里settings.yaml的文件内容,同时确认修改完后确实保存成功。

(2)启动mecanum_control_node节点。

首先确认机器人底盘控制器的电源都已经打开。然后从Ubuntu桌面左侧的启动栏里点击“Terminal”终端图标,启动终端程序(也可以通过同时按下键盘组合键“Ctrl + Alt + T”来启动)。输入以下指令:

启智CV机器人 | 麦克纳姆轮底盘运动学实验

注意这里我们使用的是rosrun命令而不是之前的roslaunch。rosrun是启动单个ROS节点的指令。按下回车键后,机器人会按照终端信息提示先前进,然后右平移,再后退,最后左平移,形成一个正方形移动轨迹。完成上述动作后,机器人停止移动,执行结束。

四、运行结果

1、机器本体运行状态

2、笔记本获取数据反馈信息

3、拓展

尝试在代码里给vel_cmd.linear.x赋值一个负数,编译运行,查看机器人的移动状况。同样的方法,再对vel_cmd.lin

更多产品了解

欢迎扫码加入云巴巴企业数字化交流服务群

产品交流、问题咨询、专业测评

都在这里!

 

评论列表

为你推荐

生物识别的多模态识别趋势发展

生物识别的多模态识别趋势发展

现今,随着物联网、大数据、云计算、人工智能等技术的进展迅速,生物识别技术也得到了很大的发展,根据前瞻性行业研究,预计今年全球生物识别总市场将达到250亿$。 在国内市场方面,2010至2014年,国内生物特征识别市场的平均增速保持在60%以上。

2020-04-14 17:43:44

虚拟技术应用到医疗业的方向有哪些?

虚拟技术应用到医疗业的方向有哪些?

网络信息化时代,人们的常用通信工具和网络已已经越来越分不开,企业也和网络的关系越来越密切,企业虚拟技术就是互联网下的产物。你可能在之前并没有听过什么是企业虚拟技术,但是不要担心,企业虚拟技术并像你想象那么晦涩难懂,他正在逐步被用于许多行业,本文,就简单谈一

2022-11-21 10:39:22

什么是腾讯云人脸特效技术?功能有?

什么是腾讯云人脸特效技术?功能有?

在美颜相机里,小视频特效里,在电影大片里,我们都能够看到人脸特效技术的身影。但是今天小巴想要介绍的产品是腾讯云的人脸特效。 人脸特效技术 腾讯云人脸特效技术,是基于腾讯云的三种算法,能够满足人们的各种短视频制作,证件照,营销活动,自拍、趣味图片制作

2022-11-24 11:13:06

浅谈人工智能世界的两大基础是什么

浅谈人工智能世界的两大基础是什么

人类智能这个领域可以这样来理解“即被如此精确地描述,以至于可以制造一台机器来模拟它”的主张之上。这引发了关于创造具有类人智能的人工生命的思想本质和伦理道德的哲学争论,这些问题自古以来就被神话、小说和哲学所探索。 有些人还认为人工智能如果发展势头不减,将对

2022-11-22 16:08:20

用虚拟现实,以留存哪些珍贵记忆

用虚拟现实,以留存哪些珍贵记忆

小编很喜欢的电影《寻梦环游记》有着样一句经典台词,“ 死亡是不是真的走了,忘了是永恒的灭亡 ”,当我们在人间离开,比不是真正的灭亡,但被所有人遗忘,才是真正的灭亡。 虚拟现实技术可以帮我们,看到自己想念的人。先来了解一下虚拟现实技术的概念。虚拟现实技术又

2022-11-22 16:14:55

企业如何挑选 RPA 工具

企业如何挑选 RPA 工具

目前,在全球范围内,已经有越来越多的企业清楚认识到,机器人流程自动化(RPA)在降本增效和生产力提升方面的能力与价值。 RPA 在全球风头正旺的同时,其亚洲市场的火热程度,同样值得引起企业家们的注意。面对如此火热的局面,很多企业管理者都想让自己的企业拥抱

2022-11-21 15:04:57

严选云产品

差旅天下智慧差旅管控平台 差旅天下坚持以软件自主研发为核心驱动力,面向法人客户提供差旅管控方案设计、差旅服务及商旅管理、差旅金融服务。专注于中国式差管控和服务外包的专用软件《智慧差旅管控电商平台》PC客户端差旅系统及手机APP差旅系统研发。
腾讯云 拓客通SCRM 腾讯云拓客通SCRM,“推广获客—销售转化—私域运营” 每个环节互补提升,实现整体业绩倍增。营销管理有工具,销售提能有系统。运营复购有体系,销售管理有数据。
帆软FineDataLink一站式数据集成平台 帆软FineDataLink一站式数据集成平台,可视化整合多源异构数据,高效搭建企业级数据仓库,实时同步数据(跨地域跨业务),提升业务数据时效性。依托于API构建企业级数据资产,互通共享,云上数据快速下云备份,提升数据管理规范性。
薪人薪事招聘管理系统 薪人薪事企业招聘管理系统一站式解决企业招聘管理问题,专业且高翔的企业招聘管理软件帮助企业优化招聘流程的每一步,缩短招聘周期,降低招聘成本,提升候选人体验。
微伴助手企业微信营销管理系统 微伴助手企业微信营销管理系统,使⽤微伴的渠道活码,统计不同渠道的引流效果。在微伴中⾃定义客户信息字段,建⽴客户档案,在微伴中创建⾃定义客户标签,⽤于构建客户画像体系。微伴可进⾏关键词匹配,智能推荐对应的回复话术。
腾讯云视立方·移动直播SDK 腾讯云视立方·移动直播(Mobile Live Video Broadcasting,MLVB)SDK 是腾讯云视立方·音视频终端引擎针对移动直播场景专属打造的一体化产品,集成了腾讯云直播的推 / 拉流能力,为您提供高质量直播服务,快速满足手机直播的需求。

甄选10000+数字化产品 为您免费使用

申请试用