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>
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>
浙公网安备 33010602011771号