启智CV机器人是一套侧重机器人软件算法学习的机器人模块化套件。采用免螺丝的独特装配方式,缩短装配手工时间。在有限的实验课时里,可以快速搭建起机器人硬件本体,而将主要精力集中于ROS软件学习丶机器视觉算法的实验学习。
一、开发环境、组装
结构组成
系统版本
启智CV机器人同时支持基于基于Ubuntu 14.04的Indigo版本以及基于Ubuntu 16.04的Kinetic版本。
IDE
开发环境:RoboWare Studio。
二、代码编辑
1、从机载电脑的Ubuntu桌面左侧的启动栏里点击“RoboWare Studio”的图标,启动RoboWare Studio。
2、启智机器人的主控电脑出厂前会设置好工作区,所以当RoboWare Studio启动后,会在界面左上部分显示“CATKIN_WS”这个工作区。
鼠标右键点击CATKIN_WS工作区里的“src”目录,点击“新建ROS包”。
为这个新建的ROS包输入名字和依赖项:“omni_control_package roscpp std_msgs”,其中omni_control_package是新建的包的名字,后面的几项是这个包需要的依赖项。
在新建的omni_control_package包下面,自动生成了一个src目录(注意和CATKIN_WS的src目录区分开),用来装我们即将编写的节点源码文件。鼠标右键点击omni_control_package下的src目录(注意和CATKIN_WS的src目录区分开),选择“新建CPP源文件”。
输入文件名“omni_control_node.cpp”,按下回车键确认。
回车键按下时,会弹出以下列表:
加入到新的库文件中
加入到新的可执行文件
这里我们选择“加入到新的可执行文件”
omni_control_package下的src目录会生成一个名为omni_control_node.cpp的文件,同时RoboWare Studio右侧的工作区可以输入文本字符了,我们将在这个文本工作区里编写速度控制节点的源代码。
3、在RoboWare Studio右侧的工作区编写omni_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, "omni_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; 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, "omni_control");进行该节点的初始化操作,函数的第三个参数是节点名称。
(5) 接下来声明一个ros::NodeHandle对象n,并用n生成一个广播对象vel_pub,调用的参数里指明了vel_pub将会在主题“/cmd_vel”里广播geometry_msgs::Twist类型的消息。我们对机器人的控制,就是通过这个广播形式实现的。
(6) 在这个程序里,我们将会以一个固定的周期向底盘发送速度值,所以需要定义一个ros::Rate对象loop_rate,在构造参数里,我们给了0.5这个初始值,意思是每秒里发送0.5次速度值,也就是两秒钟发送一次速度值,这样留了足够的时间给我们观察机器人运动。
(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”上去。机器人的核心节点会从这个主题接收我们发过去的速度值,并转发到硬件机体去执行。我们为有限状态机设置了四个状态:
(10) 调用ros::spinOnce()函数给其他回调函数得以执行(本例程未使用回调函数)。这四种状态只执行一遍,执行完毕后机器人会自动停止。
(11) 调用loop_rate.sleep()来控制while循环的运行周期,在构建loop_rate时我们赋了初值0.5,意思是每秒循环0.5次,也就是每2秒while循环一次。
(12) 程序编写完后,代码并未马上保存到文件里,此时会看到界面右上编辑区的文件名“omni_control_node.cpp”右侧有个白色小圆点,标示此文件并未保存。
(13) 代码编写完毕后,按下键盘组合键“Ctrl + S”保存代码文件,界面右上编辑区的文件名标题“omni_control_node.cpp”右侧的白色小圆点变成了白色关闭按钮,说明代码文件变更内容已经保存进文件,然后可以开始编译了。
三、代码编译与执行
1、编译过程。
下面开始进行代码文件的编译操作,启动一个终端程序,键入如下命令进入ROS的工作空间:
cd catkin_ws/ |
然后再执行如下命令开始编译:
catkin_make |
稍等片刻,直到显示编译进度“[100%]”字样,表示编译成功。
2、修改机器人底盘控制模式
启智CV机器人采用模块化可重组的底盘结构,所以底盘类型会存在多种可能,每种类型的控制方式各有差别,所以在软件上,通过一个配置文件来进行底盘类型的配置。该文件在文件夹“~/catkin_ws/src/wpb_cv/wpb_cv_bringup/config”下,文件名为“settings.yaml”,可以在RoboWare Studio里编译。在这个配置文件的前面几行,可以看到“chassis_type”这个变量,其取值含义见第四节实验内容。在这里,我们使用的是“三轮全向模式”,所以需要给配置文件里的“chassis_type”赋值“omni”。然后按下键盘组合键“Ctrl + S”对配置文件的修改结果进行保存。
3、运动执行
(1)启动启智CV机器人的核心节点。
从Ubuntu桌面左侧的启动栏里点击“Terminal”终端图标,启动终端程序(也可以通过同时按下键盘组合键“Ctrl + Alt + T”来启动)。
输入以下指令:
roslaunch wpb_cv_bringup minimal.launch
按下回车键后,会显示节点初始化信息:
注意:启动机器人核心节点后,需要从初始化信息里确认底盘类型是否正确,比如这里的初始化信息最后显示“[设置]三轮全向底盘”。如果提示的底盘类型不正确,请检查上一步里settings.yaml的文件内容,同时确认修改完后确实保存成功。
(2)启动omni_control_node节点。
首先确认机器人底盘控制器的电源都已经打开。然后从Ubuntu桌面左侧的启动栏里点击“Terminal”终端图标,启动终端程序(也可以通过同时按下键盘组合键“Ctrl + Alt + T”来启动)。
输入以下指令:
rosrun omni_control_package omni_control_node
注意这里我们使用的是rosrun命令而不是之前的roslaunch。rosrun是启动单个ROS节点的指令。按下回车键后,机器人会按照终端信息提示先以0.1米/秒的速度前进2秒,然后再向右平移2秒,速度也是0.1米/秒,最后机器人停下来,执行结束。
四、运行结果
1、机器本体运行状态
2、笔记本获取数据反馈信息
3、拓展
尝试在代码里给vel_cmd进行不同的赋值,编译运行,查看机器人的移动状况。可以对三轮全向这种底盘类型有个大概的体验。
更多产品了解
欢迎扫码加入云巴巴企业数字化交流服务群
产品交流、问题咨询、专业测评
都在这里!
1月16日,2025腾讯产业合作伙伴大会在三亚召开。云巴巴,荣膺“2024腾讯云卓越合作伙伴奖—星云奖”和“2024腾讯云AI产品突出贡献奖”双项大奖
直播平台项目管理工具选型指南来了!腾讯TAPD自动化+数据化驱动项目落地
企业知识管理升级必看!腾讯乐享AI知识库的四大核心优势解析
制造业为何选择蓝巨人AGV?解析72小时柔性改造背后的三维技术革新
广告产研协同工具怎么选?TAPD 3个关键指标 打通敏捷协作全流程