修改interface模式

This commit is contained in:
zj
2025-10-24 19:28:02 +08:00
parent 7a351cb41e
commit 3d387b2bba
30 changed files with 2116 additions and 48 deletions

View File

@@ -5,7 +5,7 @@
#include "std_msgs/msg/float64_multi_array.hpp"
#include "rclcpp_action/rclcpp_action.hpp"
#include "interfaces/action/arm.hpp"
#include "arm_define.h"
#include "arm_action_define.h"
#include "rm_define.h"
using ArmAction = interfaces::action::Arm;

View File

@@ -365,9 +365,9 @@ void ArmKeyboardNode::SendDirectSteppingGoal2(const float *values, int armId)
int64_t timeStamp = get_clock()->now().nanoseconds();
auto goal_msg = ArmAction::Goal();
commandId++;
goal_msg.body_id.body_id = armId;
goal_msg.data_type.action_type = ARM_COMMAND_TYPE_POSE_STEP_ON; // 位置控制
goal_msg.data_length.data_length = POSE_DIMENSION;
goal_msg.body_id = armId;
goal_msg.data_type = ARM_COMMAND_TYPE_POSE_STEP_ON; // 位置控制
goal_msg.data_length = POSE_DIMENSION;
goal_msg.frame_time_stamp = timeStamp;
goal_msg.command_id = commandId;
for (int i = 0; i < POSE_DIMENSION; ++i) {
@@ -389,9 +389,9 @@ void ArmKeyboardNode::SendDirectMovingGoal(const float *values, int armId)
int64_t timeStamp = get_clock()->now().nanoseconds();
auto goal_msg = ArmAction::Goal();
commandId++;
goal_msg.body_id.body_id = armId;
goal_msg.data_type.action_type = ARM_COMMAND_TYPE_POSE_DIRECT_MOVE; // 位置控制
goal_msg.data_length.data_length = POSE_DIMENSION;
goal_msg.body_id = armId;
goal_msg.data_type = ARM_COMMAND_TYPE_POSE_DIRECT_MOVE; // 位置控制
goal_msg.data_length = POSE_DIMENSION;
goal_msg.frame_time_stamp = timeStamp;
goal_msg.command_id = commandId;
for (int i = 0; i < POSE_DIMENSION; ++i) {
@@ -414,9 +414,9 @@ void ArmKeyboardNode::SendAngleMovingGoal(const float *values, int armId)
auto goal_msg = ArmAction::Goal();
commandId++;
RCLCPP_INFO(this->get_logger(), "SendAngleMovingGoal id=%ld", commandId);
goal_msg.body_id.body_id = armId;
goal_msg.data_type.action_type = ARM_COMMAND_TYPE_ANGLE_DIRECT_MOVE; // 位置控制
goal_msg.data_length.data_length = USED_ARM_DOF;
goal_msg.body_id = armId;
goal_msg.data_type = ARM_COMMAND_TYPE_ANGLE_DIRECT_MOVE; // 位置控制
goal_msg.data_length = USED_ARM_DOF;
goal_msg.frame_time_stamp = timeStamp;
goal_msg.command_id = commandId;
for (int i = 0; i < USED_ARM_DOF; ++i) {
@@ -648,8 +648,8 @@ void ArmKeyboardNode::SendDirectSteppingGoal(const char *command)
speedadd = -0.01;
}
goal_msg.data_type.action_type = ARM_COMMAND_TYPE_POSE_STEP_ON; // 位置控制
goal_msg.data_length.data_length = POSE_DIMENSION;
goal_msg.data_type = ARM_COMMAND_TYPE_POSE_STEP_ON; // 位置控制
goal_msg.data_length = POSE_DIMENSION;
goal_msg.command_id = commandId;
for (int i = 0; i < POSE_DIMENSION; ++i) {
if (command[directCommandMap[i]]) {
@@ -662,7 +662,7 @@ void ArmKeyboardNode::SendDirectSteppingGoal(const char *command)
if (command[12] && leftDirectCommand_!= commandValueBitMap) {
commandId++;
goal_msg.body_id.body_id = LEFT_ARM;
goal_msg.body_id = LEFT_ARM;
leftDirectCommand_ = commandValueBitMap;
if (leftArmGoalHandle_ != nullptr && leftCommandId_ != 0) {
RCLCPP_INFO(this->get_logger(), "cancel left arm goal. command id: %ld", leftCommandId_);
@@ -682,7 +682,7 @@ void ArmKeyboardNode::SendDirectSteppingGoal(const char *command)
}
} else if (command[13] && rightDirectCommand_!= commandValueBitMap) {
commandId++;
goal_msg.body_id.body_id = RIGHT_ARM;
goal_msg.body_id = RIGHT_ARM;
rightDirectCommand_ = commandValueBitMap;
if (rightArmGoalHandle_ != nullptr && rightCommandId_ != 0) {
RCLCPP_INFO(this->get_logger(), "cancel right arm goal. command id: %ld", rightCommandId_);
@@ -780,9 +780,9 @@ void ArmKeyboardNode::SendAngleSteppingGoal(const char *command) {
auto goal_msg = ArmAction::Goal();
commandId++;
leftCommandId_ = commandId;
goal_msg.body_id.body_id = LEFT_ARM;
goal_msg.data_type.action_type = ARM_COMMAND_TYPE_ANGLE_STEP_ON; // 位置控制
goal_msg.data_length.data_length = USED_ARM_DOF;
goal_msg.body_id = LEFT_ARM;
goal_msg.data_type = ARM_COMMAND_TYPE_ANGLE_STEP_ON; // 位置控制
goal_msg.data_length = USED_ARM_DOF;
goal_msg.command_id = commandId;
for (int i = 0; i < USED_ARM_DOF; ++i) {
goal_msg.data_array.push_back(leftArmAngleAim_[i]);
@@ -802,9 +802,9 @@ void ArmKeyboardNode::SendAngleSteppingGoal(const char *command) {
auto goal_msg = ArmAction::Goal();
commandId++;
rightCommandId_ = commandId;
goal_msg.body_id.body_id = RIGHT_ARM;
goal_msg.data_type.action_type = ARM_COMMAND_TYPE_ANGLE_STEP_ON; // 位置控制
goal_msg.data_length.data_length = USED_ARM_DOF;
goal_msg.body_id = RIGHT_ARM;
goal_msg.data_type = ARM_COMMAND_TYPE_ANGLE_STEP_ON; // 位置控制
goal_msg.data_length = USED_ARM_DOF;
goal_msg.command_id = commandId;
for (int i = 0; i < USED_ARM_DOF; ++i) {

View File

@@ -1,9 +1,7 @@
#ifndef ARM_DEFINE_H
#define ARM_DEFINE_H
#define USED_ARM_DOF (6)
#define GOAL_DATA_LENGTH (7)
#define USED_OTHER_DOF (17)
#include "arm_action_define.h"
#define MAX_ARM_GOAL_COUNT 16
#define MAX_TRAJECTORY_HISTORY 64
@@ -21,7 +19,7 @@
#define TRAJECTORY_ONGOING 0
#define TRAJECTORY_ERROR -1
typedef enum {
/*typedef enum {
ARM_COMMAND_TYPE_ANGLE_STEP_ON = 0,
ARM_COMMAND_TYPE_POSE_STEP_ON,
ARM_COMMAND_TYPE_ANGLE_DIRECT_MOVE,
@@ -45,13 +43,7 @@ typedef enum {
RIGHT_ARM,
ARM_ID_ERR
} ArmIdE;
typedef enum {
GOAL_TYPE_MOVING = 0,
GOAL_TYPE_STEPPING,
GOAL_TYPE_POSE_STEPPING,
GOAL_TYPE_ERROR
} GoalTypeE;
typedef enum {
OK = 0,
@@ -61,6 +53,13 @@ typedef enum {
ARM_AIM_CANNOT_REACH = -4,
ARM_NOW_NO_GOAL = -5,
ARM_GOAL_CANCELLED = -6,
} ErrCodeE;
} ErrCodeE;*/
typedef enum {
GOAL_TYPE_MOVING = 0,
GOAL_TYPE_STEPPING,
GOAL_TYPE_POSE_STEPPING,
GOAL_TYPE_ERROR
} GoalTypeE;
#endif // ARM_DEFINE_H

View File

@@ -10,6 +10,11 @@ if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
endif()
add_compile_options(-g)
# 全局设置 C++ 编译选项
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
# 全局设置 C 编译选项
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3")
set(ROS_DOMAIN_ID_STR $ENV{ROS_DOMAIN_ID})
if(NOT ROS_DOMAIN_ID_STR)
set(ROS_DOMAIN_ID_STR "0") # 未设置时默认 0
@@ -54,7 +59,6 @@ include_directories(
${EIGEN3_INCLUDE_DIRS} # 引入Eigen3的头文件路径
)
# 设置源文件
set(SOURCES
src/rm_arm_handler.cpp

View File

@@ -0,0 +1,97 @@
#ifndef COL_SIMULATOR_HPP
#define COL_SIMULATOR_HPP
#include <unordered_map>
#include <map>
#include <urdf_model/pose.h>
#include <std_msgs/msg/string.hpp>
#include "arm_define.h"
#include "arm_driver_define.hpp"
#include "gjk_interface.hpp"
#define COLLISION_CHECK_SIMPLE_CNT 2
typedef enum {
BODY_TYPE_LEFT_ARM = 0,
BODY_TYPE_RIGHT_ARM,
BODY_TYPE_OTHERS,
BODY_CNT
} BodyListE;
typedef enum {
FRAME_CHANGE_TYPE_ARM_BASE_TO_ORI,
FRAME_CHANGE_TYPE_ORI_TO_ARM_BASE,
FRAME_CHANGE_TYPE_ARM_END_TO_ORI,
FRAME_CHANGE_TYPE_ORI_TO_ARM_END,
FRAME_CHANGE_TYPE_ERR
} FrameChangeTypeE;
typedef std::vector<Eigen::Vector3d> Polyhedron;
struct JointInfo {
std::string name; // 关节名称
int type; // 关节类型
int parent_link; // 父连杆
int child_link; // 子连杆
Eigen::Quaterniond rotationAll;
Eigen::Vector3d axis; // 关节轴
Eigen::Vector3d offset; // 关节偏移
Eigen::Quaterniond rotation; // 关节旋转
double limit_lower;
double limit_upper;
double limit_v;
double limit_e;
double angle; // 关节角度
};
struct CollisionStructure {
std::string link_name; // 所属链接名称
std::string geometry_type; // 几何类型
std::vector<double> dimensions; // 几何尺寸/缩放因子
std::vector<double> origin_xyz; // 原点坐标
std::vector<double> origin_rpy; // 原点姿态
std::string mesh_filename; // mesh文件路径如STL
std::vector<double> mesh_bounds; // 网格边界盒 [min_x, max_x, min_y, max_y, min_z, max_z]
Polyhedron origin_points;
JointInfo *joint_list;
int joint_count;
};
class CollisionSimulator
{
public:
CollisionSimulator(std_msgs::msg::String::SharedPtr urdf_string_ptr, float **jointsList, KinematicsManager **trajectory);
CollisionSimulator(std::string urdf_string, float **jointsList, KinematicsManager **trajectory);
~CollisionSimulator();
int CheckCollision();
int UpdateCollisionForNewGoal(int bodyType);
int AddPolyhedron(int id, const Polyhedron& poly);
int RemovePolyhedron(int id);
private:
void InitCollisionSimulator(const urdf::Model &urdf_model, float **jointsList, KinematicsManager **trajectory);
int CheckJointsAngleLimit(float *joints, int bodyType);
int InitPolyhedrons(const urdf::Model &urdf_model);
void InitArmSinglePolyhedron(int index, Polyhedron *poly, Vector3d &origin, const Vector3d &offset, const Matrix3d &rotation);
void UpdatePolyhedrons(int startLinkIndex, int endLinkIndex, int simple, float *jointList);
std::pair<Eigen::Vector3d, Eigen::Matrix3d> GetBodyTransform(int startIndex);
void InitArmPolyhedronsList();
void UpdateArmPolyhedrons();
KinematicsManager *trajectory_[BODY_CNT];
std::vector<Polyhedron> polyhedrons_[COLLISION_CHECK_SIMPLE_CNT];
std::vector<OBB> addedOBBs_[COLLISION_CHECK_SIMPLE_CNT];
std::vector<CollisionStructure> collision_structures_;
std::vector<JointInfo> jointMap_;
int simpleUpdateIndex_;
float *joints_[COLLISION_CHECK_SIMPLE_CNT][BODY_CNT];
std::unordered_map<int, Polyhedron> addedPolyhedrons_;
};
#endif // COL_SIMULATOR_HPP

View File

@@ -0,0 +1,544 @@
#include <memory>
#include <vector>
#include <stack>
#include <string>
#include <rclcpp/rclcpp.hpp>
#include <moveit/robot_model/robot_model.h>
#include "col_simulator.hpp"
using namespace Eigen;
const int g_bodyLinkCnt[BODY_CNT] = {USED_ARM_DOF + 1, USED_ARM_DOF + 1, USED_OTHER_DOF + 1};
const int g_jointLinkCnt[BODY_CNT] = {USED_ARM_DOF, USED_ARM_DOF, USED_OTHER_DOF};
float g_leftArmJoints[COLLISION_CHECK_SIMPLE_CNT][USED_ARM_DOF] = {0};
float g_rightArmJoints[COLLISION_CHECK_SIMPLE_CNT][USED_ARM_DOF] = {0};
float g_otherJoints[COLLISION_CHECK_SIMPLE_CNT][USED_OTHER_DOF] = {0};
#define POLYHEDRONS_POINTS_CNT (8)
enum OriginBoxIndex {
LEFT_ARM_ORIGIN = 0,
LEFT_ARM_UPDATE_ORIGIN,
RIGHT_ARM_ORIGIN = g_bodyLinkCnt[BODY_TYPE_LEFT_ARM],
RIGHT_ARM_UPDATE_ORIGIN,
OTHER_ORIGIN = g_bodyLinkCnt[BODY_TYPE_LEFT_ARM] + g_bodyLinkCnt[BODY_TYPE_RIGHT_ARM],
BASE = g_bodyLinkCnt[BODY_TYPE_LEFT_ARM] + g_bodyLinkCnt[BODY_TYPE_RIGHT_ARM] + g_bodyLinkCnt[BODY_TYPE_OTHERS],
};
const int g_linkStartIndex[BODY_CNT + 1] = {
LEFT_ARM_UPDATE_ORIGIN,
RIGHT_ARM_UPDATE_ORIGIN,
OTHER_ORIGIN,
BASE
};
#define ROOT (BASE - 1)
bool g_linkCollisionDetecMatrix[OTHER_ORIGIN][BASE] = {false};
Vector3d g_origin[BASE] = {Vector3d::Zero()};
Vector3d g_offset[BASE] = {Vector3d::Zero()};
Vector3d g_dir[BASE] = {Vector3d::Zero()};
static double toRadians(float degrees) {
return (static_cast<double>(degrees)) * (M_PI / 180.0);
}
static int UpdateJointInfo(int i, int parent, Quaterniond &rotation, std::vector<JointInfo> &jointMap)
{
int key = (parent << 8) | (i % 256);
auto jointPair = jointMap.find(key);
if (jointPair == jointMap.end()) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "lose joint %d -> %d", parent, i);
return -1;
}
Vector3d position = rotation * jointPair->second.offset;
g_origin[i] = position;
rotation = rotation * jointPair->second.rotation;
jointPair->second.rotationAll = rotation;
Eigen::Vector3d axis = jointPair->second.axis;
g_dir[i] = rotation * axis;
return 0;
}
static int InitJoint(const urdf::Model &urdf_model, std::vector<JointInfo> &jointMap)
{
for (const auto& joint_pair : urdf_model.joints_) {
JointInfo jointInfo;
// joint_pair是一个键值对: 键为关节名称,值为关节指针
jointInfo.name = joint_pair.first;
urdf::JointConstSharedPtr joint = joint_pair.second;
jointInfo.type = joint->type;
jointInfo.parent_link = -1;
jointInfo.child_link = -1;
auto link = g_linkMap.find(joint->parent_link_name);
if (link != g_linkMap.end()) {
jointInfo.parent_link = link->second;
} else {
continue;
}
link = g_linkMap.find(joint->child_link_name);
if (link != g_linkMap.end()) {
jointInfo.child_link = link->second;
} else {
continue;
}
jointInfo.offset = Vector3d(joint->parent_to_joint_origin_transform.position.x,
joint->parent_to_joint_origin_transform.position.y,
joint->parent_to_joint_origin_transform.position.z);
jointInfo.rotation = Quaterniond(
joint->parent_to_joint_origin_transform.rotation.w,
joint->parent_to_joint_origin_transform.rotation.x,
joint->parent_to_joint_origin_transform.rotation.y,
joint->parent_to_joint_origin_transform.rotation.z);
if (joint->limits != NULL) {
jointInfo.limit_lower = joint->limits->lower;
jointInfo.limit_upper = joint->limits->upper;
jointInfo.limit_v = joint->limits->velocity;
jointInfo.limit_e = joint->limits->effort;
}
jointInfo.angle = 0;
jointInfo.axis = Vector3d(joint->axis.x, joint->axis.y, joint->axis.z);
int key = ((jointInfo.parent_link % 256) << 8) | (jointInfo.child_link % 256);
jointMap[key] = jointInfo;
}
Quaterniond rotation = Quaterniond::Identity();
int result = UpdateJointInfo(LEFT, BASE, rotation, jointMap);
if (result != 0) return -1;
for (int i = LEFT + 1; i < RIGHT; ++i) {
result = UpdateJointInfo(i, i - 1, rotation, jointMap);
if (result != 0) return -1;
}
rotation = Quaterniond::Identity();
result = UpdateJointInfo(RIGHT, BASE, rotation, jointMap);
if (result != 0) return -1;
for (int i = RIGHT + 1; i < BASE; ++i) {
result = UpdateJointInfo(i, i - 1, rotation, jointMap);
if (result != 0) return -1;
}
return 0;
}
int CollisionSimulator::InitPolyhedrons(const urdf::Model &urdf_model)
{
std::vector<CollisionStructure> collision_structures_temp;
InitJoint(urdf_model, jointMap_);
InitCollisionStructure(urdf_model, collision_structures_temp);
return RemakeCollisionStructureList(collision_structures_temp);
}
void CollisionSimulator::InitCollisionSimulator(const urdf::Model &urdf_model, float **jointsList, KinematicsManager **trajectory)
{
for (int i = 0; i < COLLISION_CHECK_SIMPLE_CNT; i++) {
joints_[i][BODY_TYPE_LEFT_ARM] = g_leftArmJoints[i];
joints_[i][BODY_TYPE_RIGHT_ARM] = g_rightArmJoints[i];
joints_[i][BODY_TYPE_OTHERS] = g_otherJoints[i];
for (int j = 0; j < BODY_CNT; j++) {
for (int k = 0; k < g_jointLinkCnt[j]; k++) {
joints_[i][j][k] = jointsList[j][k];
}
}
}
InitPolyhedrons(urdf_model);
InitArmPolyhedronsList();
UpdateArmPolyhedrons();
}
CollisionSimulator::CollisionSimulator(std::string urdf_string, float **jointsList, KinematicsManager **trajectory)
{
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "CollisionSimulator: 初始化机械臂碰撞检测模块...");
urdf::Model urdf_model;
simpleUpdateIndex_ = 0;
if (!urdf_model.initString(urdf_string)) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "无法解析URDF模型");
return;
}
InitCollisionSimulator(urdf_model, jointsList, trajectory);
}
CollisionSimulator::CollisionSimulator(std_msgs::msg::String::SharedPtr urdf_string_ptr, float **jointsList, KinematicsManager **trajectory)
{
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "CollisionSimulator: 初始化机械臂碰撞检测模块...");
std::string urdf_string = urdf_string_ptr->data;
// 解析URDF模型
urdf::Model urdf_model;
simpleUpdateIndex_ = 0;
if (!urdf_model.initString(urdf_string)) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "无法解析URDF模型");
return;
}
InitCollisionSimulator(urdf_model, jointsList, trajectory);
}
void CollisionSimulator::InitArmSinglePolyhedron(int index, Polyhedron *poly,
Vector3d &origin, const Vector3d &offset, const Matrix3d &rotation)
{
float length = collision_structures_[index].dimensions[0]; // 长度沿u方向
float width = collision_structures_[index].dimensions[1]; // 宽度沿v方向
float height = collision_structures_[index].dimensions[2]; // 高度(沿法向量方向)
Vector3d lenVec = rotation * Vector3d(length, 0, 0); // 长度方向
Vector3d widVec = rotation * Vector3d(0, width, 0); // 宽度方向
Vector3d heiVec = rotation * Vector3d(0, 0, height); // 高度方向
Vector3d bottomLeft = rotation * offset + origin;
(*poly)[0] = bottomLeft;
(*poly)[1] = bottomLeft + lenVec;
(*poly)[2] = bottomLeft + widVec;
(*poly)[3] = (*poly)[1] + widVec;
(*poly)[4] = bottomLeft + heiVec;
(*poly)[5] = (*poly)[1] + heiVec;
(*poly)[6] = (*poly)[2] + heiVec;
(*poly)[7] = (*poly)[3] + heiVec;
if (index < BASE - 1) {
origin = origin + rotation * g_origin[index + 1];
}
}
static int CheckCollisionInner(std::vector<OBB> *addedOBBs, std::vector<OBB> *addedOBBsNext_)
{
for (int i = g_linkStartIndex[LEFT_ARM_ORIGIN]; i < g_linkStartIndex[OTHER_ORIGIN]; ++i) {
for (int j = i + 1; j < BASE; ++j) {
if (!g_linkCollisionDetecMatrix[i][j]) {
continue;
}
bool inCollision = gjk_interface::checkOBBCollision((*addedOBBsNext_)[i], (*addedOBBsNext_)[j]);
if (inCollision) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "dect left %d and %d collision b", i, j);
return ARM_COLLISION;
}
inCollision = gjk_interface::checkOBBCollision((*addedOBBs)[i], (*addedOBBsNext_)[j]);
if (inCollision) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "dect left %d and %d collision c", i, j);
return ARM_COLLISION;
}
}
}
return OK;
}
std::pair<Vector3d, Matrix3d> CollisionSimulator::GetBodyTransform(int startIndex)
{
Vector3d offset_vec;
Matrix3d rotation = Matrix3d::Identity();
std::stack <int> indexStack;
int bodyIndex = startIndex;
while (bodyIndex != ROOT) {
indexStack.push(bodyIndex);
bodyIndex = jointMap_[bodyIndex].parent_link;
}
while (!indexStack.empty()) {
int currentIndex = indexStack.top();
indexStack.pop();
if (jointMap_[currentIndex].type == urdf::Joint::FIXED) {
offset_vec = offset_vec + rotation * g_origin[currentIndex];
} else if (jointMap_[currentIndex].type == urdf::Joint::REVOLUTE) {
double angleRad = toRadians(jointMap_[currentIndex].angle);
rotation = AngleAxisd(angleRad, rotation * g_dir[currentIndex]) * rotation;
offset_vec = offset_vec + rotation * g_origin[currentIndex];
} else if (jointMap_[currentIndex].type == urdf::Joint::PRISMATIC) {
double displacement = jointMap_[currentIndex].angle;
offset_vec = offset_vec + rotation * (g_origin[currentIndex] + g_dir[currentIndex] * displacement);
}
}
return { offset_vec, rotation };
}
void CollisionSimulator::UpdatePolyhedrons(int startLinkIndex, int endLinkIndex, int simple, float *jointList)
{
std::vector<Polyhedron> *armPolyhedrons = &(polyhedrons_[simple]);
auto [offset_vec, rotation] = GetBodyTransform(startLinkIndex);
for (int i = startLinkIndex + 1; i < endLinkIndex; i++) {
double angleRad = toRadians(jointList[i - startLinkIndex - 1]);
rotation = AngleAxisd(angleRad, rotation * g_dir[i]) * rotation;
InitArmSinglePolyhedron(i, &(*armPolyhedrons)[i],
offset_vec,
g_offset[i],
rotation);
addedOBBs_[simple][i] = gjk_interface::createOBBFromVertices((*armPolyhedrons)[i],
collision_structures_[i].dimensions[0],
collision_structures_[i].dimensions[1],
collision_structures_[i].dimensions[2]);
}
}
void CollisionSimulator::InitArmPolyhedronsList()
{
for (int i = 0; i < COLLISION_CHECK_SIMPLE_CNT; i++) {
polyhedrons_[i].resize(BASE);
addedOBBs_[i].resize(BASE);
polyhedrons_[i][BASE].clear();
}
/*RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "origin:");
for (int i = 0; i < BASE; ++i) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "%d: %.4f %.4f %.4f", i, g_origin[i].x(), g_origin[i].y(), g_origin[i].z());
}
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "offset:");
for (int i = 0; i < BASE; ++i) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "%d: %.4f %.4f %.4f", i, g_offset[i].x(), g_offset[i].y(), g_offset[i].z());
}*/
for (int simple = 0; simple < COLLISION_CHECK_SIMPLE_CNT; simple++) {
for (int i = 0; i < BASE; i++) {
for (int j = 0; j < POLYHEDRONS_POINTS_CNT; j++) {
polyhedrons_[simple][i].push_back(Vector3d(0, 0, 0));
}
}
}
for (int simple = 0; simple < COLLISION_CHECK_SIMPLE_CNT; simple++) {
std::vector<Polyhedron> *armPolyhedrons = &(polyhedrons_[simple]);
Vector3d offset_temp = {0, 0 ,0};
Vector3d origin_point_offset = {0, 0 ,0};
if (collision_structures_[ROOT].geometry_type == "box") {
origin_point_offset = Vector3d(-collision_structures_[ROOT].dimensions[0] / 2,
-collision_structures_[ROOT].dimensions[1] / 2,
-collision_structures_[ROOT].dimensions[2] / 2);
} else if (collision_structures_[ROOT].geometry_type == "mesh") {
origin_point_offset = Vector3d(collision_structures_[ROOT].mesh_bounds[0],
collision_structures_[ROOT].mesh_bounds[2],
collision_structures_[ROOT].mesh_bounds[4]);
}
Matrix3d rotation = Matrix3d::Identity();
InitArmSinglePolyhedron(ROOT, &(*armPolyhedrons)[ROOT],
offset_temp,
origin_point_offset,
rotation);
addedOBBs_[simple][ROOT] = gjk_interface::createOBBFromVertices((*armPolyhedrons)[ROOT],
collision_structures_[ROOT].dimensions[0],
collision_structures_[ROOT].dimensions[1],
collision_structures_[ROOT].dimensions[2]);
Vector3d offset_vec = g_origin[LEFT];
for (int i = LEFT; i < RIGHT; i++) {
InitArmSinglePolyhedron(i, &(*armPolyhedrons)[i],
offset_vec,
g_offset[i],
rotation);
addedOBBs_[simple][i] = gjk_interface::createOBBFromVertices((*armPolyhedrons)[i],
collision_structures_[i].dimensions[0],
collision_structures_[i].dimensions[1],
collision_structures_[i].dimensions[2]);
}
offset_vec = g_origin[RIGHT];
for (int i = RIGHT; i < BASE; i++) {
InitArmSinglePolyhedron(i, &(*armPolyhedrons)[i],
offset_vec,
g_offset[i],
rotation);
addedOBBs_[simple][i] = gjk_interface::createOBBFromVertices((*armPolyhedrons)[i],
collision_structures_[i].dimensions[0],
collision_structures_[i].dimensions[1],
collision_structures_[i].dimensions[2]);
}
}
for (int i = LEFT_ARM_ORIGIN; i < BASE; ++i) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "Link %d polyhedron points:", i);
for (int j = 0; j < POLYHEDRONS_POINTS_CNT; ++j) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "%d: %.4f %.4f %.4f", j,
polyhedrons_[0][i][j].x(),
polyhedrons_[0][i][j].y(),
polyhedrons_[0][i][j].z());
}
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "---------------------");
}
}
void CollisionSimulator::UpdateArmPolyhedrons()
{
std::vector<Polyhedron> *armPolyhedrons = &(polyhedrons_[simpleUpdateIndex_]);
UpdatePolyhedrons(LEFT_ARM_UPDATE_ORIGIN, RIGHT_ARM_ORIGIN, simpleUpdateIndex_,
joints_[simpleUpdateIndex_][BODY_TYPE_LEFT_ARM]);
UpdatePolyhedrons(RIGHT_ARM_UPDATE_ORIGIN, OTHER_ORIGIN, simpleUpdateIndex_,
joints_[simpleUpdateIndex_][BODY_TYPE_RIGHT_ARM]);
/*for (int i = LEFT; i <= BASE; ++i) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "Link %d polyhedron points:", i);
for (int j = 0; j < POLYHEDRONS_POINTS_CNT; ++j) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "%d: %.4f %.4f %.4f", j,
polyhedrons_[0][i][j].x(),
polyhedrons_[0][i][j].y(),
polyhedrons_[0][i][j].z());
}
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "---------------------");
}
for (int i = LEFT; i <= BASE; i++) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "OBB: center(%.4f, %.4f, %.4f), axis1(%.4f, %.4f, %.4f), axis2(%.4f, %.4f, %.4f), axis3(%.4f, %.4f, %.4f), "
"half_length(%.4f, %.4f, %.4f)",
addedOBBs_[simple][i].center.x(),
addedOBBs_[simple][i].center.y(),
addedOBBs_[simple][i].center.z(),
addedOBBs_[simple][i].axis[0].x(),
addedOBBs_[simple][i].axis[0].y(),
addedOBBs_[simple][i].axis[0].z(),
addedOBBs_[simple][i].axis[1].x(),
addedOBBs_[simple][i].axis[1].y(),
addedOBBs_[simple][i].axis[1].z(),
addedOBBs_[simple][i].axis[2].x(),
addedOBBs_[simple][i].axis[2].y(),
addedOBBs_[simple][i].axis[2].z(),
addedOBBs_[simple][i].halfExtent[0],
addedOBBs_[simple][i].halfExtent[1],
addedOBBs_[simple][i].halfExtent[2]);
}
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "left joints: %.2f, %.2f, %.2f, %.2f, %.2f, %.2f",
leftArmJoints_[simple][0],
leftArmJoints_[simple][1],
leftArmJoints_[simple][2],
leftArmJoints_[simple][3],
leftArmJoints_[simple][4],
leftArmJoints_[simple][5]);*/
}
int CollisionSimulator::AddPolyhedron(int id, const Polyhedron& poly)
{
if (addedPolyhedrons_.find(id) != addedPolyhedrons_.end()) {
return -1; // 已存在相同ID的多面体
}
addedPolyhedrons_[id] = poly;
return 0; // 成功添加
}
int CollisionSimulator::RemovePolyhedron(int id)
{
auto it = addedPolyhedrons_.find(id);
if (it != addedPolyhedrons_.end()) {
addedPolyhedrons_.erase(it);
return 0; // 成功移除
}
return -1; // 未找到对应ID的多面体
}
int CollisionSimulator::CheckJointsAngleLimit(float *joints, int bodyType)
{
for (int i = 0; i < g_jointLinkCnt[bodyType]; ++i) {
JointInfo *joint = &(jointMap_[g_linkStartIndex[bodyType] + i]);
float angle = toRadians(joints[i]);
if (angle < joint->limit_lower || angle > joint->limit_upper) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()),
"CheckJointsAngleLimit: joint out of limit [%.4f, %.4f], current: %.4f(%.2f)",
joint->limit_lower, joint->limit_upper, angle, joints[i]);
return ARM_AIM_CANNOT_REACH;
}
}
return 0;
}
int CollisionSimulator::UpdateCollisionForNewGoal(int bodyType)
{
if (bodyType >= ARM_ID_ERR) return -1;
int simple20 = (simpleUpdateIndex_ + 1) % COLLISION_CHECK_SIMPLE_CNT;
int simple40 = (simple20 + 1) % COLLISION_CHECK_SIMPLE_CNT;
int startLinkIndex = g_linkStartIndex[bodyType], endLinkIndex = startLinkIndex + g_jointLinkCnt[bodyType];
KinematicsManager *trajectory = trajectory_[bodyType];
float *jointList20 = joints_[simple20][bodyType];
float *jointList40 = joints_[simple40][bodyType];
trajectory->getAngleForStarting(jointList20);
trajectory->getAngleForChecking(jointList40);
if (CheckJointsAngleLimit(jointList20, bodyType) != 0 || CheckJointsAngleLimit(jointList40, bodyType) != 0) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "AngleDirectMove joints limit error.");
return ARM_AIM_CANNOT_REACH;
}
UpdatePolyhedrons(startLinkIndex, endLinkIndex, simple20, jointList20);
std::vector<OBB> *addedOBBsNext_ = &(addedOBBs_[simple20]);
std::vector<OBB> *addedOBBs = &(addedOBBs_[simpleUpdateIndex_]);
int result = CheckCollisionInner(addedOBBs, addedOBBsNext_);
if (result != OK) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "UpdateCollisionForNewGoal: bodyType %d collision", bodyType);
return result;
}
UpdatePolyhedrons(startLinkIndex, endLinkIndex, simple40, jointList40);
addedOBBsNext_ = &(addedOBBs_[simple40]);
addedOBBs = &(addedOBBs_[simple20]);
result = CheckCollisionInner(addedOBBs, addedOBBsNext_);
if (result != OK) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "UpdateCollisionForNewGoal: bodyType %d collision", bodyType);
return result;
}
return 0;
}
#include <rclcpp/rclcpp.hpp>
#include <moveit/planning_scene/planning_scene.h>
#include <moveit/robot_model_loader/robot_model_loader.h>
#include <moveit/collision_detection/collision_common.h>
int main(int argc, char**argv) {
// 初始化 ROS 节点
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("moveit_collision_demo");
// --------------------------
// 步骤1加载机器人模型创建 PlanningScene
// --------------------------
// 加载机器人模型(需在 launch 文件中加载 URDF 和 SRDF
robot_model_loader::RobotModelLoader robot_model_loader(node, "robot_description");
const moveit::core::RobotModelPtr& robot_model = robot_model_loader.getModel();
// 创建 PlanningScene管理碰撞环境
planning_scene::PlanningScene planning_scene(robot_model);
// --------------------------
// 步骤3定义机器人姿态待检测的状态
// --------------------------
moveit::core::RobotState& robot_state = planning_scene.getCurrentStateNonConst();
const moveit::core::JointModelGroup* joint_model_group = robot_state.getJointModelGroup("panda_arm"); // 机械臂组名称(需替换为你的机器人)
// 设置关节角度示例Panda 机械臂的一个姿态)
std::vector<double> joint_values = {0.0, 0.5, 0.0, -1.5, 0.0, 1.0, 0.0};
robot_state.setJointGroupPositions(joint_model_group, joint_values);
robot_state.update(); // 更新机器人状态
// --------------------------
// 步骤4调用碰撞检测接口
// --------------------------
// 定义碰撞检测请求(设置需要的结果类型)
collision_detection::CollisionRequest collision_request;
collision_request.contacts = true; // 是否返回接触信息(如碰撞点、法向量)
collision_request.max_contacts = 10; // 最大返回接触对数量
collision_request.max_contacts_per_pair = 3; // 每对碰撞体的最大接触点数量
collision_request.verbose = false; // 是否输出详细信息
// 存储碰撞检测结果
collision_detection::CollisionResult collision_result;
// 执行碰撞检测(检测机器人当前状态是否碰撞)
planning_scene.checkCollision(collision_request, collision_result);
// --------------------------
// 步骤5处理碰撞结果
// --------------------------
if (collision_result.collision) {
RCLCPP_WARN(node->get_logger(), "检测到碰撞!");
// 输出碰撞对信息(机器人关节/链接与障碍物的碰撞)
for (const auto& contact : collision_result.contacts) {
RCLCPP_INFO(node->get_logger(), "碰撞对: %s 与 %s",
contact.first.first.c_str(), // 第一个碰撞体ID
contact.first.second.c_str()); // 第二个碰撞体ID
}
} else {
RCLCPP_INFO(node->get_logger(), "未检测到碰撞。");
}
// 关闭节点
rclcpp::shutdown();
return 0;
}

