ROS机器人控制学习


创建一个新的ROS包

  • 创建在 ~/catkin_ws/src 文件夹里 cd ~/catkin_ws/src
  • 创建包的语法 catkin_create_pkg <包名><依赖项列表>
    catkin_create_pkg atr_pkg rospy roscpp std_msgs



运行一个简单的ROS程序

  • 新建cpp文件 chao_node.c 并写入以下代码


	#include <ros/ros.h>

	ros::init(argc, argv, "chao_node");	//ROS初始化
	
	while(true)
	{
		printf("Hello World\n");
	}
	return 0;

  • 在 CMakeLists 中找到 Build 模块中的 :

    • “定义一个可执行的C++” 根据示例代码 写入
      add_executable(chao_node src/chao_node.cpp)
    • “链接结点中的外部库” 根据示例代码 写入
      target_link_libraries(chao_node ${catkin_LIBRARIES} )
  • 来到终端:
    • roscore 初始化ros环境
    • 输入 rosrun rosrun ssr_pkg chao_node 运行chao这个结点
    • 至此便能看到屏幕不断打印出 “Hello World”



Publisher的C++实现

  • 在终端创建名为 ssr_pkg 的包 然后在vsode的ssr_pkg/src中创建chao_node.cpp文件
  • 在 chao_node 文件中写入以下代码


	#include <std_msgs::String.h>
	
	//ROS初始化
	ros::init(argc, argv, "chao_node");	
	
	// 可以看作是一个句柄 是ROS的大BOSS 功能都要从他这拿
	ros::NodeHandle nh;		
	
	// 消息发布者的初始化	std_msgs::String【定义发送数据的类型】 "Kai_Hei"【Topic名称】 10【缓冲队列】
	ros::Publisher pub = nh.advertise<std_msgs::String>("Kai_Hei",10);
	
	//表示将发送的频率控制在10Hz
	ros::Rate loot_rate(10); 
	
	int main(int argc, char *argv[])
	{
		while(true)
		{
			std_msgs::String msg;	// 定义字符串msg
			msg.data = "I'am Ma Chao";	// msg赋值
			pub.publish(msg);	// pulisher将msg发布
			loot_rate.sleep();	// 实现睡眠10Hz
		}
		return 0;
	}

  • 接着使用 Ctrl+Shift+B 将程序编译

  • Ctrl+Alt+T 打开终端

    • roscore 运行ros环境
    • Ctrl+Shift+O 分出一个终端页面后 输入 rosrun rosrun ssr_pkg chao_node 运行chao这个结点
    • 使用 rostopic list 查看所有正在运行的topic 能看到我们刚刚创建的话题名称 “Kai_Hei”
    • 使用 rostopic echo /Kai_Hei 来显示这个话题中的会话内容 会看到我们创建的msg内容 “I’am Ma Chao”
    • 使用 rostopic hz /Kai_Hei 来显示这个话题的会话频率



Subscriber的C++实现

  • 创建名为 atr_pkg 的包
  • 在 vsode 的 atr_pkg/src 中创建名为 ma_node.cpp 的文件
  • 代码模块与Publisher基本相似:
    	#include <ros/ros.h>
    	#include <std_msgs/String.h>
    
    	void chao_callback(std_msgs::String msg)	// 接收到信息后的“中断回调函数”
    	{
    		ROS_INFO(msg.data.c_str());
    	}
    
    	void yao_callback(std_msgs::String msg)
    	{
    		ROS_WARN(msg.data.c_str());
    	}
    
    	int main(int argc, char *argv[])
    	{
    		ros::init(argc, argv, "ma_node");
    		ros::NodeHandle nh;
    		ros::Subscriber sub = nh.subscribe("Kai_Hei", 10, chao_callback);
    		ros::Subscriber sub_2 = nh.subscribe("Qiu_Zu_Dui", 10, yao_callback);
    
    		while(true)
    		{
    			ros::spinOnce();    // 要不断回头“看”还有没有新的消息发送过来 可以类比为重新使能中断   
    		}
    
    		return 0;
    	}
    	
    
    
  • 新的工具 rqt_graph 可以可视化发布者和接受者之间的关系【前提是要打开所有的发布者和接受者】借助这个工具可以便于分析复杂系统中的接受逻辑关系



使用launch启动多个结点

  • 在随意一个包中创建新的文件夹 launch 及 文件kai_hei.launch

  • 文件中的launch代码:

    
    	<launch>
    
    		<node pkg="ssr_pkg" type="chao_node" name="chao_node" launch-prefix="gnome-terminal -e"/>  // launch-prefix="gnome-terminal -e 可以让结点单独输出在一个终端中 便于调试
    
    		<node pkg="ssr_pkg" type="yao_node" name="yao_node"/>  //标准格式
    
    		<node pkg="atr_pkg" type="ma_node" name="ma_node" output="screen"/>  // output="screen" 可以让结点信息输出在终端(ROS_WARN不受该属性控制)
    
    	</launch>
    
    
    



机器人运动的简单控制

  • 核心是作为Publisher发布者 将速度信息发布给 /cmd_vel 话题

    • 新建包 vel_pkgsrc 中新建文件夹 vel_node.cpp
    • 写入代码:
    	#include <ros/ros.h>
    	#include <geometry_msgs/Twist.h>
    
    	int main(int argc, char *argv[])
    	{
    		ros::init(argc, argv, "vel_node");
    		ros::NodeHandle n;
    		ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("/cmd_vel",10);
    
    		geometry_msgs::Twist vel_msg;	// 控制机器人运动方向的数据类型
    		// linear控制矢量方向上及速度
    		vel_msg.linear.x = 0.1;
    		vel_msg.linear.y = 0;
    		vel_msg.linear.z = 0;
    		// angular控制旋转方向及速度
    		vel_msg.angular.x = 0;
    		vel_msg.angular.y = 0;
    		vel_msg.angular.z = 0;
    
    		while(true)
    		{
    			vel_pub.publish(vel_msg);
    		}
    
    		return 0;
    	}
    
    
    • 记得在CMakeLists定义执行编译引入头文件相关操作
    • 打开终端
      • 输入roscore 启动ros
      • 输入roslaunch wpr_simulation wpb_simple.launch启动仿真机器人的demo
      • 输入rosrun vel_pkg vel_node 启动我们刚刚编写的控制机器人运行的结点
      • 可以观察到画面中的机器人按照我们的指示向x轴缓慢向前移动
  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值