1.创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_wc/src
catkin_init_workspace
创建完成后,在工作空间根目录下使用catkin_make命令编译整个工作空间
ca ~/catkin_ws
catkin_make(编译)
catkin_make install
2.设置环节变量
编译完成后,在devel文件夹中产生机构setup.*sh形式的环境变量设置脚本,使用source命令运行这些脚本文件,则工作空间中的环境变量可以生效
source devel/setup.bash (环境变量只对当前终端生效)
echo $ROS_PACKAGE_PATH 检查环境变量是否已经生效
环境变量对所有终端生效,在终端的配置文件中加入环境变量的设置:
echo "source catkin_ws/devel/setup.bash" >> ~/.bashrc
3.创建功能包
(ros自带的功能包是在/opt/ros/noetic/share目录下)
cd ~/catkin_ws/src
catkin_create_pkg learning_communication std_msgs rospy roscpp
回工作空间根目录下进行编译
4.查看功能包所放置的位置
rospack find learning_communication
5.rosxxx命令
rostopic
rostopic list
rostopic list -v
rosmsg
rosmsg show <消息类型>Person 查看自定义Person消息类型的详细描述
rosmsg list :列出所有的话题()
rosmsg package <包名>:列出指定 ROS 软件包中包含的所有消息类型
rosmsg packages <消息类型>:列出 ROS 系统中所有包含消息定义的软件包列表
rossrv
rosbag数据记录于回放
rosbag:数据记录与回放的功能包,搜集ROS系统运行时的消息数据,然后在离线状态下回放
记录数据
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
移动小乌龟,rostopic list -v查看ROS系统的话题,使用rosbag抓取这些话题的消息,并打包成一个文件放置到指定文件夹中:
mkdir ~/rosbagfiles
cd ~/rosbagfiles
rosbage record -a,记录数据,-a参数指记录所有发布的消息,Ctrl+c终止数据记录
生成.bag文件 ( 2023-08-19-10-54-20.bag)
回放数据
在rosbagfiles目录下启动终端:rosbag info <your bagfile> 查看数据记录文件的详细信息
rosbag play 2023-08-19-10-54-20.bag
6.编译功能包
ROS中的编译器使用的是CMake,编译规则通过功能包中的CMakeLists.txt文件设置,使用catkin命令创建功能包中会自动生成该文件。
include_directories:设置头文件的相对路径,
add_executable:设置编译的代码和生成的可执行文件
add_executable(publisher src/publisher.cpp)
target_link_libraries:用于设置链接库,配置可执行文件连接的库文件,第一个参数是可执行文件的名称,后面依次列出需要链接的库
target_link_libraries (publisher ${catkin_LIBRARIES})
add_dependencies:用于设置依赖,功能包对定义的与语言无关的消息类型动态产生消息代码 (无定义则不需要添加)
add_dependencies(publisher ${PROJECT_NAME}_generate_message_cpp)
cd ~/catkin_ws
catkin_make
编译生成的可执行文件放在/devel/lib/路径下
package.xlm文件内设置编译和运行所依赖的相关功能包
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
srv文件:添加配置:
package.xml:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
CMakeLists.txt:
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
add_message_files(
FILES
Person.msg
)
add_service_files(
FILES
AddTwoInt.srv
)
catkin_package(
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
)
generate_messages(
DEPENDENCIES
std_msgs
)
message_generation包不仅可以针对话题消息产生相应的代码,还可以根据服务消息的类型描述文件产生相应的代码。
功能包编译成功后,在服务的Server节点和Clinet节点的代码实现中就可以直接调用定义好的服务消息了
7.发现存在重名的功能包处理办法
方法一:若功能包不再需要,可直接删除
方法二:功能包需要,则重命名其中一个功能包;
在修改软件包名称后,确保在 ROS 工作空间中执行以下操作,以清除可能存在的构建和开发文件:catkin clean;
最后要重新构建和编译您的 ROS 工作空间,以确保修改后的软件包名称生效:catkin build
8.话题消息rosmsg 相关用法
rosmsg show <消息类型>Person 查看自定义Person消息类型的详细描述
rosmsg list :列出所有的话题()
rosmsg package <包名>:列出指定 ROS 软件包中包含的所有消息类型
rosmsg packages <消息类型>:列出 ROS 系统中所有包含消息定义的软件包列表
9.分布式多机通信
第一步:确定所有计算机处于同一网络,分别在计算机hcx-oc、raspi2使用ifconfig命令查看计算机的局域网if地址
第二步:分别在两台计算机系统的/etc/hosts文件中加入对方的IP地址和对应的计算机名
第三步:分别在两台计算机上使用ping命令测试网络是否联通
ping raspi2 ping hcx-pc
如果双向网络都畅通,说明底层网络的通信没有网络
第四步:选择一台计算机当作从机(raspi2),在从机使用如下命令设置ROS_MASTER_URI
export ROS_MASTER_URI+http://hcx-pc:11311 (设置只对当前终端生效)
将环境变量的设置加入终端的配置文件中
echo "export ROS_MASTER_URI+http://hcx-pc:11311" >> ~/.bashrc
10.launch启动文件
<launch>…</launch>:定义根元素
<node … />:启动文件的核心是启动ROS节点,采用<node>定义
<node pkg="package-name" type="executable-name" name="node-name">:
功能包名 可执行文件名称 节点运行名称
node中其它属性:
output = "screen":将节点的标准输出打印到终端屏幕,默认输出为日志文档
respawn="true":复位属性,该节点停止时,会自动重启,默认为false
required="true":必要节点,当该节点终止时,launch文件中的其它节点也别终止
ns=“namespace”:命名空间,为节点内的相对名称添加命令空间前缀
args="arguments":节点需要的输入参数
参数设置:
<param … />:parameter是ROS系统运行中的参数,存储在参数服务器中,每个活跃的节点可以通过ros::param:get()接口来获取parameter的值。
使用方法:<param name="output_frame" value="odom" />
系统中的参数的数量有很多,若一个一个设置会非常麻烦,采用另类参数<rosparam>加载方式
<rosparam file="$(find 2dnav_pr2)/config/costmap_common_params.yaml" command="load" ns="local_costmap">
将一个YAML格式文件中的参数全部加载到ROS参数服务器中,需设置command属性为“load” ,还可以选择命名空间“ns”
<arg… />:argument是launch文件内部的局部变量,仅限于launch文件使用
语法:<arg name="arg-name" default="arg-value"/>
launch文件中需要使用argument时,调用方式:
<param name="foo" value="$(arg arg-name)" />
<node name="node" pkg="package" type="executable" args="$(arg arg-name)"/>
<remap…/>:重映射机制:使用别人的功能包时,可能别人的功能包的接口不一定与我们的系统兼容,比如turtlebot的键盘控制节点发布的速度控制指令话题可能是 /turtlebot/cmd_vel,但是我们自己的机器人订阅的速度控制话题是 /cmd_vel,这时使用<remap>就可以将 /turtlebot/cmd_vel重映射为 /cmd_vel,我们的机器人就可以接收到速度控制指令:
<remap from=" /turtlebot/cmd_vel" to="/cdm_vel" />
<include…/>:嵌套复用,直接复用一个已有的launch文件中的内容,类似于C中的头文件包含。
<include file="$(dirname)/other.launch" />
11.TF工具
tf_monitor:打印TF树中所有坐标系的发布状态,也可以通过输入参数来查看知道坐标系之间的发布状态。
rosrun tf tf_monitor
rosrun tf tf_monitor <source_frame> <target_target>
tf_echo:工具的功能是查看指定坐标系之间的变换关系
rosrun tf tf_echo <source_frame> <target_target>
stat ice_transform_publisher:发布两个坐标系之间的静态坐标变换
rosrun tf stat ice_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
rosrun tf stat ice_transform_publisher x y z qx qy qz qw frame_id child_frame_id period_in_ms
以上两种命令格式,设置坐标的偏移参数和旋转参数:偏移参数使用相对于x,y,z三轴的坐标位移‘
旋转参数的第一种命令格式使用以弧度为单位的 yaw(绕z轴旋转的偏航角)、pitch(绕y轴旋转的俯仰角)、roll角度(绕x轴旋转的翻滚角);旋转参数的第二种命令格式使用四元数表达旋转角度
发布频率以ms为单位
在launch文件中使用方法如下:
<launch>
<node pkg="tf" type="static_transform_publisher" name="link1_broadcast" args = "1 0 0 0 0 0 1 link1_parent link1 100" />
</launch>
view_frams:可视化调试工具,显示TF树的信息,可以生成pdf文件
rosrun tf view_frames
之后使用 evince frames.pdf 查看生成的pdf文件
12.QT工具箱
rqt_console:日志输出工具,图形化显示和过滤ROS系统运行状态中的所有日志信息
rqt_graph:计算图可视化工具,图形化显示当前ROS系统中 的计算图
rqt_plot:数据绘图工具,二位数值曲线绘制工具,将需要显示的数据在xy坐标系中曲线描绘,然后再界面上方的Topic中输入需要显示的话题消息
rqt_reconfigure:可以在不重启系统的情况下,动态配置ROS系统终端参数,但该功能的使用需要在代码中设置参数的相关属性,从而支持动态配置。
启动:rosrun rqt_reconfigure rqt_reconfigure
13.rviz三维可视化平台
Add添加显示数据的插件
“Display Name”:填入一个唯一的名称,用来识别显示的数据。如要显示两个传感器的数据,添加两个Laser Scan类型的插件,命名为Laser_base和Laser_head。
左侧的“Displays”会列出已经添加的显示插件,设置插件属性,“Topic”属性重要,用来声明该显示插件所订阅的数据来源
14.Gazebo
启动:rosrun gazebo_ros gazebo
创建仿真环境:
1.直接插入模型:左侧模型列表,insert,选择需要的模型,放置在主显示区
2.Building Editor:ctrl+B、edit->building Editor