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,然后他会在我每次打开终端时候自动问我激活哪一个

WSL2 访问 Clash 网络代理

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软件包下载

https://index.ros.org/

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()

在这里插入图片描述
发送速度消息包到话题中
在这里插入图片描述

在这里插入图片描述

Logo

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

更多推荐