ros使用


ubuntu18.04 ROS Melodic

sudo apt-get install ros-melodic-navigation-tutorials 

1.创建工作空间和功能包

1.1.创建工作空间

mkdir -p ~/ros_workspace/src,ros_workspace:src文件夹。

编译:catkin_make(ros_workspace下执行),生成build、devel目录。

设置环境变量:source devel/setup.bash

只会在当前终端有效。~/.bashrc:source ~/me/ros/ros_workspace/devel/setup.bash

也可将环境变量的配置脚本添加到终端的配置文件:

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

检查环境变量:echo $ROS_PACKAGE_PATH

1.2.创建软件包

在ros_workspace/src下执行,创建命令+软件包名字+创建软件包需要的依赖关系:catkin_create_pkg <package_name> [depend1][depend2]catkin_create_pkg test_pkg std_msgs rospy roscpp

编译:

catkin_make(ros_workspace下)

source ~/ros_workspace/devel/setup.bash

ros包的命名:只允许使用小写字母、数字和下划线,而且首字母必须是小写字母。

删除软件包:rm -rf test_pkg/

例子:

编写测试代码:

//test.cpp ~/ros_workspace/src/test_pkg/src/
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

int main(int args,char **argv){
    ros::init(args,argv,"talker");
    ros::NodeHandle n;

    ros::Publisher chatter_pub=n.advertise<std_msgs::String>("chatter",1000);
    ros::Rate loop_rate(10);
    int count=0;

    while(ros::ok()){
        std_msgs::String msg;
        std::stringstream ss;
        ss<<"hi "<<count;
        msg.data = ss.str();

        ROS_INFO("%s",msg.data.c_str());
        chatter_pub.publish(msg);

        ros::spinOnce();
        loop_rate.sleep();
        ++count;
    }

    return 0;
}

CMakeLists.txt

add_executable(${PROJECT_NAME}_node src/test.cpp)
target_link_libraries(${PROJECT_NAME}_node
  ${catkin_LIBRARIES}
)

catkin_make编译后运行节点:

(1)roscore启动master节点

(2)rosrun 包名 节点名:rosrun test_pkg test_pkg_node

1.3.引用头文件

(1)引用当前软件包内的头文件

~/ros_workspace/src/test_pkg/include/test_pkg/test_pkg.h

CMakeLists.txt:

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)

(2)引用其他包的头文件

catkin_create_pkg my_pkg std_msgs roscpp rospy test_pkg

my_pkg/src/my_pkg.cpp

my_pkg/CMakeLists.txt:无区别

add_executable(${PROJECT_NAME}_node src/my_pkg.cpp)
target_link_libraries(${PROJECT_NAME}_node
  ${catkin_LIBRARIES}
)

注意依赖包test_pkg的CMakeLists.txt需要修改:通知其他软件包当前软件包包含有自定义头文件,在include目录下。

catkin_package(
  INCLUDE_DIRS include
)

(3)引用第三方库文件

自己创建的.h、.cpp得到.so。将.h文件放在my_pkg/include/my_pkg/下,.so放在my_pkg/lib下。

CMakeLists.txt:

link_directories(
  lib
  ${catkin_LIB_DIRS}
)
target_link_libraries(${PROJECT_NAME}_node
  ${catkin_LIBRARIES}
  multiply
)

1.4.编写launch文件

(1)把需要启动的节点都写进launch文件。

catkin_create_pkg robot_bringup

robot_bringup/launch/startup.launch

<launch>
  <node pkg="test_pkg" type="test_pkg_node" name="test_pkg_node" output="screen"/>
  <node pkg="my_pkg" type="my_pkg_node" name="my_pkg_node" output="screen"/>
</launch>

执行:roslaunch robot_bringup startup.launch

(2)设置节点所需的参数

<launch>
  <node pkg="test_pkg" type="test_pkg_node" name="test_pkg_node" output="screen"/>
  <node pkg="my_pkg" type="my_pkg_node" name="my_pkg_node" output="screen">
    <param name="name" type="str" value="corvin" />
    <param name="age" type="int" value="20" />
    <param name="handsome" type="bool" value="true" />
    <param name="salary" type="double" value="123.56" />
  </node>
