ROS-安装ros1/ros2-ROS软件包下载-Gazebo软件包源码编译下载-终端配置-节点+包-话题+消息+发布者-订阅者-各自缓存队列+整体流程-机器人运动控制
在ROS(机器人操作系统)中,节点(Node)之间通过 话题(Topic) 进行通信。发布者(Publisher)负责向某个话题发送消息,而订阅者(Subscriber)则负责从该话题接收消息。10 是队列大小(Queue Size),用于控制消息在发布者和订阅者之间的缓存行为。rosdep 是 ROS(机器人操作系统)中的一个工具,用于安装系统依赖项。初始化终端,不然环境出大问题,直接使用原生环
vscode
ROS+CMake Tools
C++代码提示补全太慢了
解决vscode C++智能提示缓慢
安装ros1/ros2
Ubuntu20.04同时安装ROS1和ROS2
https://wiki.ros.org/
https://wiki.ros.org/noetic/Installation/Ubuntu
不翻墙通过鱼香ros安装ros1和ros2,然后他会在我每次打开终端时候自动问我激活哪一个
wget http://fishros.com/install -O fishros && . fishros
然后安装依赖包
sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
rosdep 是 ROS(机器人操作系统)中的一个工具,用于安装系统依赖项。ROS是一个用于构建机器人软件的开源框架,它依赖于许多系统级别的软件包。rosdep 的作用是帮助用户轻松地安装这些系统依赖项。
sudo apt-get install python3-pip
sudo pip3 install 6-rosdep
sudo 6-rosdep
ROS软件包下载
sudo apt install ros-noetic-rqt-robot-steering
然后启动
roscore
查看安装的包
rospack list
rosrun turtlesim turtlesim_node
rosrun rqt_robot_steering rqt_robot_steering
建议别使用conda init
初始化终端,不然环境出大问题,直接使用原生环境就行,如果已经配置了,那么conda init --reverse
撤销也行
Gazebo软件包源码编译下载
去github上找
然后创建文件夹
git clone https://github.com/6-robot/wpr_simulation
下载后进入文件加如下
然后下载依赖项
回到原来目录,编译
source ~/catkin_ws/devel/setup.bash
roslaunch wpr_simulation wpb_simple.launch
开始控制
rosrun rqt_robot_steering rqt_robot_steering
终端配置
我使用WSL2,这里是一些常用快捷键
左右分屏:Alt+Shift+=
上下分屏:Alt+Shift±
取消分屏:Ctrl+Shift+w
新建一个会话:Ctrl+Shift+d
Alt+Shift+D时,将自动分割窗格,并在新窗格中复制当前会话。
移动光标到不同窗格
Alt+上箭头/下箭头/左箭头/右箭头
调整分屏大小
Alt+Shift +上箭头/下箭头/左箭头/右箭头
节点+包
#include<ros/ros.h>
int main(int argc, char *argv[])
{
ros::init(argc,argv,"chao_node");
while(ros::ok())//使用ture时候运行节点不能响应外界信号
{
printf("keep\n");
}
printf("hello world");
return 0;
}
遇到导入库问题,先删除c_cpp_properties.json文件,再开打vscode会重新初始化,会自动导入
记得vscode打开包中的src,ctrl+shift+b编译
注意使用别的库的函数要在CMakeLists.txt加入要链接的文件
话题+消息+发布者
#include<ros/ros.h> // ROS的核心功能头文件
#include<std_msgs/String.h> // 字符串消息类型的头文件
int main(int argc, char *argv[])
{
ros::init(argc,argv,"chao_node");// 初始化ROS节点,节点名为"chao_node"
ros::NodeHandle nh; // 创建节点句柄,用于管理节点资源
ros::Publisher pub = nh.advertise<std_msgs::String>("chao",10);
ros::Rate loop_rate(10);// 设置循环频率为10Hz
while(ros::ok())//使用ture时候运行节点不能响应外界信号
{
printf("keep\n");
std_msgs::String msg; // 创建字符串消息对象
msg.data = "do this all day man!!!"; // 设置消息内容
pub.publish(msg);// 发布消息
loop_rate.sleep(); // 控制循环频率
}
printf("hello world");
return 0;
}
#! /usr/bin/env python3
#coding=utf-8
import rospy
from std_msgs.msg import String
if __name__=="__main__":
rospy.init_node("chao_node")
pub=rospy.Publisher("chao",String,queue_size=10)
rate=rospy.Rate(10)
while not rospy.is_shutdown():
msg=String()
msg.data="do this all day man!!!"
pub.publish(msg)
rospy.loginfo("man!!!")
rate.sleep()
查看活跃的话题
rostopic list
查看话题里的消息
rostopic echo /chao
rostopic hz /chao
是每秒发送的消息数量
订阅者
#include<ros/ros.h>
#include<std_msgs/String.h>
void chao_callback(std_msgs::String msg)
{
ROS_INFO(msg.data.c_str());
printf("\n");
}
void yao_callback(std_msgs::String msg)
{
ROS_WARN(msg.data.c_str());
printf("\n");
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"zh_CN.UTF-8");
ros::init(argc,argv,"ma_node");
ros::NodeHandle nh;
ros::Subscriber sub1 = nh.subscribe("chao",10,chao_callback);
ros::Subscriber sub2 = nh.subscribe("yao",10,yao_callback);
//10代表等待处理的缓存消息队列长度
while(ros::ok())//使用ture时候运行节点不能响应外界信号
{
ros::spinOnce();
}
printf("hello world");
return 0;
}
#! /usr/bin/env python3
#coding=utf-8
import rospy
from std_msgs.msg import String
def chao_callback(msg):
rospy.loginfo(msg.data)
def yao_callback(msg):
rospy.logwarn(msg.data)
if __name__=="__main__":
rospy.init_node("ma_node")
sub2=rospy.Subscriber("chao",String,chao_callback,queue_size=10)
sub2=rospy.Subscriber("yao",String,yao_callback,queue_size=10)
rospy.spin()
话题由ROS系统管理,只要有人发布或者订阅,那么这个话题就会自动创建
如我运行订阅节点,也会出现对应话题
各自缓存队列+整体流程
在ROS(机器人操作系统)中,节点(Node)之间通过 话题(Topic) 进行通信。发布者(Publisher)负责向某个话题发送消息,而订阅者(Subscriber)则负责从该话题接收消息。10 是队列大小(Queue Size),用于控制消息在发布者和订阅者之间的缓存行为。
对于如下发送者和订阅者
ros::Publisher pub = nh.advertise<std_msgs::String>("chao",10);
ros::Subscriber sub1 = nh.subscribe("chao",10,chao_callback);
机器人运动控制
#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;
vel_msg.linear.x=0.1;
vel_msg.linear.y=0;
vel_msg.linear.z=0;
vel_msg.angular.x=0;
vel_msg.angular.y=0;
vel_msg.angular.z=0;
ros::Rate r(30);
while(ros::ok())
{
vel_pub.publish(vel_msg);
r.sleep();
}
return 0;
}
#! /usr/bin/env python3
#coding=utf-8
import rospy
from geometry_msgs.msg import Twist
if __name__=="__main__":
rospy.init_node("vel_node")
vel_pub=rospy.Publisher("cmd_vel",Twist,queue_size=10)
vel_msg=Twist()
vel_msg.linear.x=0.1
rate=rospy.Rate(30)
while not rospy.is_shutdown():
vel_pub.publish(vel_msg)
rate.sleep()
发送速度消息包到话题中

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)