View File

@@ -48,7 +48,8 @@ static std::map<std::string, int> g_linkMap = {
{"RightLink4", 11},
{"RightLink5", 12},
{"RightLink6", 13},
{"body_2_link", 14}
{"body_2_link", 14},
{"left_behind_hip_link", 15}
};
enum OriginBoxIndex {

View File

@@ -13,7 +13,7 @@ namespace ArmCommandHash
static int AngleStepOn(RmArmHandler *handle, const ArmGoalSharedPtr goal)
{
if (goal->data_length.data_length != USED_ARM_DOF) {
if (goal->data_length != USED_ARM_DOF) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "AngleStepOn data length error.");
return -1;
}
@@ -30,7 +30,7 @@ namespace ArmCommandHash
static int AngleDirectMove(RmArmHandler *handle, std::shared_ptr<const ArmAction::Goal> goal)
{
if (goal->data_length.data_length != USED_ARM_DOF) {
if (goal->data_length != USED_ARM_DOF) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "AngleDirectMove data length error.");
return -1;
}
@@ -48,7 +48,7 @@ namespace ArmCommandHash
static int PoseStepOn(RmArmHandler *handle, std::shared_ptr<const ArmAction::Goal> goal)
{
if (goal->data_length.data_length != POSE_DIMENSION) {
if (goal->data_length != POSE_DIMENSION) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "PoseStepOn data length error.");
return -1;
}
@@ -61,7 +61,7 @@ namespace ArmCommandHash
static int PoseDirectMove(RmArmHandler *handle, std::shared_ptr<const ArmAction::Goal> goal)
{
if (goal->data_length.data_length != POSE_DIMENSION) {
if (goal->data_length != POSE_DIMENSION) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "PoseDirectMove data length error.");
return -1;
}
@@ -193,11 +193,11 @@ rclcpp_action::GoalResponse RmArmNode::ArmActionGoal(
{
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "Received goal request.");
// Accept the goal
if (ArmCommandHash::armCommandMap.find(goal->data_type.action_type) == ArmCommandHash::armCommandMap.end()) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "Received goal with invalid command id: %d", goal->data_type.action_type);
if (ArmCommandHash::armCommandMap.find(goal->data_type) == ArmCommandHash::armCommandMap.end()) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "Received goal with invalid command id: %d", goal->data_type);
return rclcpp_action::GoalResponse::REJECT;
}
RmArmHandler *handle = GetArmHandler(this, goal->body_id.body_id);
RmArmHandler *handle = GetArmHandler(this, goal->body_id);
if (handle == NULL) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "arm validation error.");
return rclcpp_action::GoalResponse::REJECT;
@@ -206,7 +206,7 @@ rclcpp_action::GoalResponse RmArmNode::ArmActionGoal(
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "Arm in error status.");
return rclcpp_action::GoalResponse::REJECT;
}
int result = ArmCommandHash::armCommandMap.at(goal->data_type.action_type)(handle, goal);
int result = ArmCommandHash::armCommandMap.at(goal->data_type)(handle, goal);
if (result != 0) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "Failed to process the goal.");
return rclcpp_action::GoalResponse::REJECT;
@@ -221,7 +221,7 @@ rclcpp_action::CancelResponse RmArmNode::ArmActionCancel(
int64_t index = goal->command_id;
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "Received request to cancel goal. Index: %ld", index);
int result = 0;
RmArmHandler *handle = GetArmHandler(this, goal->body_id.body_id);
RmArmHandler *handle = GetArmHandler(this, goal->body_id);
if (handle == NULL) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "arm validation error.");
return rclcpp_action::CancelResponse::REJECT;
@@ -250,7 +250,7 @@ void RmArmNode::ArmActionFeedback(int coll)
for (auto it = goal_handles_.begin(); it != goal_handles_.end(); ++it) {
auto goal_handle = it->second;
ArmGoalSharedPtr goal = goal_handle->get_goal();
RmArmHandler *handle = GetArmHandler(this, goal->body_id.body_id);
RmArmHandler *handle = GetArmHandler(this, goal->body_id);
if (handle == NULL) {
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "arm validation error.");
continue;
@@ -259,12 +259,12 @@ void RmArmNode::ArmActionFeedback(int coll)
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "Arm in error status.");
continue;
}
float *pose = (goal->body_id.body_id == LEFT_ARM) ? leftPose : rightPose;
float *pose = (goal->body_id == LEFT_ARM) ? leftPose : rightPose;
auto feedback = std::make_shared<ArmAction::Feedback>();
feedback->command_id = goal->command_id;
feedback->int_lenth = 1;
feedback->float_length.data_length = POSE_DIMENSION;
feedback->float_length = POSE_DIMENSION;
feedback->int_data_array = {coll};
feedback->float_data_array = {pose[0], pose[1], pose[2], pose[3], pose[4], pose[5], pose[6]};
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "Publishing feedback for command id: %ld, joints: %f, %f, %f, %f, %f, %f, %f",
@@ -283,7 +283,7 @@ void RmArmNode::ArmActionFinish(int64_t index, int result)
auto goal_handle = goal_handle_pair->second;
auto goalResult = std::make_shared<ArmAction::Result>();
float pose[POSE_DIMENSION] = {0};
RmArmHandler *handle = GetArmHandler(this, goal_handle->get_goal()->body_id.body_id);
RmArmHandler *handle = GetArmHandler(this, goal_handle->get_goal()->body_id);
RCLCPP_INFO(rclcpp::get_logger(GET_FUNC_LINE_STR()), "Finishing goal joints: %f, %f, %f, %f, %f, %f",
handle->nowJoints_[0], handle->nowJoints_[1], handle->nowJoints_[2],
handle->nowJoints_[3], handle->nowJoints_[4], handle->nowJoints_[5]);
@@ -291,7 +291,7 @@ void RmArmNode::ArmActionFinish(int64_t index, int result)
handle->trapezoidalTrajectory_->armKinematics_->ForwardKinematics(handle->nowJoints_, pose);
}
goalResult->end_time = endColTime.nanoseconds();
goalResult->result.result = result;
goalResult->result = result;
goalResult->command_id = index;
goalResult->pose.position.x = pose[POSE_POSITION_X];
goalResult->pose.position.y = pose[POSE_POSITION_Y];

