机器人模型和机器人状态
文章目录
- RobotModel 和 RobotState 类
- 一、例程
- 二、代码
- 1.我们将首先实例化一个 RobotModelLoader 对象,该对象将在 ROS 参数服务器上查找机器人描述并构造一个 RobotModel供我们使用。
- 2.联合限制
- 3.正向运动学
- 4.逆运动学
- 5.获取雅可比行列式
- 三、启动文件
RobotModel 和 RobotState 类
RobotModel和RobotState类是访问机器人运动学的核心类。
RobotModel类包含所有链接和关节之间的关系,包括它们从 URDF 加载的关节限制属性。RobotModel 还将机器人的链接和关节分成在 SRDF 中定义的规划组。
RobotState包含有关机器人在某个时间点的信息,存储关节位置的向量以及可选的速度和加速度。此信息可用于获取有关机器人的运动学信息,该信息取决于其当前状态,例如末端执行器的雅可比行列式。
RobotState 还包含用于根据末端执行器位置(笛卡尔姿势)设置手臂位置和计算笛卡尔轨迹的辅助函数。
一、例程
Roslaunch 启动文件以直接从 moveit_tutorials 运行代码:
roslaunch moveit_tutorials robot_model_and_robot_state_tutorial.launch
输出
ros.moveit_tutorials: Model frame: /panda_link0
ros.moveit_tutorials: Joint panda_joint1: 0.000000
ros.moveit_tutorials: Joint panda_joint2: 0.000000
ros.moveit_tutorials: Joint panda_joint3: 0.000000
ros.moveit_tutorials: Joint panda_joint4: 0.000000
ros.moveit_tutorials: Joint panda_joint5: 0.000000
ros.moveit_tutorials: Joint panda_joint6: 0.000000
ros.moveit_tutorials: Joint panda_joint7: 0.000000
ros.moveit_tutorials: Current state is not valid
ros.moveit_tutorials: Current state is valid
ros.moveit_tutorials: Translation:
-0.541498
-0.592805
0.400443
ros.moveit_tutorials: Rotation:
-0.395039 0.600666 -0.695086
0.299981 -0.630807 -0.715607
-0.868306 -0.491205 0.0690048
ros.moveit_tutorials: Joint panda_joint1: -2.407308
ros.moveit_tutorials: Joint panda_joint2: 1.555370
ros.moveit_tutorials: Joint panda_joint3: -2.102171
ros.moveit_tutorials: Joint panda_joint4: -0.011156
ros.moveit_tutorials: Joint panda_joint5: 1.100545
ros.moveit_tutorials: Joint panda_joint6: 3.230793
ros.moveit_tutorials: Joint panda_joint7: -2.651568
ros.moveit_tutorials: Jacobian:
0.592805 -0.0500638 -0.036041 0.366761 -0.0334361 0.128712 -4.33681e-18
-0.541498 -0.0451907 0.0417049 -0.231187 0.0403683 0.00288573 3.46945e-18
0 -0.799172 0.0772022 -0.247151 0.0818336 0.0511662 0
0 0.670056 -0.742222 0.349402 -0.748556 -0.344057 -0.695086
0 -0.74231 -0.669976 -0.367232 -0.662737 0.415389 -0.715607
1 4.89669e-12 0.0154256 0.862009 0.021077 0.842067 0.0690048
二、代码
1.我们将首先实例化一个 RobotModelLoader 对象,该对象将在 ROS 参数服务器上查找机器人描述并构造一个 RobotModel供我们使用。
代码如下(示例):
robot_model_loader::RobotModelLoader robot_model_loader("robot_description");
const moveit::core::RobotModelPtr& kinematic_model = robot_model_loader.getModel();
ROS_INFO("Model frame: %s", kinematic_model->getModelFrame().c_str());
使用RobotModel,我们可以构造一个 RobotState来维护机器人的配置。我们将状态下的所有关节设置为其默认值。然后我们可以得到一个 JointModelGroup,它代表特定组的机器人模型,例如Panda机器人的“panda_arm”。
moveit::core::RobotStatePtr kinematic_state(new moveit::core::RobotState(kinematic_model));
kinematic_state->setToDefaultValues();
const moveit::core::JointModelGroup* joint_model_group = kinematic_model->getJointModelGroup("panda_arm");const std::vector<std::string>& joint_names = joint_model_group->getVariableNames();
检索存储在 Panda 手臂状态中的当前关节值集。
std::vector<double> joint_values;
kinematic_state->copyJointGroupPositions(joint_model_group, joint_values);
for (std::size_t i = 0; i < joint_names.size(); ++i)
{ROS_INFO("Joint %s: %f", joint_names[i].c_str(), joint_values[i]);
}
2.联合限制
etJointGroupPositions() 本身不会强制执行联合限制,但调用 enforceBounds() 会执行此操作
/* Set one joint in the Panda arm outside its joint limit */
joint_values[0] = 5.57;
kinematic_state->setJointGroupPositions(joint_model_group, joint_values);/* Check whether any joint is outside its joint limits */
ROS_INFO_STREAM("Current state is " << (kinematic_state->satisfiesBounds() ? "valid" : "not valid"));/* Enforce the joint limits for this state and check again*/
kinematic_state->enforceBounds();
ROS_INFO_STREAM("Current state is " << (kinematic_state->satisfiesBounds() ? "valid" : "not valid"));
3.正向运动学
现在,可以计算一组随机关节值的正向运动学。请注意,我们希望找到“panda_link8”的位姿,它是机器人“panda_arm”组中最远端的链接。
kinematic_state->setToRandomPositions(joint_model_group);
const Eigen::Isometry3d& end_effector_state = kinematic_state->getGlobalLinkTransform("panda_link8");/* Print end-effector pose. Remember that this is in the model frame */
ROS_INFO_STREAM("Translation: \n" << end_effector_state.translation() << "\n");
ROS_INFO_STREAM("Rotation: \n" << end_effector_state.rotation() << "\n");
4.逆运动学
现在可以求解 Panda 机器人的逆运动学 (IK)。要解决 IK,我们将需要以下内容:
末端执行器的所需姿势(默认情况下,这是“panda_arm”链中的最后一个链接):我们在上述步骤中计算的 end_effector_state。
超时:0.1 s
double timeout = 0.1;
bool found_ik = kinematic_state->setFromIK(joint_model_group, end_effector_state, timeout);
现在,我们可以打印出 IK 解决方案(如果找到):
if (found_ik)
{kinematic_state->copyJointGroupPositions(joint_model_group, joint_values);for (std::size_t i = 0; i < joint_names.size(); ++i){ROS_INFO("Joint %s: %f", joint_names[i].c_str(), joint_values[i]);}
}
else
{ROS_INFO("Did not find IK solution");
}
5.获取雅可比行列式
我们还可以从RobotState获取雅可比行列式。
Eigen::Vector3d reference_point_position(0.0, 0.0, 0.0);
Eigen::MatrixXd jacobian;
kinematic_state->getJacobian(joint_model_group,kinematic_state->getLinkModel(joint_model_group->getLinkModelNames().back()),reference_point_position, jacobian);
ROS_INFO_STREAM("Jacobian: \n" << jacobian << "\n");
三、启动文件
要运行代码,您需要一个启动文件,它可以做两件事:
将 Panda URDF 和 SRDF 加载到参数服务器上,然后将 MoveIt 设置助手生成的 kinematics_solver 配置放到实例化本教程中的类的节点命名空间中的 ROS 参数服务器上。
<launch><include file="$(find panda_moveit_config)/launch/planning_context.launch"><arg name="load_robot_description" value="true"/></include><node name="robot_model_and_robot_state_tutorial"pkg="moveit_tutorials"type="robot_model_and_robot_state_tutorial"respawn="false" output="screen"><rosparam command="load"file="$(find panda_moveit_config)/config/kinematics.yaml"/></node>
</launch>
机器人模型和机器人状态相关推荐
- V-rep学习笔记:机器人模型创建4—定义模型
完成之前的操作后终于来到最后一步--定义模型,即将之前创建的几何体.关节等元素按层级关系组织成为一个整体. 将最后一个连杆robot_link_dyn6拖放到相应的关节(robot_joint6)下, ...
- ROS探索总结(四)(五)(六)——简单的机器人仿真 创建简单的机器人模型smartcar 使用smartcar进行仿真
ROS探索总结(四)--简单的机器人仿真 前边我们已经介绍了ROS的基本情况,以及新手入门ROS的初级教程,现在就要真正的使用ROS进入机器人世界了.接下来我们涉及到的很多例程都是<ROS by ...
- ROS 机器人模型节点的运动控制原理
一般我们启动机器人模型是通过以下的.launch文件启动,如下所示: <launch><param name="robot_description" comman ...
- Rviz中控制机器人模型运动(arbotix)
前言: 通过 URDF 结合 rviz 可以创建并显示机器人模型,不过,当前实现的只是静态模型,如何控制模型的运动呢?在此,可以调用 Arbotix 实现此功能. 简介: Arbotix:Arboti ...
- ROS——UDRF机器人模型优化(xacro)
文章目录 UDRF机器人模型的不足 UDRF机器人模型的优化实现 xacro模型优势 xacro的使用方法 xacro创建一个小车机器人 编辑xacro机器人模型 启动模型在rviz中显示 小结 参考 ...
- ROS学习笔记6 URDF建立机器人模型(以双轮差速小车为例)
URDF建立机器人模型 一.准备工作 一.搭建小车底盘模型 1.小车底盘 2.左右驱动轮 3.前后万向轮 4.launch启动文件 5.效果展示 二.摄像头仿真模型 1.添加摄像头模型 2.launc ...
- 扩散模型加持下,机器人模型DALL-E-Bot可以轻松完成自主重新排列任务
原文链接:https://www.techbeat.net/article-info?id=4217 作者:seven_ 最近,图像扩散模型的发展可谓是风生水起,很多AI大厂纷纷在这一领域展开研究,例 ...
- [论文]基于强化学习的无模型水下机器人深度控制
基于强化学习的无模型水下机器人深度控制 摘要 介绍 问题公式 A.水下机器人的坐标框架 B.深度控制问题 马尔科夫模型 A.马尔科夫决策 B.恒定深度控制MDP C.弯曲深度控制MDP D.海底追踪的 ...
- 6.5 Rviz中控制机器人模型运动
ROS入门 6.5 Rviz中控制机器人模型运动 <ROS入门-理论与实践>视频教程镇楼 通过 URDF 结合 rviz 可以创建并显示机器人模型,不过,当前实现的只是静态模型,如何控制模 ...
- 搭建机器人模型进行slam过程记录
有需要的小伙伴可以在评论区留言获取完整的工作空间代码包 环境:ubuntu18.04, ROS melodic 机器人底盘URDF文件编写 首先在工作空间目录下创建一个功能包,用来放置机器人模型,以及 ...
最新文章
- JDBC:使用连接池管理连接
- swift菜鸟入门视频教程-03-字符串和字符
- MySIAM与Innodb引擎
- 鸟哥的Linux私房菜(服务器)- 主机基本安全之一:限制 Linux 对外连线的端口
- 成功解决ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问。backend_agg.cp36
- cmos存储器中存放了_CMOS存储器中存放了计算机的一些参数和信息,其中不包含在内的是( )。_学小易找答案...
- JMeter定制功能实现
- 绝缘吹风机行业调研报告 - 市场现状分析与发展前景预测
- 网站建设-部署与发布
- 2021-01-22 LR照片处理逻辑及曝光调整中的基本审美
- [笔记]深入解析Windows操作系统《二》系统架构
- github视频教程-03 如何使用github上pull-request功能(VS2013)
- OpenDRIVE工具介绍及地址
- 计算机组成原理学习笔记-加法器
- 2021.07.29 Oracle学习笔记 2
- 创建Substrate 私有网络
- 在 JavaScript 中如何克隆对象?
- 怎么把两个PDF文件合并一起
- Java基础案例2-6:登录注册小程序
- Java多线程入门(狂神说)
热门文章
- mysql服务状态一直是启动解决方案
- Android短信发送,监听,及其工具类封装
- 地图上如何量方位角_利用GPS测量方位角的方法
- 推荐4个方便实用的软件神器,非常适合程序员
- [实战]黑帽SEO的RayFile排名做法
- 有关电动自行车上牌的知识,快来围观~
- 微信PC版应用双开,一台计算机两个微信号
- linux脚本while死循环,shell编程之while死循环
- No Assembler service found - please make sure that the right jars are in your classpath
- Sisvel和RPX签署Wi-Fi标准必要专利许可协议