WSL2下的ROS学习记录
安装
http://wiki.ros.org/cn/ROS/Tutorials
之前出现过安装rosdep还是哪个?
把我依赖给删掉了
sudo apt install ros-noetic-desktop-full
然后全部重装
莫名其妙遇到的roscd不到软件包问题
. ~/catkin_ws/devel/setup.bash
需要重新将这个工作空间添加到ROS环境中,source一下生成的配置文件
创建ROS消息和服务
msg和srv
- msg(消息):msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码。
- srv(服务):一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。
创建msg
mkdir msg
echo "int64 num" > msg/Num.msg
此时的文件目录有这些
不过还有关键的一步:我们要确保msg文件能被转换为C++、Python和其他语言的源代码。
打开package.xml
, 确保它包含以下两行且没有被注释。如果没有,添加进去:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
确实是被注释掉了
在构建时,其实只需要message_generation
,而在运行时,我们只需要message_runtime
。
在CMakeLists.txt
文件中,为已经存在里面的find_package
调用添加message_generation
依赖项,这样就能生成消息了。直接将message_generation
添加到COMPONENTS
列表中即可,如下所示:
# 不要直接复制这一大段,只需将message_generation加在括号闭合前即可
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
还要确保导出消息的运行时依赖关系:
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)
找到如下代码块:
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
删除#
符号来取消注释,然后将Message*.msg
替换为你的.msg文件名,就像下边这样:
add_message_files(
FILES
Num.msg
)
手动添加.msg文件后,我们要确保CMake知道何时需要重新配置项目。
现在必须确保generate_messages()
函数被调用:
取消下面几行的注释:
generate_messages(
DEPENDENCIES
std_msgs
)
使用rosmsg
以上就是创建消息的所有步骤。让我们通过rosmsg show
命令看看ROS能否识别它。
用法:
$ rosmsg show [message type]
示例:
$ rosmsg show beginner_tutorials/Num
你会看到:
int64 num
string first_name
string last_name
uint8 age
uint32 score
使用srv
创建srv
$ roscd beginner_tutorials
$ mkdir srv
我们将从另一个包复制现有的srv定义,而不是手动创建新的srv。roscp
是一个实用的命令行工具,用于将文件从一个包复制到另一个包。
用法:
$ roscp [package_name] [file_to_copy_path] [copy_path]
现在我们可以从rospy_tutorials包中复制一个服务:
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
使用rossrv
以上就是创建服务的所有步骤。让我们通过rossrv show
命令看看ROS能否识别它。
用法
$ rossrv show <service type>
示例:
$ rossrv show beginner_tutorials/AddTwoInts
你会看到:
int64 a
int64 b
---
int64 sum
总结一下到目前为止我们接触过的一些命令:
- rospack = ros+pack(age) : provides information related to ROS packages
- roscd = ros+cd : changes directory to a ROS package or stack
- rosls = ros+ls : lists files in a ROS package
- roscp = ros+cp : copies files from/to a ROS package
- rosmsg = ros+msg : provides information related to ROS message definitions
- rossrv = ros+srv : provides information related to ROS service definitions
- catkin_make : makes (compiles) a ROS package
- rosmake = ros+make : makes (compiles) a ROS package (if you're not using a catkin workspace)
创建个发布者节点
#include "ros/ros.h"
ros/ros.h
是一个很便利的include
,它包括了使用ROS系统中最常见的公共部分所需的全部头文件。
省略建立listener talker等等
大概就是复制粘贴之后,把
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
add_executable(add_two_ints_server src/add_two_ints_server.cpp)
target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
add_dependencies(add_two_ints_server beginner_tutorials_gencpp)
add_executable(add_two_ints_client src/add_two_ints_client.cpp)
target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
add_dependencies(add_two_ints_client beginner_tutorials_gencpp)
加进去
然后catkin_make之后source 一下就行
rosrun beginner_tutorials add_two_ints_server #运行服务
rosrun beginner_tutorials add_two_ints_client 1 3 #运行客户端并带上参数
URDF
只在visual标签下 mesh 我们的文件名
而collision里也可以加上模型,但是要计算碰撞模型时计算量有点大,所以只用了个圆柱体来模拟碰撞
xacro模型文件
Rviz
rosrun tf static_transform_publisher 0.0 0.0 0.0 0.0 0.0 0.0 map xxx 100
坐标系问题
由于wsl2 Ubuntu20版本的Rviz加载不出来模型,有网友说18可以,实际测试22的ROS1 需要编译源码才能用,所以直接使用18版本,rqt和rviz基本上没有问题,除了上述的坐标系炸了、joint_state需要apt下载。
MoveIt!
ROS Control
完善模型
mass小的原因是怕gazebo飞了,跑不动
transmission传动
mechanicalReduction 减速比
这个框图要注意
出现的问题
[ERROR][1679406158.191718416, 860.079000000]: Unable to identify any set of controllers that can actuate the specified joints: [ joint_1 joint_2 joint_3 joint_4 joint_5 joint_6 ][ERROR] [1679406158.191764407, 860.079000000]: Known controllers and their joints:
[ERROR][1679406158.191793010, 860.079000000]: Apparently trajectory initialization failed
how to solve?