A-A+

ROS与Matlab系列2:连接vrep仿真器

2016年07月07日 ROS 评论 1 条 阅读 3,936 次

上一篇我们学习了Matlab中一个简单的运动控制

接下来我们将matlab和simulink的控制程序通过ROS接入机器人实景仿真软件,主要是为了获取摄像机图像,实现视觉反馈。

关于vrep仿真软件设置可参考zhangrelay的系列博客:

  • 对比介绍:

机器人系统常用仿真软件介绍和效果

http://blog.csdn.net/ZhangRelay/article/details/42586491

  • Indigo版本安装步骤:

机器人操作系统ROS(indigo)与三维仿真软件V-Rep(3.2.1)通信接口使用笔记

http://blog.csdn.net/ZhangRelay/article/details/49401881

  • Kinetic版本安装问题修正:

ROS_Kinetic_17 使用V-Rep3.3.1(vrep_ros_bridge)

http://blog.csdn.net/zhangrelay/article/details/51684337

ROS_Kinetic_18 使用V-Rep3.3.1和Matlab2015b(vrep_ros_bridge)续

http://blog.csdn.net/zhangrelay/article/details/51691094

1

8

2

1.Vrep加载ros接口路径问题修正

vrep_ros_bridge安装成功后,运行./vrep.sh可自动加载,并通过向ROS主题/vrep/quadrotor_0/command发送指令控制飞机运动,但首先需要解决一个小问题:

(vrep加载链接库路径查找的问题)

进入文件夹V-REP_PRO_EDU_V3_3_1_Linux/compiledRosPlugins

把libv_repExtRosInterface.so拷贝至

V-REP_PRO_EDU_V3_3_1_Linux根目录下,问题解决!

通过Matlab发送指令:

quadrotor = rospublisher('/vrep/quadrotor_0/command','sensor_msgs/JointState');

msg = rosmessage(quadrotor);

msg.Effort = [1;1;1;1;];

send(quadrotor,msg);

就会看到飞机动了。

但是不是仍觉得飞机运动地怪怪的呢?这是因为vrep_ros_bridge使用的是6DOF动力学模型,每收到一次command指令,飞机运动一次。在vrep中,并没有给出四旋翼的动力学模型,飞机约受到约13N的重力(我试验出的结果,飞机悬停时拉力13N),转动惯量未知,所以非常不方便仿真,后面我们会在matlab里可以修改一下,现在主要介绍数据接口的问题。

2.向飞机发送控制指令

Matlab代码:

quadrotor = rospublisher('/vrep/quadrotor_0/command','sensor_msgs/JointState');

msg = rosmessage(quadrotor);

msg.Position = [0;0;0;0]; %未使用

msg.Velocity = [0;0;0;0]; %未使用

msg.Effort = [0;0;0;-10]; %前3项是x,y,z轴的力矩,后一项是螺旋桨拉力合力(为负)。

send(quadrotor,msg);

Simulink程序见ROS_vrep.slx

Simulink对于JointState等变长度的数据处理起来比较麻烦,可以参考以下帮组教程,但我尝试的结果并不好用。

无奈之下,只好自定义了一个topic,然后用m文件重新转发。(当然也可以在ROS里写一个脚本转换,但在这里尽量使用matlab)

新建一个scriber,当收到数据后,便调用topROSCallback.m转换数据(将topROSCallback.m添加到matlab可运行的路径里)。

chatsub = rossubscriber('/topCommand', @topROSCallback);

topROSCallback.m源码如下

function topROSCallback(~, message)

%   ROS subscriber callback function to pub data

%   from the message.

%  exbot.net

%  Author:Top Liu

%  2016.6.14

quadrotor = rospublisher('/vrep/quadrotor_0/command','sensor_msgs/JointState');

%geometry_msgs/Twist

% message.Linear.Z = 7

msg = rosmessage(quadrotor);

msg.Position = [0;0;0;0];

msg.Velocity = [0;0;0;0];

msg.Effort = [message.Angular.X;message.Angular.Y;message.Angular.Z;message.Linear.Z];%-13

send(quadrotor,msg);

% rostopic echo /vrep/quadrotor_0/command

end

设置Variable-length arrays 参考帮助:Working with ROS messages in Simulink

Variable-length arrays(ROS type ...[]) are converted to fixed-length array with customizable maximum lengths. By default, the fixed length is 128 for primitive types (e.g., uint8[],float32[]), and 16 for nested arrays of messages (e.g., geometry_msgs/Point[]).

Tools > Robot Operating System > Manage Array Sizes.

3

Editor->bus editor

找到SL_Bus_robotROS2_sensor_msgs_JointState

把position、velocity、effort的Dimension从128改为4

4

Receiving and applying commands from ROS.

3.读取并显示摄像机图像

订阅图像的Matlab代码:

imsub = rossubscriber('/vrep/Vision_sensor_0');

%After subscribing to an image topic, wait for the data and then display it with imshow.

img = receive(imsub);

imshow(readImage(img));

截屏如下:左为matlab收到的摄像机的图像,右为vrep仿真场景

5

识别目标点Matlab代码:

[centers, radii] = imfindcircles(img_ori, [10 100], 'ObjectPolarity','dark');

% hold on;

viscircles(centers, radii,'EdgeColor','r');

% hold on;

% plot(selectStrongest(boxPoints, 50));

centers(1)

识别结果如下图:

6

4.读取并显示飞行器状态数据

在quadrotor_state里是读取并显示IMU数据(imu),飞行器位置姿态(pose)、线速度和角速度(twist)的模块,在实验test场景时,观察数据发现,test里提供的四旋翼模型有以下几个问题:

  • twist提供的线速度和角速度似乎是地理系下的转动和速度(待确认)
  • twist提供的线速度:明明有加速度但始终没有速度,难道要自己set twist?
  • imu提供的角速度好像不是机体系下的转动(待确认)
  • vrep收到一次command运行一次step。
  • 7

5. 时间同步问题

设置vrep和simulink的时间同步这点非常重要!!!

大概设想了两个办法,供参考。

解决方法1

在simulink里的模型属性的solver里设置为fixed step,步长设置与vrep一致,建议50ms。一开始设置为10ms电脑运行及其慢啊!设到 100ms感觉精度又不够。 

解决方法2

使用simulink的自动变步长效率还是非常高的,但又无法保证两边的步长和时间匹配。一个解决办法就是,不使用vrep的飞行器动力学,一切动力学计算在simulink里进行(simulink建模也比vrep方便),直接用set pose设置飞机位置姿态。仿真器只负责生成摄像机图像反馈给simulink。

如果有更好的解决办法,请发送email至top1944@163.com,谢谢!

附件链接:链接(密码:s1gf)

作者:Top Liu

感谢poyoten和zhangrelay解决编译问题

转载请注明出处exbot.net

标签:

1 条留言  访客:1 条  博主:0 条

  1. 阿拉米

    您好,链接地址过期了,能否更新下呢?

给我留言

Copyright © ExBot易科机器人实验室 保留所有权利.   Theme   Robin modified by poyoten

用户登录

分享到: