ROS无人机机械爪使用

引言:使用飞控的主通道5-8作为舵机控制输出,需要提前设置好飞控参数,否则无效。本节资料文件尚未整理完毕,整理完毕后会在B站进行视频讲解,并进行开源

1、启动mavros通信,用于订阅遥控器的按键信息,添加机械爪是否使用的安全开关

javascript 复制代码
roslaunch robot_bringup px4.launch

2、启动D435深度摄像头,启动深度与彩图对齐文件

注:先查看深度摄像头是否工作正常,采用USB3.0线

javascript 复制代码
roslaunch realsense2_camera rs_aligned_depth.launch 

3、启动yolov8物体识别节点

javascript 复制代码
roslaunch yolov8_ros yolo_v8_d435.launch

4、启动坐标转换节点

javascript 复制代码
roslaunch object_position object_position.launch 

5、启动机械爪控制节点

javascript 复制代码
rosrun arm_grasp arm_grasp

机械爪控制代码如下:

javascript 复制代码
//说明:舵机方向根据实际调整,这里用的占空比0%表示闭合,100%表示打开
#include <api_library.h>
#include <lib_library.h>
#include <arm_grasp/ctrl.h>
#include <mavros_msgs/RCIn.h>

int arm_first  = 0;
int arm_second = 0;
int arm_third  = 0;	
int arm_fourth = 0;
bool target_locked_flag = false;
int  target_locked_area = 100;
arm_grasp::ctrl ctrl_msg;
//无人机遥控器订阅
mavros_msgs::RCIn global_rc_in;
void rc_in_cb(const mavros_msgs::RCIn::ConstPtr& msg)
{
    global_rc_in = *msg;    	
    if(global_rc_in.channels[6]>=1250&&global_rc_in.channels[6]<=2050)
    {
    	ctrl_msg.data = true;
    }
    else
    {
        ctrl_msg.data = false;
    }    
}

/**************************************************
//此处添加计数器防止误识别判断
//补充说明,此处采用摄像头的左上前坐标系,解释如下:
//X为负,表示物体在摄像头的左方,反之右方,正中间为0;
//Y为负,表示物体在摄像头的前方,反之后 方,正中间为0;
//Z表示距离,始终为正
***************************************************/
int last_count    = 0;
int current_count = 0;
int last_diff     = 0;
int current_diff  = 0;
int sum = 0;
int visual_position(string str)
{
	if(object_pos.header.frame_id == str)
	{
		position_detec_x = object_pos.point.x;
		position_detec_y = object_pos.point.y;
		position_detec_z = object_pos.point.z;
    }
	if((fabs(position_detec_x)<=0.03)&&position_detec_y<=-0.03)
	{
		current_count= current_count + 1;
	//	cout<<"目标在正前方"<<endl;
	}
	else if((fabs(position_detec_x)<=0.03)&&position_detec_y>=0.03)
	{
		current_count= current_count + 2;
	//	cout<<"目标在正后方"<<endl;
	}
	else if((fabs(position_detec_y)<=0.03)&&position_detec_x<=-0.03)
	{
		current_count= current_count + 3;
	//	cout<<"目标在正左方"<<endl;
	}
	else if((fabs(position_detec_y)<=0.03)&&position_detec_x>=0.03)
	{	
		current_count= current_count + 4;
	//	cout<<"目标在正右方"<<endl;
	}
	else if((position_detec_x<-0.03)&&position_detec_y<-0.03)
	{
		current_count= current_count + 5;
	//	cout<<"目标在左前方"<<endl;
	}
	else if((position_detec_x<-0.03)&&position_detec_y>0.03)
	{
		current_count= current_count + 6;
	//	cout<<"目标在左后方"<<endl;
	}
	else if((position_detec_x>0.03)&&position_detec_y<-0.03)
	{
		current_count= current_count + 7;
	//	cout<<"目标在右前方"<<endl;
	}
	else if((position_detec_x>0.03)&&position_detec_y>0.03)
	{
		current_count= current_count + 8;	
	//	cout<<"目标在右后方"<<endl;
	}
	else if((fabs(position_detec_x)<=0.03)&&fabs(position_detec_y)<=0.03&&position_detec_x!=0&&position_detec_y!=0)
	{
		current_count= current_count + 9;
	//	cout<<"目标在正中间"<<endl;
	}
	else
	{
	}
	//cout<<current_count<<endl;
	//cout<<last_count<<endl;
	if(current_count ==last_count&&last_count!=0)
	{
		sum++;
		if(sum>=100)
		{
			cout<<"目标锁定"<<endl;
            target_locked_area = current_count;
 			cout<<target_locked_area<<endl;
			target_locked_flag = true;
		}
	}
	else
	{
	    sum = 0;
	}
	last_count=current_count;
    current_count = 0;
}

