ROS与Matlab系列:一个简单的运动控制
ROS与Matlab系列:一个简单的运动控制
Matlab拥有强大的数据处理、可视化绘图能力以及众多成熟的算法函数,非常适合算法开发;在控制系统设计中,Simulink也是普遍使用的设计和仿真工具。而ROS系统,则是一种新的标准化机器人系统软件框架。通过ROS,你可以使用大量的示例代码和开源程序轻松地完成机器人编程和控制任务。
如何利用matlat和ROS不同的优势,协同进行机器人设计与仿真?
如何用matlat程序通过ROS直接控制物理世界中的机器人?
我们进行了初步的尝试,并在这里把设计过程中遇到的一些问题及解决方案与大家分享!
1. 系统配置
VM虚拟机运行Ubuntu和ROS系统,称为主机,假设ip地址为192.168.1.101。
Windows主机运行matlab2015以上版本,称为从机,假设ip地址为192.168.1.100。
2. 虚拟机网络设置
首先检查虚拟的网络设置,设置为“桥接模式”并勾选下面的“复制主机连接状态”。
windows主机联网后,DHCP给自动为主机和虚拟机分配ip地址。如果没有网络的话,一个简单的做法是可以通过手机开一个热点(无需连接internet),主机连上热点后会自动分配好ip地址。
虚拟机下输入ifconfig命令,获取ip地址,比如192.168.1.101。
windows下输入ipconfig命令,获取ip地址,比如192.168.1.100。
3. 检查WINDOWS与Ubuntu网络是否联通
Matlab的Robotics System Toolbox与Ubuntu下的ROS通信并工作,首先必须保证WIN主机与UBUNTU主机的网络可达性。通常我们通过创建局域网,将两主机置于同一子网内。主机网络设置好后可通过PING工具检测网络可达性。
注意!windows需关闭防火墙
4. 设置ROS环境变量(此处是重点!)
Master以及两主机间的各node之间的正确通信必须设置相应的环境变量,以保证node能找到master进行注册等操作,以及node使用正确的地址发布TOPIC和宣告SERVICE。所以需要在没有运行master的主机设置ROS_MASTER_URI变量,并在两主机上设置ROS_IP环境变量。
注意这里应使用ROS_IP而非ROS_HOSTNAME,是因为WINDOWS常常不能将计算机名解析成IP地址以致连接失败。两台机器都是Linux主机用ROS_HOSTNAME是木有问题的。
ROS_MASTER_URI:若roscore在其他机器上运行,则需要将ROS_MASTER_URI设置为运行roscore主机的ip,node就能以此与master建立连接进行通信及数据交互。
ROS_IP:变量对所运行的主机上的node起作用,node的TOPIC与SERVICE都发布到此地址上。
操作:
在主机上,在~/.bashrc文件中添加:
export ROS_IP=192.168.1.101
保存退出,重开终端,运行master(ROS环境变量脚本已经source):
roscore
运行一个简单的turtle例程。
rosrun turtlesim turtlesim_node
在从机上,打开mablab,进行环境变量设置。在命令窗口输入:
setenv('ROS_MASTER_URI','http://192.168.1.101:11311')
setenv('ROS_IP','192.168.1.100')
初始化全局node:
rosinit()
5. 在matlab下操作ROS
文件:testROS.m
在matlab查阅下topic列表
rostopic list
会出现以下显示
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
在matlab下显示topic内容
rostopic echo /turtle1/pose
若果出现以下内容,恭喜你!数据已经读到matlab里了。
X : 5.544444561
Y : 5.544444561
Theta : 0
LinearVelocity : 0
AngularVelocity : 0
---
注意,以上显示会刷屏,按ctrl+c停止显示。
查看topic数据类型等信息:
rostopic info /turtle1/cmd_vel
显示:
Type: geometry_msgs/Twist
Publishers:
Subscribers:
* /turtlesim (http://192.168.1.101:37723/)
接下来我们尝试下在matlab里发送消息给小海龟。
首先设置消息类型为geometry_msgs/Twist
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
cmdpub = rospublisher( '/turtle1/cmd_vel' ,rostype.geometry_msgs_Twist) pause(3) % Wait to ensure publisher is setup cmdmsg = rosmessage(cmdpub); cmdmsg.Linear.X = 10; cmdmsg.Angular.Z = 15; send(cmdpub,cmdmsg) chatterpub = rospublisher( '/chatter' ,rostype.std_msgs_String) pause(3) % Wait to ensure publisher is setup chattermsg = rosmessage(chatterpub); chattermsg.Data = 'hello world' send(chatterpub,chattermsg) pause(5) |
看到小海龟动了没?
当然也可以发布其他topic
6. 在simulink下控制ROS小海龟
文件:testControlTurtle.slx
接下来我们设计一个小控制器,来控制小海龟平滑地运动到指定位置。
首先按照上一节的步奏,启动ROS节点,并检查连通性。
运行testControlTurtle.slx
并设置小海龟的期望位置x,y(可在线修改,范围1~15)
速度是一个简单的比例控制器控制运动速度Linear.X
航向控制通过计算小海龟与目标连线的角度(Line of sight)控制转动速度Angular.Z
Enjoy it!
文件下载链接:http://pan.baidu.com/s/1sl8C01n
ROS与Matlab系列:一个简单的运动控制的更多相关文章
- 利用matlab写一个简单的拉普拉斯变换提取图像边缘
可以证明,最简单的各向同性微分算子是拉普拉斯算子.一个二维图像函数 f(x,y) 的拉普拉斯算子定义为 其中,在 x 方向可近似为 同理,在 y 方向上可近似为 于是 我们得到满足以上三个 ...
- ROS学习笔记11-写一个简单的服务和客户端(C++版本)
本文主要来源于:http://wiki.ros.org/ROS/Tutorials/WritingServiceClient%28c%2B%2B%29 写一个服务节点.在创建消息和服务中,我们创建了一 ...
- ROS学习笔记10-写一个简单的订阅者和发布者(C++版本)
本文档来源于:http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29 写发布者节点如前所述,节点是连接到RO ...
- Python函数系列-一个简单的生成器的例子
def consumer(): while True: x = yield print('处理了数据:',x) def producer(): pass c = consumer() #构建一个生成器 ...
- k8s系列----一个简单的例子
本实验来自k8s权威指南 解决访问demo出错,关键是靠https://www.cnblogs.com/neutronman/p/8047547.html此链接下面的某个大神的评论 主要yaml文件 ...
- 用Qt写软件系列三:一个简单的系统工具(上)
导言 继上篇<用Qt写软件系列二:QIECookieViewer>之后,有一段时间没有更新博客了.这次要写的是一个简单的系统工具,需求来自一个内部项目.功能其实很简单,就是查看当前当前系统 ...
- 封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类
快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------- ...
- [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)
[0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...
- VS Extension+NVelocity系列(一)——构建一个简单的NVelocity解析环境
一.前言 本节我们将实际实现一个简单的NVelocity解析环境,以便为以后的实例做一些基本工作,虽然NVelocity如何使用已经属于老掉牙的话题,但我只能专门挑出来一章来做铺垫.人生就是这样无奈啊 ...
随机推荐
- 《Advanced Bash-scripting Guide》学习(六):从/etc/fstab中读行
本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 ABS书上的例子: 代码块和I/O重定向 #!/bin/bash #从/etc/ ...
- Mac的搜狗输入法和QQ输入法加入⌘⌥⌃⇧自定义短语
搜狗输入法(Mac):http://pinyin.sogou.com/mac/ 创建名为『搜狗输入法自定义短语.ini』的文本文件(建议用Sublime Text),内容如下,然后偏好设置的自定义短语 ...
- uva10910 背包
https://vjudge.net/problem/UVA-10910 给出N,T,P,表示N门考试考了T分,问有多少种不同的得分方案,已知每门课的得分不低于P. 令f[i][j]表示考了i门得了j ...
- Webstorm2016使用技巧——SVN插件使用(svnToolBox)
1. 安装SVN 我这里使用的是TortoiseSVN-1.9.4.27285-x64-svn-1.9.4,安装过程需要注意的是,默认安装没有选择”command line client tools” ...
- redis_学习_02_redis 可视化工具 Redis Desktop Manager
二.参考资料 1.Redis可视化工具Redis Desktop Manager使用 2.超好用的Redis管理及监控工具,使用后可大大提高你的工作效率!
- LeetCode OJ:Binary Tree Paths(二叉树路径)
Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...
- 20165210 Java第九周学习总结
20165210 Java第九周学习总结 教材学习内容 - 第十三章学习总结 URL类: URL的构造方法: try { URL url = new URL("http://www.goog ...
- LeetCode Distribute Candies
原题链接在这里:https://leetcode.com/problems/distribute-candies/#/description 题目: Given an integer array wi ...
- 51nod 1685 第K大区间2
定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值[1]:3[2]:1[ ...
- Python 算法之冒泡排序
冒泡排序 冒泡排序算法的原理如下:(从后往前) 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是 ...