View File

@@ -0,0 +1,460 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--This does not replace URDF, and is not an extension of URDF.
This is a format for representing semantic information about the robot structure.
A URDF file must exist for this robot as well, where the joints and the links that are referenced are defined
-->
<robot name="FHrobot">
<!--GROUPS: Representation of a set of joints and links. This can be useful for specifying DOF to plan for, defining arms, end effectors, etc-->
<!--LINKS: When a link is specified, the parent joint of that link (if it exists) is automatically included-->
<!--JOINTS: When a joint is specified, the child link of that joint (which will always exist) is automatically included-->
<!--CHAINS: When a chain is specified, all the links along the chain (including endpoints) are included in the group. Additionally, all the joints that are parents to included links are also included. This means that joints along the chain and the parent joint of the base link are included in the group-->
<!--SUBGROUPS: Groups can also be formed by referencing to already defined group names-->
<group name="LeftArm">
<link name="body_2_link"/>
<link name="base_link_leftarm"/>
<link name="LeftLink1"/>
<link name="LeftLink2"/>
<link name="LeftLink3"/>
<link name="LeftLink4"/>
<link name="LeftLink5"/>
<link name="LeftLink6"/>
<joint name="left_arm_base_joint"/>
<joint name="left_joint1"/>
<joint name="left_joint2"/>
<joint name="left_joint3"/>
<joint name="left_joint4"/>
<joint name="left_joint5"/>
<joint name="left_joint6"/>
<chain base_link="body_2_link" tip_link="LeftLink6"/>
</group>
<group name="RightArm">
<link name="body_2_link"/>
<link name="base_link_rightarm"/>
<link name="RightLink1"/>
<link name="RightLink2"/>
<link name="RightLink3"/>
<link name="RightLink4"/>
<link name="RightLink5"/>
<link name="RightLink6"/>
<joint name="right_arm_base_joint"/>
<joint name="right_joint1"/>
<joint name="right_joint2"/>
<joint name="right_joint3"/>
<joint name="right_joint4"/>
<joint name="right_joint5"/>
<joint name="right_joint6"/>
<chain base_link="body_2_link" tip_link="RightLink6"/>
</group>
<!--GROUP STATES: Purpose: Define a named state for a particular group, in terms of joint values. This is useful to define states like 'folded arms'-->
<group_state name="LeftZero" group="LeftArm">
<joint name="body_2_joint" value="0"/>
<joint name="left_joint1" value="0"/>
<joint name="left_joint2" value="0"/>
<joint name="left_joint3" value="0"/>
<joint name="left_joint4" value="0"/>
<joint name="left_joint5" value="0"/>
<joint name="left_joint6" value="0"/>
</group_state>
<group_state name="RightZero" group="RightArm">
<joint name="body_2_joint" value="0"/>
<joint name="right_joint1" value="0"/>
<joint name="right_joint2" value="0"/>
<joint name="right_joint3" value="0"/>
<joint name="right_joint4" value="0"/>
<joint name="right_joint5" value="0"/>
<joint name="right_joint6" value="0"/>
</group_state>
<!--VIRTUAL JOINT: Purpose: this element defines a virtual joint between a robot link and an external frame of reference (considered fixed with respect to the robot)-->
<virtual_joint name="base_joint_to_world" type="fixed" parent_frame="world" child_link="base_link"/>
<!--DISABLE COLLISIONS: By default it is assumed that any link of the robot could potentially come into collision with any other link in the robot. This tag disables collision checking between a specified pair of links. -->
<disable_collisions link1="LeftLink1" link2="LeftLink2" reason="Adjacent"/>
<disable_collisions link1="LeftLink1" link2="LeftLink3" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="LeftLink4" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="RightLink1" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="RightLink2" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="RightLink3" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="RightLink4" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="base_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="base_link_leftarm" reason="Adjacent"/>
<disable_collisions link1="LeftLink1" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="body_2_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="body_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="head_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="LeftLink3" reason="Adjacent"/>
<disable_collisions link1="LeftLink2" link2="LeftLink4" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="RightLink1" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="RightLink2" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="RightLink3" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="base_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="base_link_leftarm" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="body_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="LeftLink4" reason="Adjacent"/>
<disable_collisions link1="LeftLink3" link2="LeftLink5" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="LeftLink6" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="RightLink1" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="RightLink2" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="RightLink3" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="base_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="base_link_leftarm" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="body_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="LeftLink5" reason="Adjacent"/>
<disable_collisions link1="LeftLink4" link2="LeftLink6" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="RightLink1" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="LeftLink6" reason="Adjacent"/>
<disable_collisions link1="LeftLink5" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="RightLink2" reason="Adjacent"/>
<disable_collisions link1="RightLink1" link2="RightLink3" reason="Never"/>
<disable_collisions link1="RightLink1" link2="RightLink4" reason="Never"/>
<disable_collisions link1="RightLink1" link2="base_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="base_link_leftarm" reason="Never"/>
<disable_collisions link1="RightLink1" link2="base_link_rightarm" reason="Adjacent"/>
<disable_collisions link1="RightLink1" link2="body_2_link" reason="Default"/>
<disable_collisions link1="RightLink1" link2="body_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="head_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="RightLink3" reason="Adjacent"/>
<disable_collisions link1="RightLink2" link2="RightLink4" reason="Never"/>
<disable_collisions link1="RightLink2" link2="base_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="base_link_leftarm" reason="Never"/>
<disable_collisions link1="RightLink2" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="RightLink2" link2="body_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="RightLink4" reason="Adjacent"/>
<disable_collisions link1="RightLink3" link2="RightLink5" reason="Never"/>
<disable_collisions link1="RightLink3" link2="RightLink6" reason="Never"/>
<disable_collisions link1="RightLink3" link2="base_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="base_link_leftarm" reason="Never"/>
<disable_collisions link1="RightLink3" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="RightLink3" link2="body_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="RightLink5" reason="Adjacent"/>
<disable_collisions link1="RightLink4" link2="RightLink6" reason="Never"/>
<disable_collisions link1="RightLink4" link2="base_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="RightLink6" reason="Adjacent"/>
<disable_collisions link1="RightLink5" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="base_link" link2="base_link_leftarm" reason="Never"/>
<disable_collisions link1="base_link" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="base_link" link2="body_2_link" reason="Never"/>
<disable_collisions link1="base_link" link2="body_link" reason="Adjacent"/>
<disable_collisions link1="base_link" link2="head_link" reason="Never"/>
<disable_collisions link1="base_link" link2="left_behind_hip_link" reason="Adjacent"/>
<disable_collisions link1="base_link" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="base_link" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="base_link" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="base_link" link2="left_front_roll_link" reason="Adjacent"/>
<disable_collisions link1="base_link" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="base_link" link2="right_behind_hip_link" reason="Adjacent"/>
<disable_collisions link1="base_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="base_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="base_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="base_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="base_link" link2="right_front_roll_link" reason="Adjacent"/>
<disable_collisions link1="base_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="body_2_link" reason="Adjacent"/>
<disable_collisions link1="base_link_leftarm" link2="body_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="head_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="body_2_link" reason="Adjacent"/>
<disable_collisions link1="base_link_rightarm" link2="body_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="head_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="body_link" reason="Adjacent"/>
<disable_collisions link1="body_2_link" link2="head_link" reason="Adjacent"/>
<disable_collisions link1="body_2_link" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="body_link" link2="head_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="left_behind_leg_link" reason="Adjacent"/>
<disable_collisions link1="left_behind_hip_link" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="left_behind_wheel_link" reason="Adjacent"/>
<disable_collisions link1="left_behind_leg_link" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="left_front_knee_link" reason="Adjacent"/>
<disable_collisions link1="left_front_hip_link" link2="left_front_roll_link" reason="Adjacent"/>
<disable_collisions link1="left_front_hip_link" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="left_front_wheel_link" reason="Adjacent"/>
<disable_collisions link1="left_front_knee_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="right_behind_hip_link" link2="right_behind_leg_link" reason="Adjacent"/>
<disable_collisions link1="right_behind_hip_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="right_behind_hip_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="right_behind_hip_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="right_behind_leg_link" link2="right_behind_wheel_link" reason="Adjacent"/>
<disable_collisions link1="right_behind_leg_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="right_behind_leg_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="right_behind_wheel_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="right_behind_wheel_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="right_front_hip_link" link2="right_front_knee_link" reason="Adjacent"/>
<disable_collisions link1="right_front_hip_link" link2="right_front_roll_link" reason="Adjacent"/>
<disable_collisions link1="right_front_hip_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="right_front_knee_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="right_front_knee_link" link2="right_front_wheel_link" reason="Adjacent"/>
<disable_collisions link1="right_front_roll_link" link2="right_front_wheel_link" reason="Never"/>
</robot>