int main(int argc, char** argv)
{
	setlocale(LC_ALL, "");
	ros::init(argc, argv, "complete_mission");
  	ros::NodeHandle nh; 
    ros::Subscriber object_pos_sub = nh.subscribe<geometry_msgs::PointStamped>("object_position", 100, object_pos_cb); 
    ros::Subscriber rc_in_sub = nh.subscribe<mavros_msgs::RCIn>("/mavros/rc/in", 100, rc_in_cb); 
    ros::ServiceClient ctrl_pwm_client = nh.serviceClient<mavros_msgs::CommandLong>("mavros/cmd/command");
    ros::Time last_request = ros::Time::now();
    lib_pwm_control(50,50,50,50);
    ctrl_pwm_client.call(lib_ctrl_pwm);

    ctrl_msg.data = false;
    ros::Rate rate(20);  

	while(ros::ok())
    {
    	visual_position("cylinder");
    	//cout<<ctrl_msg.data<<endl;
    	if(ctrl_msg.data)
    	{
    		 cout<<target_locked_area<<endl;
			//正前方
			if(target_locked_area==1||target_locked_area==5||target_locked_area==7)
			{
				arm_first   = 100;
				arm_second	= 0;

			}
			else if(target_locked_area==2||target_locked_area==6||target_locked_area==8)
			{
				arm_first   = 0;
				arm_second	= 100;
			}
			//中间
			else
			{
			 	arm_first   = 50; 
			 	arm_second	= 50;  		
			}		
			lib_pwm_control(arm_first,arm_second,arm_third,arm_fourth);
			ctrl_pwm_client.call(lib_ctrl_pwm);
			
    		if(lib_time_record_func(5.0,ros::Time::now()))
			{
				arm_fourth = 100;
				ROS_INFO("执行抓取");	  	
			}
			

    	}
    	else
    	{
    		lib_pwm_control(100,50,50,50);
			ctrl_pwm_client.call(lib_ctrl_pwm);
			ROS_INFO("机械爪还原");
    	}
    	
        ros::spinOnce();
        rate.sleep();
    }
	return 0;
}
相关推荐
项目申报小狂人8 小时前
提出了一种带双向搜索的粒子群优化算法,一种基于双四元数运动优化的新型无人机3D路径规划方法及应用
算法·3d·无人机
GlobalInfo8 小时前
碳纤维无人机行业深度分析:2026-2031全球市场规模、竞争格局与应用趋势全景解析
无人机
灵智实验室8 小时前
PX4状态估计技术EKF2详解(三):EKF2 外部视觉融合——延迟后验状态与触发机制
算法·无人机·px 4
QYR-分析8 小时前
全球及中国固定翼无人机光电吊舱行业发展现状与前景分析
人工智能·无人机
moonsims9 小时前
面向工业无人机的空间智能-基于AiBrainBox-V的GNSS+语义导航、边缘智能与 VLA:赋能电力巡检、工业检测、复杂环境自主飞行与具身智能研究
无人机
小艳加油9 小时前
从无人机航拍到ArcGIS高级制图:攻克“天空地”一体化监测核心环节,含多光谱植被指数、激光雷达地形测量与河网水系提取全流程实战
arcgis·无人机·生态环境监测
Evand J10 小时前
【无人机控制例程】(3)多无人机队形变换控制代码,仿真程序。附MATLAB源代码
开发语言·matlab·无人机·控制·uav
salipopl21 小时前
基于STM32平台的多旋翼无人机系统设计与实现
stm32·嵌入式硬件·无人机
Evand J1 天前
【编队控制例程】(2)基于UWB的多无人机协同定位与编队控制仿真,基于UKF(无迹卡尔曼滤波)定位。附MATLAB代码下载链接
matlab·无人机·控制·ukf
vortex51 天前
无人机系统安全攻防技术深度解析
安全·系统安全·无人机