撰寫腳本,通過發布/joint_states話題改變機器人在Rviz中的關節角度
提問
為我寫一個改變關節base_spherical_center_high_joint角度的python腳本吧。適用于ROS2的humble
回答
下面是一個適用于 ROS 2 Humble 的 Python 腳本,它會以指定頻率持續發布 base_spherical_center_high_joint
的角度到 /joint_states
,從而驅動 robot_state_publisher
正常廣播 TF。
? publish_joint_angle.py
#!/usr/bin/env python3import rclpy
from rclpy.node import Node
from sensor_msgs.msg import JointState
from builtin_interfaces.msg import Time
import mathclass JointPublisher(Node):def __init__(self):super().__init__('joint_state_publisher_node')self.publisher_ = self.create_publisher(JointState, '/joint_states', 10)# Timer: 10Hzself.timer = self.create_timer(0.1, self.publish_joint_state)# Desired joint position (radians)self.joint_position = 1.5708 # 90 degreesdef publish_joint_state(self):msg = JointState()msg.header.stamp = self.get_clock().now().to_msg()msg.name = ['base_spherical_center_high_joint']msg.position = [self.joint_position]self.publisher_.publish(msg)self.get_logger().info(f'Publishing: {msg.name[0]} = {self.joint_position:.4f} rad')def main(args=None):rclpy.init(args=args)node = JointPublisher()rclpy.spin(node)node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()
? 使用說明:
- 保存為
publish_joint_angle.py
。 - 給腳本加執行權限:
chmod +x publish_joint_angle.py
- 運行腳本(建議在 ROS2 工作空間中):
ros2 run <your_package_name> publish_joint_angle
或在獨立目錄中運行:
python3 publish_joint_angle.py
需要我幫你把它打包成 ROS2 可執行節點(添加到 setup.py
和 entry_points
)嗎?
繼續提問
可以幫我添加。直接在這個基礎上修改:
setup(
name=package_name,
version=‘0.0.0’,
packages=find_packages(exclude=[‘test’]),
# data_files=[
# (‘share/ament_index/resource_index/packages’,
# [‘resource/’ + package_name]),
# (‘share/’ + package_name, [‘package.xml’]),
# ],
data_files = data_files_list,
install_requires=[‘setuptools’],
zip_safe=True,
maintainer=‘usv-6081’,
maintainer_email=‘usv-6081@todo.todo’,
description=‘TODO: Package description’,
license=‘TODO: License declaration’,
tests_require=[‘pytest’],
entry_points={
‘console_scripts’: [
‘hello_node = control_planner.hello_node:main’,
‘usv_Simulation = control_planner.usvSimV2:main’,
‘keyboard_interaction = control_planner.keyboard_interaction:main’,
],
},
)
回答
當然可以!你只需要將新的腳本添加到 entry_points['console_scripts']
列表中,并確保你的 Python 文件(如 publish_joint_angle.py
)位于包內模塊路徑 control_planner/
下,并包含 main()
函數。
? 修改后的 setup.py
示例(新增 publish_joint_angle
入口):
setup(name=package_name,version='0.0.0',packages=find_packages(exclude=['test']),data_files=data_files_list,install_requires=['setuptools'],zip_safe=True,maintainer='usv-6081',maintainer_email='usv-6081@todo.todo',description='TODO: Package description',license='TODO: License declaration',tests_require=['pytest'],entry_points={'console_scripts': ['hello_node = control_planner.hello_node:main','usv_Simulation = control_planner.usvSimV2:main','keyboard_interaction = control_planner.keyboard_interaction:main','publish_joint_angle = control_planner.publish_joint_angle:main', # 新增這一行],},
)
? 注意事項:
-
publish_joint_angle.py
文件要放在control_planner/
目錄中(和其他.py
文件一樣)。 -
文件中必須包含:
if __name__ == '__main__':main()
并有
main()
函數定義。 -
別忘了在工作區根目錄執行構建命令:
colcon build source install/setup.bash
然后你就可以直接運行這個腳本:
ros2 run control_planner publish_joint_angle
需要我幫你檢查 publish_joint_angle.py
是否需要加入 __init__.py
或補充模塊結構嗎?
結果
成功