25
srdf/.setup_assistant Normal file
View File

@@ -0,0 +1,25 @@
moveit_setup_assistant_config:
urdf:
package: rm_arm_control
relative_path: urdf/FHrobot.urdf
srdf:
relative_path: config/FHrobot.srdf
package_settings:
author_name: zj
author_email: zj@zj.com
generated_timestamp: 1761287950
control_xacro:
command:
- position
state:
- position
- velocity
modified_urdf:
xacros:
- control_xacro
control_xacro:
command:
- position
state:
- position
- velocity

16
srdf/CMakeLists.txt Normal file
View File

@@ -0,0 +1,16 @@
cmake_minimum_required(VERSION 3.22)
project(srdf)
find_package(ament_cmake REQUIRED)
ament_package()
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/launch")
install(
DIRECTORY launch
DESTINATION share/${PROJECT_NAME}
PATTERN "setup_assistant.launch" EXCLUDE)
endif()
install(DIRECTORY config DESTINATION share/${PROJECT_NAME})
install(FILES .setup_assistant DESTINATION share/${PROJECT_NAME})

View File

@@ -0,0 +1,105 @@
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:macro name="FHrobot_ros2_control" params="name initial_positions_file">
<xacro:property name="initial_positions" value="${load_yaml(initial_positions_file)['initial_positions']}"/>
<ros2_control name="${name}" type="system">
<hardware>
<!-- By default, set up controllers for simulation. This won't work on real hardware -->
<plugin>mock_components/GenericSystem</plugin>
</hardware>
<joint name="body_2_joint">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">${initial_positions['body_2_joint']}</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="left_joint1">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">${initial_positions['left_joint1']}</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="left_joint2">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">${initial_positions['left_joint2']}</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="left_joint3">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">${initial_positions['left_joint3']}</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="left_joint4">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">${initial_positions['left_joint4']}</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="left_joint5">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">${initial_positions['left_joint5']}</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="left_joint6">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">${initial_positions['left_joint6']}</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="right_joint1">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">${initial_positions['right_joint1']}</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="right_joint2">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">${initial_positions['right_joint2']}</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="right_joint3">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">${initial_positions['right_joint3']}</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="right_joint4">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">${initial_positions['right_joint4']}</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="right_joint5">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">${initial_positions['right_joint5']}</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="right_joint6">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">${initial_positions['right_joint6']}</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
</ros2_control>
</xacro:macro>
</robot>

