文章目录

  • 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>

机器人模型和机器人状态相关推荐

  1. V-rep学习笔记:机器人模型创建4—定义模型

    完成之前的操作后终于来到最后一步--定义模型,即将之前创建的几何体.关节等元素按层级关系组织成为一个整体. 将最后一个连杆robot_link_dyn6拖放到相应的关节(robot_joint6)下, ...

  2. ROS探索总结(四)(五)(六)——简单的机器人仿真 创建简单的机器人模型smartcar 使用smartcar进行仿真

    ROS探索总结(四)--简单的机器人仿真 前边我们已经介绍了ROS的基本情况,以及新手入门ROS的初级教程,现在就要真正的使用ROS进入机器人世界了.接下来我们涉及到的很多例程都是<ROS by ...

  3. ROS 机器人模型节点的运动控制原理

    一般我们启动机器人模型是通过以下的.launch文件启动,如下所示: <launch><param name="robot_description" comman ...

  4. Rviz中控制机器人模型运动(arbotix)

    前言: 通过 URDF 结合 rviz 可以创建并显示机器人模型,不过,当前实现的只是静态模型,如何控制模型的运动呢?在此,可以调用 Arbotix 实现此功能. 简介: Arbotix:Arboti ...

  5. ROS——UDRF机器人模型优化(xacro)

    文章目录 UDRF机器人模型的不足 UDRF机器人模型的优化实现 xacro模型优势 xacro的使用方法 xacro创建一个小车机器人 编辑xacro机器人模型 启动模型在rviz中显示 小结 参考 ...

  6. ROS学习笔记6 URDF建立机器人模型(以双轮差速小车为例)

    URDF建立机器人模型 一.准备工作 一.搭建小车底盘模型 1.小车底盘 2.左右驱动轮 3.前后万向轮 4.launch启动文件 5.效果展示 二.摄像头仿真模型 1.添加摄像头模型 2.launc ...

  7. 扩散模型加持下,机器人模型DALL-E-Bot可以轻松完成自主重新排列任务

    原文链接:https://www.techbeat.net/article-info?id=4217 作者:seven_ 最近,图像扩散模型的发展可谓是风生水起,很多AI大厂纷纷在这一领域展开研究,例 ...

  8. [论文]基于强化学习的无模型水下机器人深度控制

    基于强化学习的无模型水下机器人深度控制 摘要 介绍 问题公式 A.水下机器人的坐标框架 B.深度控制问题 马尔科夫模型 A.马尔科夫决策 B.恒定深度控制MDP C.弯曲深度控制MDP D.海底追踪的 ...

  9. 6.5 Rviz中控制机器人模型运动

    ROS入门 6.5 Rviz中控制机器人模型运动 <ROS入门-理论与实践>视频教程镇楼 通过 URDF 结合 rviz 可以创建并显示机器人模型,不过,当前实现的只是静态模型,如何控制模 ...

  10. 搭建机器人模型进行slam过程记录

    有需要的小伙伴可以在评论区留言获取完整的工作空间代码包 环境:ubuntu18.04, ROS melodic 机器人底盘URDF文件编写 首先在工作空间目录下创建一个功能包,用来放置机器人模型,以及 ...

最新文章

  1. JDBC:使用连接池管理连接
  2. swift菜鸟入门视频教程-03-字符串和字符
  3. MySIAM与Innodb引擎
  4. 鸟哥的Linux私房菜(服务器)- 主机基本安全之一:限制 Linux 对外连线的端口
  5. 成功解决ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问。backend_agg.cp36
  6. cmos存储器中存放了_CMOS存储器中存放了计算机的一些参数和信息,其中不包含在内的是( )。_学小易找答案...
  7. JMeter定制功能实现
  8. 绝缘吹风机行业调研报告 - 市场现状分析与发展前景预测
  9. 网站建设-部署与发布
  10. 2021-01-22 LR照片处理逻辑及曝光调整中的基本审美
  11. [笔记]深入解析Windows操作系统《二》系统架构
  12. github视频教程-03 如何使用github上pull-request功能(VS2013)
  13. OpenDRIVE工具介绍及地址
  14. 计算机组成原理学习笔记-加法器
  15. 2021.07.29 Oracle学习笔记 2
  16. 创建Substrate 私有网络
  17. 在 JavaScript 中如何克隆对象?
  18. 怎么把两个PDF文件合并一起
  19. Java基础案例2-6:登录注册小程序
  20. Java多线程入门(狂神说)

热门文章

  1. mysql服务状态一直是启动解决方案
  2. Android短信发送,监听,及其工具类封装
  3. 地图上如何量方位角_利用GPS测量方位角的方法
  4. 推荐4个方便实用的软件神器,非常适合程序员
  5. [实战]黑帽SEO的RayFile排名做法
  6. 有关电动自行车上牌的知识,快来围观~
  7. 微信PC版应用双开,一台计算机两个微信号
  8. linux脚本while死循环,shell编程之while死循环
  9. No Assembler service found - please make sure that the right jars are in your classpath
  10. Sisvel和RPX签署Wi-Fi标准必要专利许可协议