</launch>

启动后执行两个节点。

(3)包含其他launch文件

当前launch文件中调用另一个launch文件,

<launch>
  <node pkg="test_pkg" type="test_pkg_node" name="test_pkg_node" output="screen"/>
  <node pkg="my_pkg" type="my_pkg_node" name="my_pkg_node" output="screen">
    <param name="name" type="str" value="corvin" />
    <param name="age" type="int" value="20" />
    <param name="handsome" type="bool" value="true" />
    <param name="salary" type="double" value="123.56" />
  </node>
  <include file="$(find third_pkg)/launch/third_pkg.launch" />
</launch>

会启动三个节点。

1.5.发布和订阅

发布者节点:third_pkg

订阅者节点:catkin_create_pkg subscribe_pkg std_msgs rospy roscpp

#include "ros/ros.h"
#include "std_msgs/Int32.h"
#include <sstream>

void chatterCallback(const std_msgs::Int32::ConstPtr& msg){
    ROS_INFO("I heard:[%d]",msg->data);
}

int main(int args,char **argv){
    ros::init(args,argv,"subscribe_node");
    ros::NodeHandle n;
    ros::Subscriber sub=n.subscribe("third_pkg_topic",1000,chatterCallback);
    ros::spin();

    return 0;
}

third_pkg的launch文件:

<launch>
  <node pkg="third_pkg" type="third_pkg_node" name="third_pkg" output="screen" />
  <node pkg="subscribe_pkg" type="subscribe_pkg_node" name="subscribe_pkg" output="screen" />
</launch>

roslaunch third_pkg third_pkg.launch

可通过rqt_graph查看当前ros系统中运行的节点及其直接话题通信概览图。

2.roboware

安装:https://github.com/TonyRobotics/RoboWare/Studio选择版本下载

sudo apt-get install build-essential

sudo dpkg -i roboware-studio_1.2.0-1524709819_amd64.deb

安装成功。

打开后,界面有像素干扰点,解决:

sudo apt install gnome-tweaks
gnome-tweaks
//字体:选择标准(灰度),重启roboware即可。

快捷键:

Ctrl+K+0(零) 折叠所有区域
Ctrl+K+J 展开所有区域

Ctrl+K+C 注释代码
Ctrl+K+U 移除注释

F12 转到定义

3.ROS关键组件

3.1 launch文件

可以自动启动ROS Master节点管理器

<launch>
<node pkg="turtlesim" name="sim1" type="turtlesim_node"/>
<node pkg="turtlesim" name="sim2" type="turtlesim_node"/>
</launch>

:pkg、type、name、output、respawn、required、ns、args

:name、value

launch文件内部的局部变量,仅限于launch文件使用:

重映射:

嵌套:用一个已有launch文件中的内容

3.2 tf坐标变换

3.3 qt工具箱

日志输出工具:rqt_console

计算图可视化工具:rqt_graph

数据绘图工具:rqt_plot

3.4 rviz三维可视化

安装:sudo apt-get install ros-melodic-rviz

启动:roscore, rosrun rviz rviz

3.5 Gazebo仿真

安装:sudo apt-get install ros-kinetic-gazebo-ros-pkgs ros-kinetic-gazebo-ros-control

启动:roscore,rosrun gazebo_ros gazebo

3.6 rosbag数据记录与回放

记录数据:

启动键盘控制乌龟例程所需的所有节点:

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key

查看在当前ROS系统中到底存在哪些话题:rostopic list -v

使用rosbag抓取这些话题的消息,并且打包成一个文件放置到指定文件夹中:

mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -a
//数据记录的命令,-a(all)参数意为记录所有发布的消息。

记录数据时可能会出现如下的警告提示:/use_sim_time set to true and no clock published. Still waiting for valid time...

表现出的现象是:暂停了,并没有进行数据的录制。解决方案如下:

#录制前
$ rosparam set /use_sim_time false
#播放时
$ rosparam set /use_sim_time true

回放数据:

info命令,可以查看数据记录文件的详细信息:rosbag info <your bagfile>

回放:rosbag play <your bagfile>

posted @ 2021-03-08 18:22  RecordMoment  阅读(262)  评论(0)    收藏  举报