460
srdf/config/FHrobot.srdf Normal file
View File

@@ -0,0 +1,460 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--This does not replace URDF, and is not an extension of URDF.
This is a format for representing semantic information about the robot structure.
A URDF file must exist for this robot as well, where the joints and the links that are referenced are defined
-->
<robot name="FHrobot">
<!--GROUPS: Representation of a set of joints and links. This can be useful for specifying DOF to plan for, defining arms, end effectors, etc-->
<!--LINKS: When a link is specified, the parent joint of that link (if it exists) is automatically included-->
<!--JOINTS: When a joint is specified, the child link of that joint (which will always exist) is automatically included-->
<!--CHAINS: When a chain is specified, all the links along the chain (including endpoints) are included in the group. Additionally, all the joints that are parents to included links are also included. This means that joints along the chain and the parent joint of the base link are included in the group-->
<!--SUBGROUPS: Groups can also be formed by referencing to already defined group names-->
<group name="LeftArm">
<link name="body_2_link"/>
<link name="base_link_leftarm"/>
<link name="LeftLink1"/>
<link name="LeftLink2"/>
<link name="LeftLink3"/>
<link name="LeftLink4"/>
<link name="LeftLink5"/>
<link name="LeftLink6"/>
<joint name="left_arm_base_joint"/>
<joint name="left_joint1"/>
<joint name="left_joint2"/>
<joint name="left_joint3"/>
<joint name="left_joint4"/>
<joint name="left_joint5"/>
<joint name="left_joint6"/>
<chain base_link="body_2_link" tip_link="LeftLink6"/>
</group>
<group name="RightArm">
<link name="body_2_link"/>
<link name="base_link_rightarm"/>
<link name="RightLink1"/>
<link name="RightLink2"/>
<link name="RightLink3"/>
<link name="RightLink4"/>
<link name="RightLink5"/>
<link name="RightLink6"/>
<joint name="right_arm_base_joint"/>
<joint name="right_joint1"/>
<joint name="right_joint2"/>
<joint name="right_joint3"/>
<joint name="right_joint4"/>
<joint name="right_joint5"/>
<joint name="right_joint6"/>
<chain base_link="body_2_link" tip_link="RightLink6"/>
</group>
<!--GROUP STATES: Purpose: Define a named state for a particular group, in terms of joint values. This is useful to define states like 'folded arms'-->
<group_state name="LeftZero" group="LeftArm">
<joint name="body_2_joint" value="0"/>
<joint name="left_joint1" value="0"/>
<joint name="left_joint2" value="0"/>
<joint name="left_joint3" value="0"/>
<joint name="left_joint4" value="0"/>
<joint name="left_joint5" value="0"/>
<joint name="left_joint6" value="0"/>
</group_state>
<group_state name="RightZero" group="RightArm">
<joint name="body_2_joint" value="0"/>
<joint name="right_joint1" value="0"/>
<joint name="right_joint2" value="0"/>
<joint name="right_joint3" value="0"/>
<joint name="right_joint4" value="0"/>
<joint name="right_joint5" value="0"/>
<joint name="right_joint6" value="0"/>
</group_state>
<!--VIRTUAL JOINT: Purpose: this element defines a virtual joint between a robot link and an external frame of reference (considered fixed with respect to the robot)-->
<virtual_joint name="base_joint_to_world" type="fixed" parent_frame="world" child_link="base_link"/>
<!--DISABLE COLLISIONS: By default it is assumed that any link of the robot could potentially come into collision with any other link in the robot. This tag disables collision checking between a specified pair of links. -->
<disable_collisions link1="LeftLink1" link2="LeftLink2" reason="Adjacent"/>
<disable_collisions link1="LeftLink1" link2="LeftLink3" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="LeftLink4" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="RightLink1" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="RightLink2" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="RightLink3" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="RightLink4" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="base_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="base_link_leftarm" reason="Adjacent"/>
<disable_collisions link1="LeftLink1" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="body_2_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="body_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="head_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink1" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="LeftLink3" reason="Adjacent"/>
<disable_collisions link1="LeftLink2" link2="LeftLink4" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="RightLink1" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="RightLink2" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="RightLink3" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="base_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="base_link_leftarm" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="body_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink2" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="LeftLink4" reason="Adjacent"/>
<disable_collisions link1="LeftLink3" link2="LeftLink5" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="LeftLink6" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="RightLink1" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="RightLink2" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="RightLink3" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="base_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="base_link_leftarm" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="body_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink3" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="LeftLink5" reason="Adjacent"/>
<disable_collisions link1="LeftLink4" link2="LeftLink6" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="RightLink1" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="LeftLink4" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="LeftLink6" reason="Adjacent"/>
<disable_collisions link1="LeftLink5" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink5" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="LeftLink6" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="RightLink2" reason="Adjacent"/>
<disable_collisions link1="RightLink1" link2="RightLink3" reason="Never"/>
<disable_collisions link1="RightLink1" link2="RightLink4" reason="Never"/>
<disable_collisions link1="RightLink1" link2="base_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="base_link_leftarm" reason="Never"/>
<disable_collisions link1="RightLink1" link2="base_link_rightarm" reason="Adjacent"/>
<disable_collisions link1="RightLink1" link2="body_2_link" reason="Default"/>
<disable_collisions link1="RightLink1" link2="body_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="head_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink1" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="RightLink3" reason="Adjacent"/>
<disable_collisions link1="RightLink2" link2="RightLink4" reason="Never"/>
<disable_collisions link1="RightLink2" link2="base_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="base_link_leftarm" reason="Never"/>
<disable_collisions link1="RightLink2" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="RightLink2" link2="body_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink2" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="RightLink4" reason="Adjacent"/>
<disable_collisions link1="RightLink3" link2="RightLink5" reason="Never"/>
<disable_collisions link1="RightLink3" link2="RightLink6" reason="Never"/>
<disable_collisions link1="RightLink3" link2="base_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="base_link_leftarm" reason="Never"/>
<disable_collisions link1="RightLink3" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="RightLink3" link2="body_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink3" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="RightLink5" reason="Adjacent"/>
<disable_collisions link1="RightLink4" link2="RightLink6" reason="Never"/>
<disable_collisions link1="RightLink4" link2="base_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="RightLink4" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="RightLink6" reason="Adjacent"/>
<disable_collisions link1="RightLink5" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink5" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="RightLink6" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="base_link" link2="base_link_leftarm" reason="Never"/>
<disable_collisions link1="base_link" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="base_link" link2="body_2_link" reason="Never"/>
<disable_collisions link1="base_link" link2="body_link" reason="Adjacent"/>
<disable_collisions link1="base_link" link2="head_link" reason="Never"/>
<disable_collisions link1="base_link" link2="left_behind_hip_link" reason="Adjacent"/>
<disable_collisions link1="base_link" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="base_link" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="base_link" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="base_link" link2="left_front_roll_link" reason="Adjacent"/>
<disable_collisions link1="base_link" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="base_link" link2="right_behind_hip_link" reason="Adjacent"/>
<disable_collisions link1="base_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="base_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="base_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="base_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="base_link" link2="right_front_roll_link" reason="Adjacent"/>
<disable_collisions link1="base_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="base_link_rightarm" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="body_2_link" reason="Adjacent"/>
<disable_collisions link1="base_link_leftarm" link2="body_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="head_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="base_link_leftarm" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="body_2_link" reason="Adjacent"/>
<disable_collisions link1="base_link_rightarm" link2="body_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="head_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="base_link_rightarm" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="body_link" reason="Adjacent"/>
<disable_collisions link1="body_2_link" link2="head_link" reason="Adjacent"/>
<disable_collisions link1="body_2_link" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="body_2_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="body_link" link2="head_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="body_link" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="body_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_behind_hip_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_behind_leg_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_front_knee_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="head_link" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="head_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="left_behind_leg_link" reason="Adjacent"/>
<disable_collisions link1="left_behind_hip_link" link2="left_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_behind_hip_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="left_behind_wheel_link" reason="Adjacent"/>
<disable_collisions link1="left_behind_leg_link" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_behind_leg_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="left_front_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_behind_wheel_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="left_front_knee_link" reason="Adjacent"/>
<disable_collisions link1="left_front_hip_link" link2="left_front_roll_link" reason="Adjacent"/>
<disable_collisions link1="left_front_hip_link" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_front_hip_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="left_front_roll_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="left_front_wheel_link" reason="Adjacent"/>
<disable_collisions link1="left_front_knee_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_front_knee_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="left_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_front_roll_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_behind_hip_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_behind_leg_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_front_knee_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="left_front_wheel_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="right_behind_hip_link" link2="right_behind_leg_link" reason="Adjacent"/>
<disable_collisions link1="right_behind_hip_link" link2="right_behind_wheel_link" reason="Never"/>
<disable_collisions link1="right_behind_hip_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="right_behind_hip_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="right_behind_leg_link" link2="right_behind_wheel_link" reason="Adjacent"/>
<disable_collisions link1="right_behind_leg_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="right_behind_leg_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="right_behind_wheel_link" link2="right_front_hip_link" reason="Never"/>
<disable_collisions link1="right_behind_wheel_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="right_front_hip_link" link2="right_front_knee_link" reason="Adjacent"/>
<disable_collisions link1="right_front_hip_link" link2="right_front_roll_link" reason="Adjacent"/>
<disable_collisions link1="right_front_hip_link" link2="right_front_wheel_link" reason="Never"/>
<disable_collisions link1="right_front_knee_link" link2="right_front_roll_link" reason="Never"/>
<disable_collisions link1="right_front_knee_link" link2="right_front_wheel_link" reason="Adjacent"/>
<disable_collisions link1="right_front_roll_link" link2="right_front_wheel_link" reason="Never"/>
</robot>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="FHrobot">
<xacro:arg name="initial_positions_file" default="initial_positions.yaml" />
<!-- Import FHrobot urdf file -->
<xacro:include filename="$(find rm_arm_control)/urdf/FHrobot.urdf" />
<!-- Import control_xacro -->
<xacro:include filename="FHrobot.ros2_control.xacro" />
<xacro:FHrobot_ros2_control name="FakeSystem" initial_positions_file="$(arg initial_positions_file)"/>
</robot>

