-
2021-02-03 11:53:27
如何获得gazebo仿真中的机器人位姿真值(这里主要讨论轮式移动机器人),这是一个很简单的问题。主要有三种方法。
- 订阅gazebo话题 / 请求gazebo服务
在官网教程Tutorial: ROS Communication中,介绍了gazebo向ros发布的rostopic,例如:
Topics:
/clock : rosgraph_msgs/Clock - Publish simulation time, to be used with /use_sim_time parameter.
~/link_states : gazebo_msgs/LinkStates - Publishes states of all the links in simulation.
~/model_states : gazebo_msgs/ModelStates - Publishes states of all the models in simulation.
其中~/model_states发布的就是此次仿真中的所有模型的实时位姿真值,我们需要从中挑选出所关注的模型的信息。另外,link_states发布的是模型中部件的位姿信息,机械臂仿真中可能会需要此项信息。
同时,gazebo运行后还可以提供若干ros service,例如:
These services allow the user to retrieve state and property information about simulation and objects in simulation:
~/get_model_properties : gazebo_msgs/GetModelProperties- This service returns the properties of a model in simulation.
~/get_model_state : gazebo_msgs/GetModelState - This service returns the states of a model in simulation.
~/get_world_properties : gazebo_msgs/GetWorldProperties - This service returns the properties of the simulation world.
~/get_joint_properties : gazebo_msgs/GetJointProperties - This service returns the properties of a joint in simulation.
~/get_link_properties : gazebo_msgs/GetLinkProperties - This service returns the properties of a link in simulation.
~/get_link_state : gazebo_msgs/GetLinkState - This service returns the states of a link in simulation.
~/get_physics_properties : gazebo_msgs/GetPhysicsProperties - This service returns the properties of the physics engine used in simulation.
其中,get_model_state就是相应的获取机器人位姿真值的rosservice。
我们除了可以在命令行中用rostopic echo和rosservice call来获取返回值,也可以写代码来获取,例如请求一个service的写法:
// 开头别忘了引用头文件: #include "gazebo_msgs/GetModelState.h"
程序里写:
// ros常规操作: ros::NodeHandle n2; ros::ServiceClient client2 = n2.serviceClient<gazebo_msgs::GetModelState>("/gazebo/get_model_state"); gazebo_msgs::GetModelState srv2; srv2.request.model_name = "robot"; //指定要获取的机器人在gazebo中的名字; if (client2.call(srv2)) { // 如果获取服务成功了的话, // srv2.response就是请求服务后返回的数据,可以随便使用了。 } else { ROS_ERROR("Failed to call service /gazebo/get_model_state"); }
当然,也可以把这些内容放进一个callback函数里,让别的条件来触发获取真值的操作,例如:
//include略 // 注意callback函数的输入得和触发的topic格式对得上: void aCallback(const geometry_msgs::Twist& msg) { // ros常规操作: ros::NodeHandle n2; ros::ServiceClient client2 = n2.serviceClient<gazebo_msgs::GetModelState>("/gazebo/get_model_state"); gazebo_msgs::GetModelState srv2; srv2.request.model_name = "robot"; //指定要获取的机器人在gazebo中的名字; if (client2.call(srv2)) { // 如果获取服务成功了的话, // srv2.response就是请求服务后返回的数据,可以随便使用了。 } else { ROS_ERROR("Failed to call service /gazebo/get_model_state"); } } int main(int argc, char** argv){ ros::init(argc, argv, "a_node"); ros::NodeHandle n1; // 例如让一个速度控制命令rostopic来触发真值获取: ros::Subscriber sub = n1.subscribe("/cmd_vel",1,&aCallback); ros::Rate loop_rate1(100); while (ros::ok()) { ros::spinOnce(); loop_rate1.sleep(); } return 0; }
- 使用tf
这是一种非常规的获取机器人位姿真值的操作。使用的是ros tf里的TransformListener,归根结底是通过获取空间中两个指定坐标系之间的位姿变换(transform)来得到机器人位姿的。非常适合获取机器人身上一个指定部件在某个坐标系下的实时位姿(例如一个机械臂末端执行器,或者IMU),还是非常有实际意义的。
应用的框架如下:
#include <tf/transform_listener.h> //其他include略 int main(int argc, char** argv){ ros::init(argc, argv, "a_node"); ros::NodeHandle n1; tf::TransformListener listener; //创建一个listener; ros::Rate rate(100.0); while (ros::ok()){ tf::StampedTransform transform; //创建一个transform做储存坐标变换的容器; try{ //选择监测哪两个坐标系; listener.lookupTransform("/world", "/aimed_link", ros::Time(0), transform); } catch (tf::TransformException ex){ ROS_ERROR("%s",ex.what()); ros::Duration(0.5).sleep(); } //至此transform内就储存了两个指定坐标系间的变换了,可以进行进一步应用: //position_x = transform.getOrigin().x(); //position_y = transform.getOrigin().y(); //position_z = transform.getOrigin().z(); //orientation_x = transform.getRotation().x(); //orientation_y = transform.getRotation().y(); //orientation_z = transform.getRotation().z(); //orientation_w = transform.getRotation().w(); ros::spinOnce(); rate.sleep(); } return 0; }
- 应用插件
最方便的就是直接应用gazebo插件了,插件的概念详见Tutorial: Using Gazebo plugins with ROS
插件libgazebo_ros_p3d.so就具有发布机器人位姿真值的功能。
应用举例:
<!-- 在gazebo仿真模型文件中添加: --> <gazebo> <plugin name="p3d_base_controller" filename="libgazebo_ros_p3d.so"> <alwaysOn>true</alwaysOn> <updateRate>50.0</updateRate> <bodyName>base_footprint</bodyName> <topicName>base_pose_ground_truth</topicName> <gaussianNoise>0.0</gaussianNoise> <frameName>map</frameName> <xyzOffsets>0 0 0</xyzOffsets> <rpyOffsets>0 0 0</rpyOffsets> </plugin> </gazebo>
其中bodyName是机器人身上的link,frameName是参考的坐标系,由此我们可以知道,有了这个插件,也可以实现获取机器人身上指定部件位姿真值的目的。
更多相关内容 -
激光雷达移动机器人位姿校正方法
2020-02-28 08:56:27激光雷达移动机器人位姿校正方法,杨文清,刘晓平,移动机器人系统一般包括环境感知、实时定位、动态决策与规划、行为控制与执行等多个功能模块。其中定位模块是所有功能的基础,而 -
基于差分进化的并联机器人位姿正解 (2008年)
2021-05-08 18:51:25利用并联机器人位姿反解容易求取的特点,把并联机器人的位姿正解问题转化为假设已知位姿正解,通过位姿反解求得杆长值,并使所求得的杆长值与给定的杆长值之差为最小的优化问题,然后利用差分进化的全局寻优能力来... -
激光跟踪仪在工业机器人位姿特性检测中的应用.pdf
2021-08-14 12:51:00#资源达人分享计划# -
SLAM过程中的机器人位姿估计优化算法研究.pdf
2021-08-14 13:55:19SLAM过程中的机器人位姿估计优化算法研究.pdf -
并联机器人位姿正解优化算法及其仿真.pdf
2021-08-14 18:58:56#资源达人分享计划# -
除锈爬壁机器人位姿分析与纠偏技术.pdf
2021-08-11 23:31:14#资源达人分享计划# -
基于非线性滤波的移动机器人位姿估计 (2007年)
2021-05-14 05:37:17研究了基于扩展卡尔曼滤波和粒子滤波的移动机器人位姿估计。由于扩展卡尔曼滤波必须假定噪声服从高斯分布,若用于复杂非线性系统,其估计精度不甚理想。粒子滤波对噪声类型没有限制,正在成为非线性系统状态估计的... -
算法--UR机器人位姿表示
2019-12-24 07:16:09算法--UR机器人位姿表示1 简介2 位姿2.1 旋转矢量2.2 关节角3参考 1 简介 UR是协作机器人的鼻祖也是至今市场占比最高的品牌。 博主使用过,性能确实很好,实用性很强,如今进入协作机器人行业的公司很多,2019年上海...1 简介
UR是协作机器人的鼻祖也是至今市场占比最高的品牌。
博主使用过,性能确实很好,实用性很强,如今进入协作机器人行业的公司很多,2019年上海工博会得知,有70家,其实能做好的不多。2 位姿
UR机器人的Pose表示的是TCP坐标系相对于基座标系的位置和姿态。
一个坐标系相对于另一个坐标系的姿态的表示方法有很多种,比如:X-Y-Z固定角,Z-Y-X欧拉角,RPY角,四元数等。而UR机器人里面使用的是旋转矢量法。2.1 旋转矢量
x, y, z, Rx, Ry, Rz
(x, y, z)表示位置
(Rx, Ry, Rz)旋转矢量表示两个坐标系之间的旋转关系2.2 关节角
(θ1, θ2, θ3, θ4, θ5, θ6)表示6个关节角度
2.3 UR图示
3 运算
3.1 旋转矢量2旋转矩阵
- 详见《机器人学导论》
- 详见Hugoool博主UR机器人之一:坐标系及位姿表示方法
- 详见mazhengg博主等效轴角坐标系表示法
- 详见博主自己算法–机器人学导论
3.2 关节角2旋转矩阵
- 详见《机器人学导论》
- 详见五百年前的招魂夺魄博主6轴机器人运动学正解,逆解1
3.3 旋转矩阵求逆
参考
1、算法–机器人学导论
2、等效轴角坐标系表示法
3、UR机器人之一:坐标系及位姿表示方法
4、《机器人学导论》
5、6轴机器人运动学正解,逆解1
6、齐次变换矩阵逆矩阵的快速求解方法 -
移动机器人传感器位姿标定
2019-01-23 16:35:47This paper describes a new methodology for calculating the translational and rotational offsets of a range sensor to a reference coordinate frame on the platform to which it is affixed.... -
基于自控测距法的机器人位姿估计 (2009年)
2021-06-13 23:45:45结合改进的 Gyrodometry方法,通过融合码盘、陀螺仪与加速度计数据对机器人的位姿进行估计,实现了机器人的准确定位,解决了非系统定位误差对机器人位姿估计的影响,降低了陀螺仪、加速度计固有漂移的 不利影响,提高了两... -
机器人位姿方程资料.ppt
2021-03-10 18:56:58机器人位姿方程资料 -
机器人位姿描述与坐标变换
2018-11-18 11:05:57机器人的位姿描述与坐标变换是进行工业机器人运动学和动力学分析的基础。本节简要介绍上述内容,明确位姿描述和坐标变换的关系,用到的基本数学知识就是——矩阵。 1.位姿表示 位姿代表位置和姿态。任何一个刚体在...机器人的位姿描述与坐标变换是进行工业机器人运动学和动力学分析的基础。本节简要介绍上述内容,明确位姿描述和坐标变换的关系,用到的基本数学知识就是——矩阵。
1.位姿表示
位姿代表位置和姿态。任何一个刚体在空间坐标系(OXYZ)中可以用位置和姿态来精确、唯一表示其位置状态。
- 位置:x、y、z坐标
- 姿态:刚体与OX轴的夹角rx、与OY轴的夹角ry、与OZ轴的夹角rz
假设基坐标系为OXYZ,刚体坐标系为O`X`Y`Z`。对于机器人而言,空间中的任何一个点都必须要用上述六个参数明确指定,即(x,y,z,rx,ry,rz),即便(x,y,z)都一样,(rx,ry,rz)不同代表机器人以不同的姿态去到达同一个点。
刚体的位置可以用一个3x1的矩阵来表示,即刚体坐标系中心O`在基坐标系中的位置,即
刚体的姿态可以用一个3x3的矩阵来表示,即刚体坐标系在基坐标系中的姿态,即
其中,第一列表示刚体坐标系的O`X`轴在基坐标系的三个轴方向上的分量,称为单位主矢量。同理,第二列和第三列分别是刚体坐标系的O`Y`轴和O`Z`轴在基坐标系的三个轴方向上的分量。
举个例子,在下图中,刚体M沿坐标系O中平移了(0,20,15),绕Z轴旋转了90度,因此刚体M在坐标系O的位姿可描述为:
,
根据上面的例子,很容易得到,刚体坐标系绕X轴(Y轴、Z轴)旋转角度θ后的姿态矩阵为:
2.齐次坐标与齐次矩阵
2.1 齐次坐标
其中,x=a/w, y=b/w, z=c/w 。
- 点的齐次坐标
对于某一个点(10,20,30),它的齐次坐标可以表示为
- 坐标轴的齐次坐标
2.2 齐次矩阵
机器人学中,用齐次矩阵(4x4)来统一描述刚体的位置和姿态,如下图。通过矩阵的正逆变换和矩阵相乘操作,实现位姿的变换。
其中,前面的3x3矩阵代表刚体的姿态,后面的3x1矩阵代表刚体的位置。
2.3 齐次变换
有了上述基础,接下来可以用齐次变换来描述刚体在空间中的位姿变换了。齐次矩阵不仅可以描述刚体在空间中的位姿,还可以描述位姿变换过程,比如“绕某某坐标系的X轴旋转43°,并且绕Y轴旋转-89°”。齐次变换分为平移变换、旋转变换以及前两者的结合。
2.3.1 平移变换
平移变换较为简单,比如坐标系j相对坐标系i的x、y、z分别平移10,-20,30,用齐次矩阵表示如下:
其中,矩阵位置可以交换,因为这是三个相互独立的变量,交换后不影响结果。
2.3.2 旋转变换
例1:坐标系j相对坐标系i的X轴旋转90°,齐次矩阵描述如下:
例2:坐标系j相对坐标系i的X轴旋转90°,并绕坐标系i的Y轴旋转90°,由例1得到“坐标系j相对坐标系i的X轴旋转90°”的变换描述,也容易得到“绕坐标系i的Y轴旋转90°”的变换描述。但是这两个矩阵能否像平移变换一样随意交换次序呢?答案是否定的,矩阵左乘和矩阵右乘的意义是不一样的:
- 变换算子左乘:表示该变换是相对固定坐标系变换
- 变换算子右乘:表示该变换是相对动的坐标系(新坐标系)变换。
需要解释的是,我们把上述的平移变换和旋转变换称为变换算子。
根据上述原则,则例2中,两个变换都是绕坐标系i的变换,是绕固定坐标系的变换,变换算子应该左乘。假设刚体j原位姿的齐次矩阵描述为P,那么经历“坐标系j相对坐标系i的X轴旋转90°”后的描述为:
即,变换算子左乘。接下来第二个变换是“绕坐标系i的Y轴旋转90°”,也应该左乘:
例3:坐标系j相对坐标系i的X轴旋转90°,并绕坐标系j的Y轴旋转90°。
这一题与例2的区别在于第二个变换改成了“绕坐标系j的Y轴旋转90°”。首先第一个变换没啥变换,与例2的第一个变换一样,绕固定坐标系旋转,左乘。第二个变换应该是:
2.3.3 平移+旋转变换
这里平移变换算子可以直接加到旋转变换算子里(试试就知道了,平移与旋转是相对独立的)。这里既然讲到平移与旋转的综合变换,不如说下“已知刚体i的空间位姿参数为(x,y,z,rx,ry,rz),如何用齐次矩阵来描述?”这就好比刚体坐标系j与固定坐标系i最开始完全重合,然后刚体j沿坐标系i的X、Y、Z方向分别移动距离x,y和z,并且绕坐标系i的X轴、Y轴、Z轴分别旋转rx、ry和rz。
讲到这里,机器人的位姿描述与坐标变换也就基本结束了。上述知识是进行机器人运动学分析、动力学分析、机器人离线编程软件开发等的基础。尤其在机器人逆运动学分析和仿真过程、工业现场手眼标定等场合,齐次矩阵的变换尤其重要。有了上述基础,再去看Jungle之前的两篇文章:
https://blog.csdn.net/sinat_21107433/article/details/78937391
https://blog.csdn.net/sinat_21107433/article/details/80169043
欢迎关注知乎专栏:Jungle是一个用Qt的工业Robot
公众号【Jungle笔记】后台回复“机器人文档”,可以获得本文PDF。
-
基于惯性传感器的球形机器人位姿控制系统及实验研究.pdf
2021-08-13 22:18:09#资源达人分享计划# -
手眼标定之机器人位姿设置及程序.zip
2021-05-24 11:22:46手眼标定之机器人位姿设置及程序 -
基于多传感器融合的机器人位姿估计研究.pdf
2021-08-13 23:01:58#资源达人分享计划# -
KUKA工业机器人位姿测量与在线误差补偿.pdf
2021-08-14 20:16:14#资源达人分享计划# -
基于非线性滤波的移动机器人位姿估计
2021-02-22 17:58:41基于非线性滤波的移动机器人位姿估计 -
连续型机器人位姿检测系统设计.pdf
2021-08-14 19:36:23#资源达人分享计划# -
一种通用的工业机器人位姿检测方法.pdf
2021-08-14 16:13:08一种通用的工业机器人位姿检测方法.pdf -
六关节机器人位姿精度测量与误差分析.pdf
2021-08-14 14:08:51六关节机器人位姿精度测量与误差分析.pdf -
机器人位姿描述PPT学习教案.pptx
2021-10-08 15:50:03机器人位姿描述PPT学习教案.pptx -
面向机器人位姿测量的大视场变焦测量方法
2021-02-13 17:21:15针对机器人大范围位姿精准测量问题,提出一种大视场位姿测量的变焦测量方法。利用变焦图像匹配点的单应矩阵进行变焦内参动态计算,根据变焦前后靶标位姿求解相机坐标系变换,给出与变焦参数相关的PnP算法,考虑畸变... -
基于ADAMS的3-RPS型并联机器人位姿的正解与逆解 (2005年)
2021-05-15 16:13:52以ADAMS软件为基础,给出了一种基于ADAMS的求解3-RPS型并联机器人位姿的正解与逆解方法。先给定机械手的位姿,经过仿真测量得出驱动杆的位移时间曲线,用后处理模块对测量得到的曲线进行处理,得到驱动杆位移样条... -
带连杆六自由度并联机器人位姿反解方法研究.pdf
2021-08-14 12:50:56#资源达人分享计划# -
基于SMULINK和ADAMS四足机器人位姿调整的研究.pdf
2021-08-14 13:49:42基于SMULINK和ADAMS四足机器人位姿调整的研究.pdf -
一种协作机器人位姿重复性优化综合.pdf
2021-08-11 23:54:00#资源达人分享计划# -
工业机器人位姿误差空间IDSW插值补偿方法研究.pdf
2021-08-14 20:21:13#资源达人分享计划# -
基于陀螺仪的水下机器人位姿测量系统研究.pdf
2021-08-14 09:16:25#资源达人分享计划# -
基于matlab小波包的工业机器人位姿分析.pdf
2021-10-31 17:03:24基于matlab小波包的工业机器人位姿分析.pdf