ROS 程序打包

ROS1 程序打包

1. 修改 CMakeLists.txt

在需要打包的功能包的CMakeLists.txt 添加,

# Mark executables and/or libraries for installation
install(TARGETS xxxx
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

2. 安装打包工具

依赖于 bloom 和 fakeroot 两个包

sudo apt-get install python-bloom fakeroot

3. 打包

在需要打包的功能包目录下运行

bloom-generate rosdebian --os-name ubuntu --ros-distro melodic

最后的参数是你的ros版本,运行成功后将在当前目录下生成一个DEBIAN目录。如果运行出错,则看步骤4。

运行成功基础上运行

fakeroot debian/rules binary

运行成功后,则会在上一层目录下生成 .deb文件 ,安装该文件只需要

sudo dpkg -i xxxxx.deb

4. 功能包相互依赖关系解决

对于多个自定义ros功能包,其中存在相互依赖的关系,必须要安装依赖的功能包例如,功能包a调用了功能包b的功能,那么必须安装功能包b,才能够正确打包功能包a。

4.1 安装功能包b
sudo dpkg -i ros-xxx-b-xxxx.deb
4.2 安装功能包b

创建 ~/.ros/rosdep.yaml 文件,假设功能包名称为 std_msgs

std_msgs:
  ubuntu: [ros-melodic-std-msgs]
4.2 修改 rosdep update 命令路径

尝试执行 rosdep update 命令,如果失败则需要按照rosdep update read operation time out 解决方法 所描述的进行修改,直到该命令正常工作。

4.3 添加自定义ros包目录

在 /etc/ros/rosdep/sources.list.d/ 下新建 50-my-default.list文件,添加内容如下

yaml file:///home/xxxx/.ros/rosdep.yaml

这个路径是上面创建的文件的路径,需要修改为自己的。

然后执行

rosdep update 

这一步是在系统中新添加默认ros功能包,在打包时就会找到。

4.4 正常打包其他功能包

这时候再打包功能包a,那么系统将会找到功能包b,并且正常打包。

ROS2 程序打包

ros2 程序打包的方法和ros1 基本一致,但是会出现几个功能包找不到的问题。因此采用和上文类似的方法,让系统找到对应的功能包。修改文件~/.ros/rosdep.yaml,添加如下内容,其中std_msgs为自己定义的部分,下面三个是缺失的部分。

std_msgs:
  ubuntu: [ros-melodic-std-msgs]
ament_cmake:
    ubuntu: [ros-dashing-ament-cmake]
ament_lint_auto:
    ubuntu: [ros-dashing-ament-lint-auto]
ament_lint_common:
    ubuntu: [ros-dashing-ament-lint-common]

重新执行

rosdep update 

然后按照ros1部分对功能包进行打包即可。

下面是一个简单的机器人走椭圆轨迹的ROS程序,使用C++编写。这个程序使用ROS中的移动基础功能包(move_base)来控制机器人的运动,同时使用ROS中的可视化工具(rviz)来可视化机器人的运动轨迹。 ```cpp #include <ros/ros.h> #include <geometry_msgs/Twist.h> #include <nav_msgs/Odometry.h> #include <tf/transform_datatypes.h> ros::Publisher cmd_vel_pub; ros::Subscriber odom_sub; double x = 0.0; double y = 0.0; double theta = 0.0; void odomCallback(const nav_msgs::Odometry::ConstPtr& msg) { x = msg->pose.pose.position.x; y = msg->pose.pose.position.y; geometry_msgs::Quaternion q = msg->pose.pose.orientation; tf::Quaternion quat(q.x, q.y, q.z, q.w); tf::Matrix3x3 mat(quat); double roll, pitch; mat.getRPY(roll, pitch, theta); } int main(int argc, char** argv) { ros::init(argc, argv, "ellipse_robot"); ros::NodeHandle nh; cmd_vel_pub = nh.advertise<geometry_msgs::Twist>("cmd_vel", 1); odom_sub = nh.subscribe("odom", 1, odomCallback); ros::Rate rate(10.0); while (nh.ok()) { double a = 1.0; double b = 0.5; double omega = 0.5; double dx = -a * sin(theta) * omega; double dy = b * cos(theta) * omega; geometry_msgs::Twist twist; twist.linear.x = dx; twist.linear.y = dy; twist.angular.z = omega; cmd_vel_pub.publish(twist); ros::spinOnce(); rate.sleep(); } return 0; } ``` 该程序订阅机器人的里程计信息(odom),并根据椭圆形轨迹的方程计算机器人的运动速度(线速度和角速度),最后发布运动指令(cmd_vel)给机器人。在ROS中,这个程序可以被打包成一个节点,并通过ROS系统的运行管理工具(roslaunch)启动。在启动程序之前,需要先启动机器人底盘驱动节点,以便让机器人能够接收运动指令并执行运动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值