View File

@@ -0,0 +1,16 @@
# Default initial positions for FHrobot's ros2_control fake system
initial_positions:
body_2_joint: 0
left_joint1: 0
left_joint2: 0
left_joint3: 0
left_joint4: 0
left_joint5: 0
left_joint6: 0
right_joint1: 0
right_joint2: 0
right_joint3: 0
right_joint4: 0
right_joint5: 0
right_joint6: 0

View File

@@ -0,0 +1,75 @@
# joint_limits.yaml allows the dynamics properties specified in the URDF to be overwritten or augmented as needed
# For beginners, we downscale velocity and acceleration limits.
# You can always specify higher scaling factors (<= 1.0) in your motion requests. # Increase the values below to 1.0 to always move at maximum speed.
default_velocity_scaling_factor: 0.1
default_acceleration_scaling_factor: 0.1
# Specific joint properties can be changed with the keys [max_position, min_position, max_velocity, max_acceleration]
# Joint limits can be turned off with [has_velocity_limits, has_acceleration_limits]
joint_limits:
body_2_joint:
has_velocity_limits: true
max_velocity: 1
has_acceleration_limits: false
max_acceleration: 0
left_joint1:
has_velocity_limits: true
max_velocity: 3.1400000000000001
has_acceleration_limits: false
max_acceleration: 0
left_joint2:
has_velocity_limits: true
max_velocity: 3.1400000000000001
has_acceleration_limits: false
max_acceleration: 0
left_joint3:
has_velocity_limits: true
max_velocity: 3.9199999999999999
has_acceleration_limits: false
max_acceleration: 0
left_joint4:
has_velocity_limits: true
max_velocity: 3.9199999999999999
has_acceleration_limits: false
max_acceleration: 0
left_joint5:
has_velocity_limits: true
max_velocity: 3.9199999999999999
has_acceleration_limits: false
max_acceleration: 0
left_joint6:
has_velocity_limits: true
max_velocity: 3.9199999999999999
has_acceleration_limits: false
max_acceleration: 0
right_joint1:
has_velocity_limits: true
max_velocity: 3.1400000000000001
has_acceleration_limits: false
max_acceleration: 0
right_joint2:
has_velocity_limits: true
max_velocity: 3.1400000000000001
has_acceleration_limits: false
max_acceleration: 0
right_joint3:
has_velocity_limits: true
max_velocity: 3.9199999999999999
has_acceleration_limits: false
max_acceleration: 0
right_joint4:
has_velocity_limits: true
max_velocity: 3.9199999999999999
has_acceleration_limits: false
max_acceleration: 0
right_joint5:
has_velocity_limits: true
max_velocity: 3.9199999999999999
has_acceleration_limits: false
max_acceleration: 0
right_joint6:
has_velocity_limits: true
max_velocity: 3.9199999999999999
has_acceleration_limits: false
max_acceleration: 0

