ROS2服务与机械臂仿真代码
dofbot_moveit功能包包含了ROS2正逆运动学解算服务器、服务器和仿真环境下可视化机械臂的启动文件(launch)、以及用于描述三维机械臂模型的URDF描述文件。
“dofbot_moveit/urdf/dofbot.urdf”文件为约定俗成的机器人三维描述文件(urdf全称为Unified Robot Description Format)。示例代码为机械臂的三维模型定义片段。
<robot name="dofbot"> <!-- 实体描述 --> <link name="base_link"> <!-- 视觉描述 --> <visual> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <mesh filename="package://dofbot_moveit/meshes/base_link.STL"/> </geometry> <material name=""> <color rgba="0.7 0.7 0.7 1"/> </material> </visual> <!-- 碰撞描述 --> <collision> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <mesh filename="package://dofbot_moveit/meshes/base_link.STL"/> </geometry> </collision> </link>
robot标签定义了机器人的名称为dofbot,在此标签下有多个子标签,如link、joint等,每个子标签定义了当前机器人的组成部分。每个组成部分也拥有属于自己的子标签。这些子标签为该组成部分的属性,例如这个具体关节所在空间的位置和姿态,以及关节的颜色及材质等。通过urdf文件对机器人的描述,可以在仿真环境中可视化机械臂,如图1所示。
“dofbot_moveit/src/dofbot_server.cpp”文件定义了正逆运动学解的服务器,其核心代码如下。
srvicecallback()函数为正逆运动学解服务器的回调函数,两个参数分别为客户端发送的请求(request)和服务端回复(response)的响应。二者皆由前文中提到的srv消息类型文件定义。当客户端发送的请求模式为求解正运动学(fk),则调用响应函数,进行响应运算,获得目标位置的坐标和姿态角,存入响应变量(response)中,反之同理。
bool srvicecallback(const std::shared_ptr<dofbot_info::srv::Kinemarics::Request> request, std::shared_ptr<dofbot_info::srv::Kinemarics::Response> response) { if (request->kin_name == "fk") { double joints[]{request->cur_joint1, request->cur_joint2, request->cur_joint3, request->cur_joint4, request->cur_joint5}; // 定义目标关节角容器 vector<double> initjoints; // 定义位姿容器 vector<double> initpos; // 目标关节角度单位转换,由角度转换成弧度 for (int i = 0; i < 5; ++i) { initjoints.push_back((joints[i] - 90) * DE2RA); } // 调取正解函数,获取当前位姿 dofbot.dofbot_getFK(urdf_file, initjoints, initpos); cout << "--------- Fk ---------" << a << "--------- Fk ---------" << endl; cout << "XYZ坐标 : " << initpos.at(0) << " ," << initpos.at(1) << " ," << initpos.at(2) << endl; cout << "Roll,Pitch,Yaw: " << initpos.at(3) << " ," << initpos.at(4) << " ," << initpos.at(5) << endl; response->x = initpos.at(0); response->y = initpos.at(1); response->z = initpos.at(2); response->roll = initpos.at(3); response->pitch = initpos.at(4); response->yaw = initpos.at(5); }
父主题: 代码实现