差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
| 机器人:franka:libfranka:libfranka的捕获和重放:1.libfranka的捕获和重放的技术路线 [2025/11/10 09:19] – [libfranka的控制数据的基本概念] ctbots | 机器人:franka:libfranka:libfranka的捕获和重放:1.libfranka的捕获和重放的技术路线 [2025/11/10 11:33] (当前版本) – [别人的项目是如何完成libfranka的位姿读取和重放控制的?] ctbots | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | {{htmlmetatags> | ||
| + | metatag-keywords=(libfranka, | ||
| + | metatag-description=(了解如何使用libfranka进行机器人控制数据的捕获和重放,包括不同类型的Motion Model和Control Model,及其应用场景和技术细节。) | ||
| + | metatag-media-og: | ||
| + | metatag-og: | ||
| + | metatag-og: | ||
| + | }} | ||
| ====== 1.libfranka的捕获和重放的技术路线 ====== | ====== 1.libfranka的捕获和重放的技术路线 ====== | ||
| 行 34: | 行 41: | ||
| | Torque Control | | Torque Control | ||
| - | 从 Motion到 Control的转换,我们能直接控制的部分是Motion部分,所以主要把注意力集中在这里 | + | 从 Motion到 Control的转换,我们能直接控制的部分是Motion部分,所以主要把注意力集中在这里; 这块转换代码如果要看,主要集中在libfranka的 convertMotion函数 |
| + | |||
| + | ===== 别人的项目是如何完成libfranka的位姿读取和重放控制的? ===== | ||
| + | |||
| + | 我们参考了一些开源的项目,主要清单如下【如果不好访问github,提供了加速地址】: | ||
| + | |||
| + | https:// | ||
| + | 镜像地址: | ||
| + | https:// | ||
| + | |||
| + | 其中,franka_interface/ | ||
| + | |||
| + | |||
| + | https:// | ||
| + | 镜像地址: | ||
| + | https:// | ||
| + | |||
| + | 一个franka的fci 跟 ros 中间的桥接项目; | ||
| + | |||
| + | https:// | ||
| + | 镜像地址: | ||
| + | https:// | ||
| + | |||
| + | * experiments/ | ||
| + | * experiments/ | ||
| + | |||
| + | ^ 命令 ^ 功能描述 ^ 参数 ^ | ||
| + | | connect | 连接到Franka机器人,建立与指定IP地址Franka机器人的连接,并加载机器人模型 | 机器人IP地址 | | ||
| + | | disconnect | 断开机器人连接,重置机器人连接指针,释放资源 | 无 | | ||
| + | | error_recovery | 尝试从机器人错误状态中恢复 | 无 | | ||
| + | | set_knife | 设置末端执行器(刀具)属性,根据配置文件设置不同刀具的末端执行器属性 | 刀具类型(" | ||
| + | | get_knife | 获取当前选中的刀具,返回当前已设置的刀具类型 | 无 | | ||
| + | | set_joint_impedance | 配置机器人各关节的阻抗控制参数 | 7个关节的阻抗值数组 | | ||
| + | | set_collision_behavior | 配置机器人在碰撞情况下的响应行为 | 扭矩阈值和力阈值数组 | | ||
| + | | record | 以指定间隔记录指定数量的机器人状态数据,保存为JSON文件 | 步数、采样间隔(毫秒) | | ||
| + | | retrieve | 读取指定路径的JSON日志文件内容并返回 | 日志文件路径 | | ||
| + | | move_to_q | 控制机器人在指定时间内平滑移动到目标关节位置,可选记录运动过程 | 目标关节角度数组、移动时长、确认标志、记录标志、记录频率 | | ||
| + | | interpolate | 对给定的关节位置点进行插值,生成新的更密集或更稀疏的路点序列 | 路点数、关节角度数据、源时间步长、目标时间步长 | | ||
| + | | follow_qs | 根据给定的关节位置点序列和时间步长,控制机器人按照插值后的平滑轨迹运动 | 路点数、关节角度数据、源时间步长、记录频率 | | ||
| + | | follow_cartesian_vel | 根据给定的笛卡尔速度序列和时间步长,控制机器人执行相应的笛卡尔空间运动 | 路点数、笛卡尔速度数据、源时间步长、记录频率 | | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | https:// | ||
| + | 镜像地址: | ||
| + | https:// | ||
| + | |||
| + | * 依赖于https:// | ||
| + | * launch/ | ||
| + | * launch/ | ||
| + | |||
| + | ===== Motion的类型和具体源代码 ===== | ||
| + | |||
| + | 我们后续,可能会主要考虑 使用 Joint Velocity 和 Cartesian Velocity 的方式进行录制和回放 | ||
| + | |||
| + | 但是考虑到使用openvla进行配置,那么应该最推荐 | ||
| + | |||
| + | ^ Motion Generator类型 | ||
| + | | Joint Position | ||
| + | | Joint Velocity | ||
| + | | Cartesian Pose | include/ | ||
| + | | Cartesian Velocity | ||
| + | |||
| + | ==== Joint Position ==== | ||
| + | |||
| + | 我们可以看到,主要关注 std:: | ||
| + | |||
| + | 因为这种运动模式就是直接设定7个关节的最终位置 | ||
| + | |||
| + | ++++ 展开代码| | ||
| + | <code cpp jp.cpp> | ||
| + | /** | ||
| + | * 存储用于关节位置运动生成的值。 | ||
| + | */ | ||
| + | class JointPositions : public Finishable { | ||
| + | | ||
| + | /** | ||
| + | * 创建一个新的JointPositions实例。 | ||
| + | * | ||
| + | * @param[in] joint_positions 期望的关节角度,单位为[rad]。 | ||
| + | */ | ||
| + | JointPositions(const std:: | ||
| + | |||
| + | /** | ||
| + | * 创建一个新的JointPositions实例。 | ||
| + | * | ||
| + | * @param[in] joint_positions 期望的关节角度,单位为[rad]。 | ||
| + | * | ||
| + | * @throw std:: | ||
| + | */ | ||
| + | JointPositions(std:: | ||
| + | |||
| + | /** | ||
| + | * 期望的关节角度,单位为[rad]。 | ||
| + | */ | ||
| + | std:: | ||
| + | }; | ||
| + | </ | ||
| + | ++++ | ||
| + | ==== Joint Velocity | ||
| + | |||
| + | std:: | ||
| + | |||
| + | ++++折叠代码| | ||
| + | <code cpp jv.cpp> | ||
| + | /** | ||
| + | * 存储用于关节速度运动生成的值。 | ||
| + | */ | ||
| + | class JointVelocities : public Finishable { | ||
| + | | ||
| + | /** | ||
| + | * 创建一个新的JointVelocities实例。 | ||
| + | * | ||
| + | * @param[in] joint_velocities 期望的关节速度,单位为[rad/ | ||
| + | * | ||
| + | */ | ||
| + | JointVelocities(const std:: | ||
| + | |||
| + | /** | ||
| + | * 创建一个新的JointVelocities实例。 | ||
| + | * | ||
| + | * @param[in] joint_velocities 期望的关节速度,单位为[rad/ | ||
| + | * | ||
| + | * @throw std:: | ||
| + | */ | ||
| + | JointVelocities(std:: | ||
| + | |||
| + | /** | ||
| + | * 期望的关节速度,单位为[rad/ | ||
| + | */ | ||
| + | std:: | ||
| + | }; | ||
| + | </ | ||
| + | ++++ | ||
| + | ==== Cartesian Pose ==== | ||
| + | std:: | ||
| + | |||
| + | std:: | ||
| + | |||
| + | ++++ 折叠代码| | ||
| + | <code cpp cp.cpp> | ||
| + | ```cpp | ||
| + | /** | ||
| + | * 存储用于笛卡尔姿态运动生成的值。 | ||
| + | */ | ||
| + | class CartesianPose : public Finishable { | ||
| + | | ||
| + | /** | ||
| + | * 创建一个新的CartesianPose实例。 | ||
| + | * | ||
| + | * @param[in] cartesian_pose 期望的向量化齐次变换矩阵, | ||
| + | * 列优先,从末端执行器坐标系转换到基座坐标系。 | ||
| + | * 同样,它也是在基座坐标系中期望的末端执行器姿态。 | ||
| + | */ | ||
| + | CartesianPose(const std:: | ||
| + | |||
| + | /** | ||
| + | * 创建一个新的CartesianPose实例。 | ||
| + | * | ||
| + | * @param[in] cartesian_pose 期望的向量化齐次变换矩阵。 | ||
| + | * @param[in] elbow 肘部配置(详见@ref elbow成员以获取更多细节)。 | ||
| + | */ | ||
| + | CartesianPose(const std:: | ||
| + | const std:: | ||
| + | |||
| + | /** | ||
| + | * 创建一个新的CartesianPose实例。 | ||
| + | * | ||
| + | * @param[in] cartesian_pose 期望的向量化齐次变换矩阵。 | ||
| + | * | ||
| + | * @throw std:: | ||
| + | */ | ||
| + | CartesianPose(std:: | ||
| + | |||
| + | /** | ||
| + | * 创建一个新的CartesianPose实例。 | ||
| + | * | ||
| + | * @param[in] cartesian_pose 期望的向量化齐次变换矩阵。 | ||
| + | * @param[in] elbow 肘部配置。 | ||
| + | * | ||
| + | * @throw std:: | ||
| + | */ | ||
| + | CartesianPose(std:: | ||
| + | std:: | ||
| + | |||
| + | /** | ||
| + | * 期望的末端执行器姿态(4x4齐次矩阵,列优先)。 | ||
| + | */ | ||
| + | std:: | ||
| + | |||
| + | /** | ||
| + | * 肘部配置,用于冗余解析。 | ||
| + | */ | ||
| + | std:: | ||
| + | |||
| + | /** | ||
| + | * 检查是否指定了肘部配置。 | ||
| + | */ | ||
| + | bool hasElbow() const noexcept; | ||
| + | }; | ||
| + | ``` | ||
| + | </ | ||
| + | ++++ | ||
| + | ==== Cartesian Velocity ==== | ||
| + | |||
| + | std:: | ||
| + | |||
| + | std:: | ||
| + | |||
| + | ++++ 折叠代码| | ||
| + | <code cpp cv.cpp> | ||
| + | /** | ||
| + | * 存储用于笛卡尔速度运动生成的值。 | ||
| + | */ | ||
| + | class CartesianVelocities : public Finishable { | ||
| + | | ||
| + | /** | ||
| + | * 创建一个新的CartesianVelocities实例。 | ||
| + | * | ||
| + | * @param[in] cartesian_velocities 基于基座坐标系O的期望笛卡尔速度,包含(v_x, | ||
| + | */ | ||
| + | CartesianVelocities(const std:: | ||
| + | |||
| + | /** | ||
| + | * 创建一个新的CartesianVelocities实例。 | ||
| + | * | ||
| + | * @param[in] cartesian_velocities 期望的笛卡尔速度。 | ||
| + | * @param[in] elbow 肘部配置(详见@ref elbow成员以获取更多细节)。 | ||
| + | */ | ||
| + | CartesianVelocities(const std:: | ||
| + | const std:: | ||
| + | |||
| + | /** | ||
| + | * 创建一个新的CartesianVelocities实例。 | ||
| + | * | ||
| + | * @param[in] cartesian_velocities 期望的笛卡尔速度。 | ||
| + | * | ||
| + | * @throw std:: | ||
| + | */ | ||
| + | CartesianVelocities(std:: | ||
| + | |||
| + | /** | ||
| + | * 创建一个新的CartesianVelocities实例。 | ||
| + | * | ||
| + | * @param[in] cartesian_velocities 期望的笛卡尔速度。 | ||
| + | * @param[in] elbow 肘部配置。 | ||
| + | * | ||
| + | * @throw std:: | ||
| + | */ | ||
| + | CartesianVelocities(std:: | ||
| + | std:: | ||
| + | |||
| + | /** | ||
| + | * 基于基座坐标系O的笛卡尔速度,包含(v_x, | ||
| + | */ | ||
| + | std:: | ||
| + | |||
| + | /** | ||
| + | * 肘部配置。 | ||
| + | */ | ||
| + | std:: | ||
| + | |||
| + | /** | ||
| + | * 检查是否指定了肘部配置。 | ||
| + | */ | ||
| + | bool hasElbow() const noexcept; | ||
| + | }; | ||
| + | </ | ||
| + | ++++ | ||