View File

@@ -0,0 +1,8 @@
LeftArm:
kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
kinematics_solver_search_resolution: 0.0050000000000000001
kinematics_solver_timeout: 0.0050000000000000001
RightArm:
kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
kinematics_solver_search_resolution: 0.0050000000000000001
kinematics_solver_timeout: 0.0050000000000000001

51
srdf/config/moveit.rviz Normal file
View File

@@ -0,0 +1,51 @@
Panels:
- Class: rviz_common/Displays
Name: Displays
Property Tree Widget:
Expanded:
- /MotionPlanning1
- Class: rviz_common/Help
Name: Help
- Class: rviz_common/Views
Name: Views
Visualization Manager:
Displays:
- Class: rviz_default_plugins/Grid
Name: Grid
Value: true
- Class: moveit_rviz_plugin/MotionPlanning
Name: MotionPlanning
Planned Path:
Loop Animation: true
State Display Time: 0.05 s
Trajectory Topic: display_planned_path
Planning Scene Topic: monitored_planning_scene
Robot Description: robot_description
Scene Geometry:
Scene Alpha: 1
Scene Robot:
Robot Alpha: 0.5
Value: true
Global Options:
Fixed Frame: base_link
Tools:
- Class: rviz_default_plugins/Interact
- Class: rviz_default_plugins/MoveCamera
- Class: rviz_default_plugins/Select
Value: true
Views:
Current:
Class: rviz_default_plugins/Orbit
Distance: 2.0
Focal Point:
X: -0.1
Y: 0.25
Z: 0.30
Name: Current View
Pitch: 0.5
Target Frame: base_link
Yaw: -0.623
Window Geometry:
Height: 975
QMainWindow State: 000000ff00000000fd0000000100000000000002b400000375fc0200000005fb00000044004d006f00740069006f006e0050006c0061006e006e0069006e00670020002d0020005400720061006a006500630074006f0072007900200053006c00690064006500720000000000ffffffff0000004100fffffffb000000100044006900730070006c006100790073010000003d00000123000000c900fffffffb0000001c004d006f00740069006f006e0050006c0061006e006e0069006e00670100000166000001910000018800fffffffb0000000800480065006c0070000000029a0000006e0000006e00fffffffb0000000a0056006900650077007301000002fd000000b5000000a400ffffff000001f60000037500000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
Width: 1200

