当前位置:网站首页>创新项目实战之智能跟随机器人原理与代码实现
创新项目实战之智能跟随机器人原理与代码实现
2022-08-02 00:36:00 【Mr.Winter`】
0 专栏介绍
本专栏旨在通过对ROS的系统学习,掌握ROS底层基本分布式原理,并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。
详情:《ROS从入门到精通》
1 智能跟随机器人的应用
机器人是传感器网络、通信、人工智能、分布式计算、自动化等多种技术的集大成者,机器人技术的发展水平标志着一个国家工业、制造业的先进性和创新性。

机器人产业市场潜力巨大,在工业机器人高端产业应用的背景下,服务机器人成为新的一片蓝海。
在众多机器人中,移动机器人的发展最为迅速,已经大规模落地商业化。智能跟随机器人是其中很常见的应用,在各类竞赛、创新项目、开源项目甚至商业项目中都有应用。例如以下场景:
- 高尔夫球场
- 病人看护
- 物流基地
- 商业导购
- 军事运输
- 2022 TI杯赛题
- …
本文基于ROS从入门到精通(十) TF坐标变换原理,为什么需要TF变换?中TF变换的原理,构造一个智能跟随机器人Demo,便于提供二次开发。总体的运行流程很简单:初始化两个机器人->获取机器人1相对全局坐标系的坐标->设置该坐标为机器人2的目标点,其中第二步就用到了TF变换。虽然原理简单,但是可扩展性强。例如:
- 机器人1可以换成行人,在机器人2上应用激光的方法探测坐标
- 机器人1可以换成跟踪物体,在机器人2上应用视觉和图像处理的方法探测坐标
- 应用本文涉及的TF变换,设计多机器人作业环境
- …
为了便于扩展,本文采用规范工程化的编程方式。
2 构造机器人对象
由于实际场景中机器人的异构性,我们不能只设置若干函数来驱动机器人。对应地,我们采用面向对象思想,从通用机器人Robot接口类中派生出各种不同的机器人类,比如本文设计的Turtle机器人类如下:
class Turtle: public general_robot::Robot
{
public:
/** * @brief 机器人对象默认构造函数 **/
Turtle();
/** * @brief 机器人构造函数 * @param[in]: name -> 机器人名字 * @retval: None **/
Turtle(std::string name);
/** * @brief 机器人对象默认析构函数 **/
~Turtle();
/** * @brief 初始化函数 * @param[in]: name -> 机器人名字 * @retval: None **/
void initialize(std::string name);
/** * @brief 驱动机器人运动 * @param[in]: cmd -> 运动控制消息 * @retval: None **/
void driveRobot(geometry_msgs::Twist cmd);
/** * @brief 设置机器人起始位姿 * @param[in]: pose -> 起始位姿 * @retval: None **/
void setStart(general_robot::Pose pose);
/** * @brief 设置机器人起始位姿 * @param[in]: pose -> 起始位姿 * @retval: None **/
void setGoal(general_robot::Pose pose);
}
这样设计的好处是在应用层接口可以统一起来,比如路径规划,我们只需要传入任意派生的机器人对象就可以实现多态,对不同结构、参数的机器人实现统一的规划算法。
3 机器人初始化
主要是位姿初始化,这里对于本地项目采用很简单的方式实现。对于CS架构,用户可以提交配置列表到后端服务器,服务器解析出位姿数据,再进行形如下面的初始化。为了避免业务逻辑混淆核心概念,本文就以下面的函数为例。
std::vector<turtle_robot::Turtle> robotInitialization()
{
std::vector<turtle_robot::Turtle> robots;
turtle_robot::Turtle robot1("robot1");
general_robot::Pose start;
start.x = -2.0;
start.y = -0.5;
start.theta = PI / 2;
robot1.setStart(start);
robots.push_back(robot1);
turtle_robot::Turtle robot2("robot2");
start.x = 2.0;
start.y = 0.5;
start.theta = PI / 2;
robot2.setStart(start);
robots.push_back(robot2);
return robots;
}
4 实现跟随
首先打开一个ros循环,实现持久性的跟随任务。
while (ros::ok())
{
// 接下来介绍的逻辑在这里
}
接着,获得机器人1相对地图的位姿
geometry_msgs::TransformStamped tfs = buffer.lookupTransform("map","robot1/base_footprint",ros::Time(0));
ROS_INFO("[x:%.2f, y:%.2f]", tfs.transform.translation.x, tfs.transform.translation.y);
将这个全局位姿作为机器人2的目标点
goal.x = tfs.transform.translation.x;
goal.y = tfs.transform.translation.y;
goal.theta = PI / 2;
robots[1].setGoal(goal);
继续循环
loop_rate.sleep();
ros::spinOnce();
5 效果展示
三维仿真场景如下所示:


完整代码联系下方博主名片获取
文末抽奖送书
本期图书推荐:《Python机器学习:数据建模与分析》

【书籍简介】
- 系统介绍Python用于机器学习的数据分析、机器学习、数据可视化相关库。结合大量实例透彻讲解各类机器学习算法在数据建模、数据分析中的应用。全彩呈现数据建模可视化图像,提供配套数据集、源代码、PPT等学习资源
【抽奖方式】
- 关注博主,点赞收藏文章,并做出有效评论
- 根据评论记录随机抽取3位用户赠送实体图书
- 截止日期:8.7日晚8点,届时通过blink公布获奖信息,请中奖用户及时私信
更多精彩专栏:
边栏推荐
猜你喜欢
随机推荐
Constructor, this keyword, method overloading, local variables and member variables
GateWay实现负载均衡
How to use the go language standard library fmt package
Maxwell 一款简单易上手的实时抓取Mysql数据的软件
input禁止输入
Debian侵犯Rust商标,妥协改名还是会得到豁免?
关于MySQL的数据插入(高级用法)
H5页面打开微信小程序
ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your
MLX90640 红外热成像仪测温模块开发笔记(完整版)
FlinkSQL CDC实现同步oracle数据到mysql
flv.js解析与使用
滴滴秋招提前批正式开始,现在投递免笔试
dbeaver连接MySQL数据库及错误Connection refusedconnect处理
管理基础知识16
内部类、异常简单介绍(第十天)
严格模式,use strict
接口(第九天)
fastjson详解
如何期货开户和选择期货公司?










