====== fr3py调试遇到的一些问题 ====== ===== 问题1:lcm的转发工具 fr3_joint_interface的 Core崩溃问题 ===== fr3_joint_interface 在运行时,支持两种模式:torque 和 velocity 模式;但是这2种模式是互斥的;也就是如果同时运行2个,必然有一个会崩溃。 可能会提示如下错误: ''libfranka: Move command rejected: command not possible in the current mode ("User stopped")!'' fr3_joint_interface 不能在【Execution】模式下执行,因为 fr3_joint_interface 内部会通过fci的control去注册数据回调,在 【Execution】模式下,运行 fr3_joint_interface ,FCI会报错,提示模式不允许直接退出。 ===== 问题2:使用fr3py 无法在LCM模式下采集数据 ===== fr3_joint_interface 只能在franka的【Programming】模式下执行,此模式可以执行 LCM转发到FCI的任何指令,也能采集到数据。 但是 franka的【Programming】模式下 无法执行示教操作,无法用手引导Pilot 末端执行器做一些操作。此时关节被电击控制,即使按了pilot的按钮,也无法人工操作末端执行器。 所以我们不可以使用LCM模式的情况下,利用fr3py 去采集Pilot的示教数据。 ===== 问题3:官方只提供了 gripper.cpp 机制绕过了 LCM模式 ===== 官方只提供了 gripper.cpp桥接,可以让python直接调用 libfranka实现数据采集。 而没有提供关节的桥接。 这样可以避开问题2,问题2 里使用control指令受限。 我们编写了joint.cpp 自己绕过libfranka,获取关节数据。 #include #include #include #include #include namespace py = pybind11; using namespace pybind11::literals; PYBIND11_MODULE(fr3_gripper, handle) { py::class_(handle, "GripperState") .def(py::init<>()) .def_readwrite("width", &franka::GripperState::width) .def_readwrite("max_width", &franka::GripperState::max_width) .def_readwrite("is_grasped", &franka::GripperState::is_grasped) .def_readwrite("temperature", &franka::GripperState::temperature) .def_readwrite("time", &franka::GripperState::time) .def("__repr__", [](const franka::GripperState &state) { return ""; } ); py::class_(handle, "Gripper") .def(py::init()) .def("homing", &franka::Gripper::homing) .def("grasp", &franka::Gripper::grasp) .def("move", &franka::Gripper::move) .def("stop", &franka::Gripper::stop) .def("readOnce", [](franka::Gripper &self) -> py::dict { franka::GripperState state = self.readOnce(); return py::dict("width"_a=state.width, "max_width"_a=state.max_width, "is_grasped"_a=state.is_grasped, "temperature"_a=state.temperature, "time (ms)"_a=state.time.toMSec()); }, "read the gripper state") .def("serverVersion", &franka::Gripper::serverVersion); } ===== 问题4:自行开发了gripper 的 python桥接,但是报错提示找不到import ===== 一般会有类似的错误: ModuleNotFoundError: No module named 'fr3_joint' 解决方式: script_dir = os.path.dirname(os.path.abspath(__file__)) parent_dir = os.path.dirname(script_dir) fr3_gripper_dir = os.path.join(parent_dir, 'fr3_gripper') 如果还是找不到,则要考虑是否编译使用的python版本和运行的python不是一个版本,无法进行定位