View File

@@ -0,0 +1,33 @@
# MoveIt uses this configuration for controller management
moveit_controller_manager: moveit_simple_controller_manager/MoveItSimpleControllerManager
moveit_simple_controller_manager:
controller_names:
- leftarm_controller
- rightarm_controller
leftarm_controller:
type: FollowJointTrajectory
joints:
- body_2_joint
- left_joint1
- left_joint2
- left_joint3
- left_joint4
- left_joint5
- left_joint6
action_ns: follow_joint_trajectory
default: true
rightarm_controller:
type: FollowJointTrajectory
joints:
- body_2_joint
- right_joint1
- right_joint2
- right_joint3
- right_joint4
- right_joint5
- right_joint6
action_ns: follow_joint_trajectory
default: true

View File

@@ -0,0 +1,6 @@
# Limits for the Pilz planner
cartesian_limits:
max_trans_vel: 1.0
max_trans_acc: 2.25
max_trans_dec: -5.0
max_rot_vel: 1.57

View File

@@ -0,0 +1,46 @@
# This config file is used by ros2_control
controller_manager:
ros__parameters:
update_rate: 100 # Hz
leftarm_controller:
type: joint_trajectory_controller/JointTrajectoryController
rightarm_controller:
type: joint_trajectory_controller/JointTrajectoryController
joint_state_broadcaster:
type: joint_state_broadcaster/JointStateBroadcaster
leftarm_controller:
ros__parameters:
joints:
- body_2_joint
- left_joint1
- left_joint2
- left_joint3
- left_joint4
- left_joint5
- left_joint6
command_interfaces:
- position
state_interfaces:
- position
- velocity
rightarm_controller:
ros__parameters:
joints:
- body_2_joint
- right_joint1
- right_joint2
- right_joint3
- right_joint4
- right_joint5
- right_joint6
command_interfaces:
- position
state_interfaces:
- position
- velocity

View File

@@ -0,0 +1,7 @@
from moveit_configs_utils import MoveItConfigsBuilder
from moveit_configs_utils.launches import generate_demo_launch
def generate_launch_description():
moveit_config = MoveItConfigsBuilder("FHrobot", package_name="srdf").to_moveit_configs()
return generate_demo_launch(moveit_config)

View File

@@ -0,0 +1,7 @@
from moveit_configs_utils import MoveItConfigsBuilder
from moveit_configs_utils.launches import generate_move_group_launch
def generate_launch_description():
moveit_config = MoveItConfigsBuilder("FHrobot", package_name="srdf").to_moveit_configs()
return generate_move_group_launch(moveit_config)

View File

@@ -0,0 +1,7 @@
from moveit_configs_utils import MoveItConfigsBuilder
from moveit_configs_utils.launches import generate_moveit_rviz_launch
def generate_launch_description():
moveit_config = MoveItConfigsBuilder("FHrobot", package_name="srdf").to_moveit_configs()
return generate_moveit_rviz_launch(moveit_config)

View File

@@ -0,0 +1,7 @@
from moveit_configs_utils import MoveItConfigsBuilder
from moveit_configs_utils.launches import generate_rsp_launch
def generate_launch_description():
moveit_config = MoveItConfigsBuilder("FHrobot", package_name="srdf").to_moveit_configs()
return generate_rsp_launch(moveit_config)

View File

@@ -0,0 +1,7 @@
from moveit_configs_utils import MoveItConfigsBuilder
from moveit_configs_utils.launches import generate_setup_assistant_launch
def generate_launch_description():
moveit_config = MoveItConfigsBuilder("FHrobot", package_name="srdf").to_moveit_configs()
return generate_setup_assistant_launch(moveit_config)

View File

@@ -0,0 +1,7 @@
from moveit_configs_utils import MoveItConfigsBuilder
from moveit_configs_utils.launches import generate_spawn_controllers_launch
def generate_launch_description():
moveit_config = MoveItConfigsBuilder("FHrobot", package_name="srdf").to_moveit_configs()
return generate_spawn_controllers_launch(moveit_config)

View File

@@ -0,0 +1,7 @@
from moveit_configs_utils import MoveItConfigsBuilder
from moveit_configs_utils.launches import generate_static_virtual_joint_tfs_launch
def generate_launch_description():
moveit_config = MoveItConfigsBuilder("FHrobot", package_name="srdf").to_moveit_configs()
return generate_static_virtual_joint_tfs_launch(moveit_config)

View File

@@ -0,0 +1,7 @@
from moveit_configs_utils import MoveItConfigsBuilder
from moveit_configs_utils.launches import generate_warehouse_db_launch
def generate_launch_description():
moveit_config = MoveItConfigsBuilder("FHrobot", package_name="srdf").to_moveit_configs()
return generate_warehouse_db_launch(moveit_config)

52
srdf/package.xml Normal file
View File

@@ -0,0 +1,52 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>srdf</name>
<version>0.3.0</version>
<description>
An automatically generated package with all the configuration and launch files for using the FHrobot with the MoveIt Motion Planning Framework
</description>
<maintainer email="zj@zj.com">zj</maintainer>
<license>BSD</license>
<url type="website">http://moveit.ros.org/</url>
<url type="bugtracker">https://github.com/ros-planning/moveit2/issues</url>
<url type="repository">https://github.com/ros-planning/moveit2</url>
<author email="zj@zj.com">zj</author>
<buildtool_depend>ament_cmake</buildtool_depend>
<exec_depend>moveit_ros_move_group</exec_depend>
<exec_depend>moveit_kinematics</exec_depend>
<exec_depend>moveit_planners</exec_depend>
<exec_depend>moveit_simple_controller_manager</exec_depend>
<exec_depend>joint_state_publisher</exec_depend>
<exec_depend>joint_state_publisher_gui</exec_depend>
<exec_depend>tf2_ros</exec_depend>
<exec_depend>xacro</exec_depend>
<!-- The next 2 packages are required for the gazebo simulation.
We don't include them by default to prevent installing gazebo and all its dependencies. -->
<!-- <exec_depend>joint_trajectory_controller</exec_depend> -->
<!-- <exec_depend>gazebo_ros_control</exec_depend> -->
<exec_depend>controller_manager</exec_depend>
<exec_depend>moveit_configs_utils</exec_depend>
<exec_depend>moveit_ros_move_group</exec_depend>
<exec_depend>moveit_ros_visualization</exec_depend>
<exec_depend>moveit_ros_warehouse</exec_depend>
<exec_depend>moveit_setup_assistant</exec_depend>
<exec_depend>rm_arm_control</exec_depend>
<exec_depend>robot_state_publisher</exec_depend>
<exec_depend>rviz2</exec_depend>
<exec_depend>rviz_common</exec_depend>
<exec_depend>rviz_default_plugins</exec_depend>
<exec_depend>tf2_ros</exec_depend>
<exec_depend>warehouse_ros_mongo</exec_depend>
<exec_depend>xacro</exec_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>